2022年2022年控制台窗口的文本界面控 .pdf





《2022年2022年控制台窗口的文本界面控 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年控制台窗口的文本界面控 .pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-1-控制台窗口界面的编程控制丁有和所属类别:C&C+开发工具:Visual C+6.0 文章难度级别:摘要:文本(字符)界面的控制台应用程序开发是深入学习C+、掌握交互系统的实现方法的最简单的一种手段。然而,Visual C+的 C+专用库却没有TC 所支持的文本(字符)屏幕控制函数,为此本文从一般控制步骤、控制台窗口操作、文本(字符)控制、滚动和移动、光标、键盘和鼠标等几个方面讨论控制台窗口界面的编程控制方法。最近几年,越来越多的高校开设了C+语言这门课程。我们知道,学习一门语言必须与其开发环境相结合,才能在学习与应用这两方面相得益彰。在众多C+开发工具中,由于Microsoft 本身的独
2、特优势,选用Visual C+已越来越被众多学习者所接受。显然,现今如果还再把已是昨日黄花的TC 作为开发环境的话,不仅没有必要,而且也不利于向Windows 应用程序开发的过渡。然而,Visual C+的 C+专用库却没有TC 所支持的文本屏幕(控制台窗口)控制函数(相应的头文件是conio.h)。这必然给C+学习者在文本界面设计和编程上带来诸多不便。要知道,文本界面设计是一种深入学习C+、掌握交互系统的实现方法的最简单的一种手段,它不像C+的 Windows 图形界面应用程序,涉及知识过多。为此,本文来讨论在Visual C+6.0 开发环境中,如何编写具有美观清晰的控制台窗口界面的C+应
3、用程序。一、概述所谓控制台应用程序,就是指那些需要与传统DOS 操作系统保持某种程序的兼容,同时又不需要为用户提供完善界面的程序。简单地讲,就是指在Windows 环境下运行的DOS 程序。一旦C+控制台应用程序在Windows 9x/NT/XP 操作系统中运行后,就会弹出一个窗口。例如下列过程:(1)单击 Visual C+标准工具栏上的“New Text File”按钮,打开一个新的文档窗口。(2)选择 File|Save 菜单或按快捷键Ctrl+S 或单击标准工具栏的Save 按钮,弹出“保存为”文件对话框。将文件名为“Hello.cpp”(注意扩展名.cpp 不能省略)。(3)在文档窗
4、口中输入下列代码:#include void main()coutHello,Console!endl;(4)单击小型编译工具栏中的“Build”按钮或按F7 键,系统出现一个对话框,询问是否将此项目的工作文件夹设定源文件所在的文件夹,单击是按钮,系统开始编译。(5)单击小型编译工具栏中的“Execute Program”按钮或按Ctrl+F5 键,运行刚才的程序。(6)程序运行后,弹出下图的窗口。这就是控制台窗口,与传统的DOS 屏幕窗口相比最主要的区别有:(1)默认的控制台窗口有系统菜单和标题,它是一个内存缓冲区窗口,缓冲区大小取决于Windows 操作系统的分配;而DOS 屏幕是一种物理
5、窗口,不具有Windows 窗口特性,其大小取决于ROM BIOS 分配的内存空间。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 15 页 -2-(2)控制台窗口的文本操作是调用低层的Win32 APIs,而 DOS 屏幕的文本操作是通过调用BIOS 的 16(10h)中断而实现的。(3)默认的控制台窗口可以接收键盘和鼠标的输入信息,设备驱动由Windows 管理,而 DOS 屏幕窗口接收鼠标时需要调用 33h 中断,且鼠标设备驱动程序由自己安装。二、控制台文本窗口的一般控制步骤在 Visual C+6.0 中,控制台窗口界面的一般编程控制步骤如下:(1)调用 GetStdHa
6、ndle 获取当前的标准输入(STDIN)和标准输出(STDOUT)设备句柄。函数原型为:HANDLE GetStdHandle(DWORD nStdHandle);其中,nStdHandle 可以是STD_INPUT_HANDLE(标准输入设备句柄)、STD_OUTPUT_HANDLE(标准输出设备句柄)和STD_ERROR_HANDLE(标准错误句柄)。需要说明的是,“句柄”是 Windows 最常用的概念。它通常用来标识Windows 资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为 Windows 系统内部表的索引值
7、来使用的。(2)调用相关文本界面控制的API 函数。这些函数可分为三类。一是用于控制台窗口操作的函数(包括窗口的缓冲区大小、窗口前景字符和背景颜色、窗口标题、大小和位置等);二是用于控制台输入输出的函数(包括字符属性操作函数);其他的函数并为最后一类。(3)调用 CloseHandle()来关闭输入输出句柄。注意,在程序中还必须包含头文件windows.h。下面看一个程序:#include#include#include void main()HANDLE hOut;hout=GetStdHandle(STD_OUTPUT_HANDLE);/获取标准输出设备句柄CONSOLE_SCREEN_B
8、UFFER_INFO bInfo;/窗口信息GetConsoleScreenBufferInfo(hOut,&bInfo);/获取窗口信息printf(nnThe soul selects her own society,n);printf(Then shuts the door;n);printf(On her devine majorityn);printf(Obtrude no more.nn);_getch();COORD pos=0,0;FillConsoleOutputCharacter(hOut,bInfo.dwSize.X*bInfo.dwSize.Y,pos,NULL);/向
9、窗口中填充字符以获得清屏的效果CloseHandle(hOut);/关闭标准输出设备句柄 程序中,COORD 和 CONSOLE_SCREEN_BUFFER_ INFO是 wincon.h定义的控制台结构体类型,其原型如下:/坐标结构体typedef struct _COORD SHORT X;SHORT Y;COORD;/控制台窗口信息结构体名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 15 页 -3-typedef struct _CONSOLE_SCREEN_BUFFER_INFO COORD dwSize;/缓冲区大小COORD dwCursorPosition;/当前
10、光标位置WORD wAttributes;/字符属性SMALL_RECT srWindow;/当前窗口显示的大小和位置COORD dwMaximumWindowSize;/最大的窗口缓冲区大小 CONSOLE_SCREEN_BUFFER_INFO;还需要说明的是,虽然在C+中,iostream.h 定义了 cin 和 cout 的标准输入和输出流对象。但它们只能实现基本的输入输出操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h 和 conio.h 友好相处,因为 iostream.h 和它们是 C+两套不同的输入输出操作方式,使用时要特别注意。三、控制台窗口操作用于控制台窗口
11、操作的API 函数如下:GetConsoleScreenBufferInfo 获取控制台窗口信息GetConsoleTitle 获取控制台窗口标题ScrollConsoleScreenBuffer 在缓冲区中移动数据块SetConsoleScreenBufferSize 更改指定缓冲区大小SetConsoleTitle 设置控制台窗口标题SetConsoleWindowInfo 设置控制台窗口信息此外,还有窗口字体、显示模式等控制函数,这里不再细说。下列举一个示例,程序如下:#include#include#include void main()HANDLE hOut=GetStdHandle
12、(STD_OUTPUT_HANDLE);/获取标准输出设备句柄CONSOLE_SCREEN_BUFFER_INFO bInfo;/窗口缓冲区信息 GetConsoleScreenBufferInfo(hOut,bInfo);/获取窗口缓冲区信息char strTitle255;GetConsoleTitle(strTitle,255);/获取窗口标题printf(当前窗口标题是:%sn,strTitle);_getch();SetConsoleTitle(控制台窗口操作);/获取窗口标题_getch();COORD size=80,25;SetConsoleScreenBufferSize(h
13、Out,size);/重新设置缓冲区大小_getch();SMALL_RECT rc=0,0,80-1,25-1;/重置窗口位置和大小SetConsoleWindowInfo(hOut,true,&rc);CloseHandle(hOut);/关闭标准输出设备句柄 需要说明的是,控制台窗口的原点坐标是(0,0),而最大的坐标是缓冲区大小减1,例如当缓冲区大小为80*25 时,其最大的坐标是(79,24)。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 15 页 -4-四、文本(字符)控制1 文本属性操作与 DOS 字符相似,控制台窗口中的字符也有相应的属性。这些属性分为:文本的前
14、景色、背景色和双字节字符集(DBCS)属性三种。事实上,我们最关心是文本颜色,这样可以构造出美观的界面。颜色属性都是一些预定义标识:FOREGROUND_BLUE 蓝色FOREGROUND_GREEN 绿色FOREGROUND_RED 红色FOREGROUND_INTENSITY 加强BACKGROUND_BLUE 蓝色背景BACKGROUND_GREEN 绿色背景BACKGROUND_RED 红色背景BACKGROUND_INTENSITY 背景色加强COMMON_LVB_REVERSE_VIDEO 反色与文本属性相关的主要函数有:BOOL FillConsoleOutputAttribut
15、e(/填充字符属性HANDLE hConsoleOutput,/句柄WORD wAttribute,/文本属性DWORD nLength,/个数COORD dwWriteCoord,/开始位置LPDWORD lpNumberOfAttrsWritten/返回填充的个数);BOOL SetConsoleTextAttribute(/设置 WriteConsole等函数的字符属性HANDLE hConsoleOutput,/句柄WORD wAttributes /文本属性);BOOL WriteConsoleOutputAttribute(/在指定位置处写属性HANDLE hConsoleOutp
16、ut,/句柄CONST WORD*lpAttribute,/属性DWORD nLength,/个数COORD dwWriteCoord,/起始位置LPDWORD lpNumberOfAttrsWritten /已写个数);另外,获取当前控制台窗口的文本属性是通过调用函数GetConsoleScreenBufferInfo后,在 CONSOLE_SCREEN_ BUFFER_INFO结构成员 wAttributes中得到。2 文本输出文本输出函数有:BOOL FillConsoleOutputCharacter(/填充指定数据的字符HANDLE hConsoleOutput,/句柄TCHAR c
17、Character,/字符DWORD nLength,/字符个数COORD dwWriteCoord,/起始位置LPDWORD lpNumberOfCharsWritten /已写个数);名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 15 页 -5-BOOL WriteConsole(/在当前光标位置处插入指定数量的字符HANDLE hConsoleOutput,/句柄CONST VOID*lpBuffer,/字符串DWORD nNumberOfCharsToWrite,/字符个数LPDWORD lpNumberOfCharsWritten,/已写个数LPVOID lpRese
18、rved /保留);BOOL WriteConsoleOutput(/向指定区域写带属性的字符HANDLE hConsoleOutput,/句柄CONST CHAR_INFO*lpBuffer,/字符数据区COORD dwBufferSize,/数据区大小COORD dwBufferCoord,/起始坐标PSMALL_RECT lpWriteRegion /要写的区域);BOOL WriteConsoleOutputCharacter(/在指定位置处插入指定数量的字符HANDLE hConsoleOutput,/句柄LPCTSTR lpCharacter,/字符串DWORD nLength,/
19、字符个数COORD dwWriteCoord,/起始位置LPDWORD lpNumberOfCharsWritten /已写个数);可 以 看 出:WriteConsoleOutput函 数 功 能 相 当 于SetConsoleTextAttribute和WriteConsole的 功 能。而WriteConsoleOutputCharacter 函数相当于SetConsoleCursorPosition(设置光标位置)和 WriteConsole 的功能。不过在具体使用要注意它们的区别。3 文本操作示例下面看一个示例程序:#include HANDLE hOut;void ShadowWi
20、ndowLine(char*str);/在具有阴影效果的窗口中显示一行字符,窗口为居中显示void DrawBox(bool bSingle,SMALL_RECT rc);/绘制边框void main()hOut=GetStdHandle(STD_OUTPUT_HANDLE);/获取标准输出设备句柄SetConsoleOutputCP(437);/设置代码页ShadowWindowLine(Display a line of words,and center the window with shadow.);CloseHandle(hOut);/关闭标准输出设备句柄 void ShadowWi
21、ndowLine(char*str)CONSOLE_SCREEN_BUFFER_INFO bInfo;/窗口缓冲区信息GetConsoleScreenBufferInfo(hOut,&bInfo);/获取窗口缓冲区信息/计算显示窗口大小和位置int x1,y1,x2,y2,chNum=strlen(str);x1=(bInfo.dwSize.X-chNum)/2-2;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 15 页 -6-y1=bInfo.dwSize.Y/2-2;x2=x1+chNum+4;y2=y1+5;WORD att1=BACKGROUND_INTENSITY;/
22、阴影属性WORD att0=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_BLUE;/文本属性WORD attText=FOREGROUND_RED|FOREGROUND_INTENSITY;/文本属性/设置阴影COORD posShadow=x1+1,y1+1,posText=x1,y1;for(int i=0;i5;i+)FillConsoleOutputAttribute(hOut,att1,chNum+4,posShadow,NULL);pos
23、Shadow.Y+;/填充窗口背景for(i=0;i5;i+)FillConsoleOutputAttribute(hOut,att0,chNum+4,posText,NULL);posText.Y+;/写文本和边框posText.X=x1+2;posText.Y=y1+2;WriteConsoleOutputCharacter(hOut,str,strlen(str),posText,NULL);SMALL_RECT rc=x1,y1,x2-1,y2-1;DrawBox(true,rc);SetConsoleTextAttribute(hOut,bInfo.wAttributes);/恢复原
24、来的属性 void DrawBox(bool bSingle,SMALL_RECT rc)char chBox6;if(bSingle)chBox0=(char)0 xda;/左上角点chBox1=(char)0 xbf;/右上角点chBox2=(char)0 xc0;/左下角点chBox3=(char)0 xd9;/右下角点chBox4=(char)0 xc4;/水平chBox5=(char)0 xb3;/坚直 else chBox0=(char)0 xc9;/左上角点chBox1=(char)0 xbb;/右上角点chBox2=(char)0 xc8;/左下角点chBox3=(char)0
25、 xbc;/右下角点chBox4=(char)0 xcd;/水平chBox5=(char)0 xba;/坚直 COORD pos=rc.Left,rc.Top;名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 15 页 -7-WriteConsoleOutputCharacter(hOut,&chBox0,1,pos,NULL);for(pos.X=rc.Left+1;pos.Xrc.Right;pos.X+)WriteConsoleOutputCharacter(hOut,&chBox4,1,pos,NULL);pos.X=rc.Right;WriteConsoleOutputC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年控制台窗口的文本界面控 2022 控制台 窗口 文本 界面

限制150内