| |
|
| |
 |
|
控制台窗口界面控制设计(一)
|
|
| 日期:2005-7-18 9:13:35 来源:易特网络技术 编辑:黑鹰 点击: |
摘要: 文本界面的控制台应用程序开发是深入学习c++、掌握交互系统的实现方法的最简单的一种手段。然而,visual c++的c++专用库却没有tc所支持的文本(字符)屏幕控制函数,为此本系列文章从一般控制步骤、控制台窗口操作、文本(字符)控制、滚动和移动、光标、键盘和鼠标等几个方面讨论控制台窗口界面的编程控制方法。
在众多c++开发工具中,由于microsoft本身的独特优势,选用visual c++已越来越被众多学习者所接受。显然,现今如果还再把tc作为开发环境的话,不仅没有必要,而且也不利于向windows应用程序开发的过渡。然而,visual c++的c++专用库却没有tc所支持的文本屏幕(控制台窗口)控制函数(相应的头文件是conio.h)。这必然给c++学习者在文本界面设计和编程上带来诸多不便。要知道,文本界面设计是一种深入学习c++、掌握交互系统的实现方法的最简单的一种手段,它不像c++的windows图形界面应用程序,涉及知识过多。为此,本系列文章来讨论在visual c++ 6.0开发环境中,如何编写具有美观清晰的控制台窗口界面的c++应用程序。
一、概述
所谓控制台应用程序,就是指那些需要与传统dos操作系统保持某种程序的兼容,同时又不需要为用户提供完善界面的程序。简单地讲,就是指在windows环境下运行的dos程序。一旦c++控制台应用程序在windows 9x/nt/2000操作系统中运行后,就会弹出一个窗口。例如下列过程:
单击visual c++标准工具栏上的“new text file”按钮,打开一个新的文档窗口。
选择file | save菜单或按快捷键ctrl+s或单击标准工具栏的save按钮,弹出“保存为”文件对话框。将文件名为“hello.cpp” (注意扩展名.cpp不能省略)。
在文档窗口中输入下列代码:
#include void main() { cout<<"hello, console!"< } | 单击小型编译工具栏中的“build”按钮或按f7键,系统出现一个对话框,询问是否将此项目的工作文件夹设定源文件所在的文件夹,单击[是]按钮,系统开始编译。
单击小型编译工具栏中的“execute program”按钮或按ctrl+f5键,运行刚才的程序。
程序运行后,弹出下图的窗口。
这就是控制台窗口,与传统的dos屏幕窗口相比最主要的区别有:
(1) 默认的控制台窗口有系统菜单和标题,它是一个内存缓冲区窗口,缓冲区大小取决于windows操作系统的分配;而dos屏幕是一种物理窗口,不具有windows窗口特性,其大小取决于rom bios分配的内存空间。
(2) 控制台窗口的文本操作是调用低层的win32 apis,而dos屏幕的文本操作是通过调用bios的16(10h)中断而实现的。
(3) 默认的控制台窗口可以接收键盘和鼠标的输入信息,设备驱动由windows管理,而dos屏幕窗口接收鼠标时需要调用33h中断,且鼠标设备驱动程序由自己安装。
二、控制台文本窗口的一般控制步骤
在visual c++ 6.0中,控制台窗口界面的一般编程控制步骤如下:
调用getstdhandle获取当前的标准输入(stdin)和标准输出(stdout)设备句柄。函数原型为:
handle getstdhandle( dword nstdhandle );
其中,nstdhandle可以是std_input_handle(标准输入设备句柄)、std_output_handle(标准输出设备句柄)和std_error_handle(标准错误句柄)。需要说明的是,“句柄”是windows最常用的概念。它通常用来标识windows资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为windows系统内部表的索引值来使用的。
调用相关文本界面控制的api函数。这些函数可分为三类。一是用于控制台窗口操作的函数(包括窗口的缓冲区大小、窗口前景字符和背景颜色、窗口标题、大小和位置等);二是用于控制台输入输出的函数(包括字符属性操作函数);其他的函数并为最后一类。
调用closehandle()来关闭输入输出句柄。
注意,在程序中还必须包含头文件windows.h。下面看一个程序:
#include #include #include void main() { handle hout; hout = getstdhandle(std_output_handle); // 获取标准输出设备句柄 console_screen_buffer_info binfo; // 窗口信息 getconsolescreenbufferinfo(hout, &binfo ); // 获取窗口信息 printf("\n\nthe soul selects her own society,\n"); printf("then shuts the door;\n"); printf("on her devine majority\n"); printf("obtrude no more.\n\n"); _getch(); coord pos = {0, 0}; fillconsoleoutputcharacter(hout, ' ', binfo.dwsize.x * binfo.dwsize.y, pos, null); // 向窗口中填充字符以获得清屏的效果 closehandle(hout); // 关闭标准输出设备句柄 }
| 程序中,coord和console_screen_buffer_ info是wincon.h定义的控制台结构体类型,其原型如下:
// 坐标结构体 typedef struct _coord { short x; short y; } coord;
// 控制台窗口信息结构体 typedef struct _console_screen_buffer_info { coord dwsize; // 缓冲区大小 coord dwcursorposition; // 当前光标位置 word wattributes; // 字符属性 small_rect srwindow; // 当前窗口显示的大小和位置 coord dwmaximumwindowsize; // 最大的窗口缓冲区大小 } console_screen_buffer_info ; | 还需要说明的是,虽然在c++中,iostream.h定义了cin和cout的标准输入和输出流对象。但它们只能实现基本的输入输出操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h和conio.h友好相处,因为iostream.h和它们是c++两套不同的输入输出操作方式,使用时要特别注意。
|
上一篇:c++运算符重载探讨
下一篇:c++中的健壮指针和资源管理
[发送给好友] [打印本页] [关闭窗口] [返回顶部] 转载请注明来源:http://www.iyit.net |
|
| 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
| 责任编辑: 黑鹰 |
投稿作者: 易特网络 |
| 信息来源: 易特网络技术 |
录入时间: 2005-7-18 9:13:35 |
| 浏览次数: |
投稿信箱: shtghy@163.com |
|
|
|
|