2022年2022年控制台窗口界面编程控制 .pdf

上传人:C****o 文档编号:39660244 上传时间:2022-09-07 格式:PDF 页数:18 大小:122.47KB
返回 下载 相关 举报
2022年2022年控制台窗口界面编程控制 .pdf_第1页
第1页 / 共18页
2022年2022年控制台窗口界面编程控制 .pdf_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《2022年2022年控制台窗口界面编程控制 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年控制台窗口界面编程控制 .pdf(18页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、控制台窗口界面编程控制摘要一、概述二、控制台文本窗口的一般控制步骤三、控制台窗口操作四、文本属性操作五、文本输出六、文本操作示例七、滚动和移动八、光标操作九、读取键盘信息十、读取鼠标信息十一、结语摘要单击右键可弹出快捷菜单操作文本界面的控制台应用程序开发是深入学习C+、掌握交互系统的实现方法的最简单的一种手段。然而,Visual C+的 C+专用库却没有TC 所支持的文本(字符)屏幕控制函数,为此本系列文章从一般控制步骤、控制台窗口操作、文本(字符)控制、滚动和移动、光 标、键盘和鼠标等几个方面讨论控制台窗口界面的编程控制方法。在众多 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/2000操作系统中运行后,就会弹出一个窗口。例如下列过程:单击 Visual C+标准工具栏上的“New Text File”按钮,打开一个新的文档窗口。选择 File|Save 菜单或按快捷键Ctrl+S 或单击标准工具栏的Save按钮,弹出“保存为”文件对话框。将文件名为“Hello.cpp”(注意扩展名.cpp 不能省略)。名师资料总结-精

4、品资料欢迎下载-名师精心整理-第 1 页,共 18 页 -在文档窗口中输入下列代码:#include void main()coutHello,Console!单击小型编译工具栏中的“Build”按钮或按F7 键,系统出现一个对话框,询问是否将此项目的工作文件夹设定源文件所在的文件夹,单击是按钮,系统开始编译。单击小型编译工具栏中的“Execute Program”按钮或按Ctrl+F5 键,运行刚才的程序。程序运行后,弹出下图的窗口。这就是控制台窗口,与传统的DOS 屏幕窗口相比最主要的区别有:(1)默认的控制台窗口有系统菜单和标题,它是一个内存缓冲区窗口,缓冲区大小取决于Windows 操

5、作系统的分配;而DOS 屏幕是一种物理窗口,不具有Windows 窗口特性,其大小取决于 ROM BIOS 分配的内存空间。(2)控制台窗口的文本操作是调用低层的Win32 APIs,而 DOS 屏幕的文本操作是通过调用BIOS 的 16(10h)中断而实现的。(3)默认的控制台窗口可以接收键盘和鼠标的输入信息,设备驱动由Windows 管理,而 DOS屏幕窗口接收鼠标时需要调用33h 中断,且鼠标设备驱动程序由自己安装。二、控制台文本窗口的一般控制步骤单击右键可弹出快捷菜单操作在 Visual C+6.0 中,控制台窗口界面的一般编程控制步骤如下:调用 GetStdHandle 获取当前的标

6、准输入(STDIN)和标准输出(STDOUT)设备句柄。函数原型为:HANDLE GetStdHandle(DWORD nStdHandle);其 中,nStdHandle可 以 是STD_INPUT_HANDLE(标 准 输 入 设 备 句 柄)、STD_OUTPUT_HANDLE(标准输出设备句柄)和 STD_ERROR_HANDLE(标准错误句柄)。需要说明的是,“句柄”是 Windows 最常用的概念。它通常用来标识Windows 资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows 系统内部表的索引值来使

7、用的。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 18 页 -调用相关文本界面控制的API 函数。这些函数可分为三类。一是用于控制台窗口操作的函数(包括窗口的缓冲区大小、窗口前景字符和背景颜色、窗口标题、大小和位置等);二是用于控制台输入输出的函数(包括字符属性操作函数);其他的函数并为最后一类。调用 CloseHandle()来关闭输入输出句柄。注意,在程序中还必须包含头文件windows.h。下面看一个程序:#include#include#include void main()HANDLE hOut;hout=GetStdHandle(STD_OUTPUT_HANDLE

8、);/获取标准输出设备句柄CONSOLE_SCREEN_BUFFER_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.

9、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;/当前光标位置名师资料总

10、结-精品资料欢迎下载-名师精心整理-第 3 页,共 18 页 -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#i

12、nclude void main()HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);/获取标准输出设备句柄CONSOLE_SCREEN_BUFFER_INFO bInfo;/窗口缓冲区信息GetConsoleScreenBufferInfo(hOut,bInfo);/获取窗口缓冲区信息char strTitle255;GetConsoleTitle(strTitle,255);/获取窗口标题printf(当前窗口标题是:%sn,strTitle);_getch();SetConsoleTitle(控制台窗口操作);/获取窗口标题_getch();COOR

13、D size=80,25;SetConsoleScreenBufferSize(hOut,size);/重新设置缓冲区大小名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 18 页 -_getch();SMALL_RECT rc=0,0,80-1,25-1;/重置窗口位置和大小SetConsoleWindowInfo(hOut,true,&rc);CloseHandle(hOut);/关闭标准输出设备句柄 需要说明的是,控制台窗口的原点坐标是(0,0),而最大的坐标是缓冲区大小减1,例如当缓冲区大小为80*25 时,其最大的坐标是(79,24)。四、文本属性操作单击右键可弹出快捷菜

14、单操作与 DOS 字符相似,控制台窗口中的字符也有相应的属性。这些属性分为:文本的前景色、背景色和双字节字符集(DBCS)属性三种。事实上,我们最关心是文本颜色,这样可以构造出美观的界面。颜色属性都是一些预定义标识:FOREGROUND_BLUE 蓝色FOREGROUND_GREEN 绿色FOREGROUND_RED 红色FOREGROUND_INTENSITY 加强BACKGROUND_BLUE 蓝色背景BACKGROUND_GREEN 绿色背景BACKGROUND_RED 红色背景BACKGROUND_INTENSITY 背景色加强COMMON_LVB_REVERSE_VIDEO 反色与文

15、本属性相关的主要函数有:BOOL FillConsoleOutputAttribute(/填充字符属性HANDLE hConsoleOutput,/句柄WORD wAttribute,/文本属性DWORD nLength,/个数COORD dwWriteCoord,/开始位置LPDWORD lpNumberOfAttrsWritten/返回填充的个数);BOOL SetConsoleTextAttribute(/设置 WriteConsole 等函数的字符属性HANDLE hConsoleOutput,/句柄WORD wAttributes/文本属性);BOOL WriteConsoleOut

16、putAttribute(/在指定位置处写属性HANDLE hConsoleOutput,/句柄名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 18 页 -CONST WORD*lpAttribute,/属性DWORD nLength,/个数COORD dwWriteCoord,/起始位置LPDWORD lpNumberOfAttrsWritten/已写个数);另外,获取当前控制台窗口的文本属性是通过调用函数GetConsoleScreenBufferInfo后,在CONSOLE_SCREEN_ BUFFER_INFO结构成员wAttributes 中得到。五、文本输出单击右键可

17、弹出快捷菜单操作文本输出函数有:BOOL FillConsoleOutputCharacter(/填充指定数据的字符HANDLE hConsoleOutput,/句柄TCHAR cCharacter,/字符DWORD nLength,/字符个数COORD dwWriteCoord,/起始位置LPDWORD lpNumberOfCharsWritten/已写个数);BOOL WriteConsole(/在当前光标位置处插入指定数量的字符HANDLE hConsoleOutput,/句柄CONST VOID*lpBuffer,/字符串DWORD nNumberOfCharsToWrite,/字符个

18、数LPDWORD lpNumberOfCharsWritten,/已写个数LPVOID lpReserved/保留);BOOL WriteConsoleOutput(/向指定区域写带属性的字符HANDLE hConsoleOutput,/句柄CONST CHAR_INFO*lpBuffer,/字符数据区COORD dwBufferSize,/数据区大小COORD dwBufferCoord,/起始坐标PSMALL_RECT lpWriteRegion/要写的区域);BOOL WriteConsoleOutputCharacter(/在指定位置处插入指定数量的字符HANDLE hConsoleO

19、utput,/句柄LPCTSTR lpCharacter,/字符串DWORD nLength,/字符个数COORD dwWriteCoord,/起始位置名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 18 页 -LPDWORD lpNumberOfCharsWritten/已写个数);可以看出:WriteConsoleOutput 函数功能相当于SetConsoleTextAttribute 和 WriteConsole 的功能。而WriteConsoleOutputCharacter函数相当于SetConsoleCursorPosition(设置光标位置)和 WriteCons

20、ole 的功能。不过在具体使用要注意它们的区别。六、文本操作示例单击右键可弹出快捷菜单操作下面看一个示例程序:#include HANDLE hOut;void ShadowWindowLine(char*str);/在具有阴影效果的窗口中显示一行字符,窗口为居中显示void DrawBox(bool bSingle,SMALL_RECT rc);/绘制边框void main()hOut=GetStdHandle(STD_OUTPUT_HANDLE);/获取标准输出设备句柄SetConsoleOutputCP(437);/设置代码页ShadowWindowLine(Display a line

21、 of words,and center the window with shadow.);CloseHandle(hOut);/关闭标准输出设备句柄 void ShadowWindowLine(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;y1=bInfo.dwSize.Y/2-2;x2=x

22、1+chNum+4;y2=y1+5;WORD att1=BACKGROUND_INTENSITY;/阴影属性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;名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 1

23、8 页 -for(int i=0;i5;i+)FillConsoleOutputAttribute(hOut,att1,chNum+4,posShadow,NULL);posShadow.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 r

24、c=x1,y1,x2-1,y2-1;DrawBox(true,rc);SetConsoleTextAttribute(hOut,bInfo.wAttributes);/恢复原来的属性 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

25、 chBox0=(char)0 xc9;/左上角点chBox1=(char)0 xbb;/右上角点chBox2=(char)0 xc8;/左下角点chBox3=(char)0 xbc;/右下角点chBox4=(char)0 xcd;/水平chBox5=(char)0 xba;/坚直 COORD pos=rc.Left,rc.Top;WriteConsoleOutputCharacter(hOut,&chBox0,1,pos,NULL);for(pos.X=rc.Left+1;pos.XWriteConsoleOutputCharacter(hOut,&chBox4,1,pos,NULL);po

26、s.X=rc.Right;WriteConsoleOutputCharacter(hOut,&chBox1,1,pos,NULL);名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 18 页 -for(pos.Y=rc.Top+1;pos.Y pos.X=rc.Left;WriteConsoleOutputCharacter(hOut,&chBox5,1,pos,NULL);pos.X=rc.Right;WriteConsoleOutputCharacter(hOut,&chBox5,1,pos,NULL);pos.X=rc.Left;pos.Y=rc.Bottom;WriteCo

27、nsoleOutputCharacter(hOut,&chBox2,1,pos,NULL);for(pos.X=rc.Left+1;pos.XWriteConsoleOutputCharacter(hOut,&chBox4,1,pos,NULL);pos.X=rc.Right;WriteConsoleOutputCharacter(hOut,&chBox3,1,pos,NULL);程序运行结果如下图所示。需要说明的是,上述程序在不同的字符代码页面(code page)下显示的结果是不同的。例如,中文 Windows 操作系统的默认代码页是简体中文(936),在该代码页面下值超过128 的单字符

28、在 Windows NT/XP 是显示不出来的。下表列出了可以使用的代码页。代码页(Code page)说 明1258 越南文1257 波罗的海文1256 阿拉伯文1255 希伯来文1254 土耳其语1253 希腊文1252 拉丁文(ANSI)1251 斯拉夫文1250 中欧文950 繁体中文949 韩文936 简体中文932 日文874 泰文850 使用多种语言(MS-DOS 拉丁文)437MS-DOS 美语/英语七、滚动和移动单击右键可弹出快捷菜单操作名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 18 页 -ScrollConsoleScreenBuffer 是实现文本区滚

29、动和移动的API 函数。它可以将指定的一块文本区域移动到另一个区域,被移空的那块区域由指定字符填充。函数的原型如下:BOOL ScrollConsoleScreenBuffer(HANDLE hConsoleOutput,/句柄CONST SMALL_RECT*lpScrollRectangle,/要滚动或移动的区域CONST SMALL_RECT*lpClipRectangle,/裁剪区域COORD dwDestinationOrigin,/新的位置CONST CHAR_INFO*lpFill/填充字符);利用这个 API 函数还可以实现删除指定行的操作。下面来举一个例子,程序如下:#inc

30、lude#include#include HANDLE hOut;void DeleteLine(int row);/删除一行void MoveText(int x,int y,SMALL_RECT rc);/移动文本块区域void ClearScreen(void);/清屏void main()hOut=GetStdHandle(STD_OUTPUT_HANDLE);/获取标准输出设备句柄WORD att=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY|BACKGROUND_BLUE;/背景是蓝色,文本颜色是黄色SetConsoleT

31、extAttribute(hOut,att);ClearScreen();printf(nnThe soul selects her own society,n);printf(Then shuts the door;n);printf(On her devine majority;n);printf(Obtrude no more.nn);CONSOLE_SCREEN_BUFFER_INFO bInfo;GetConsoleScreenBufferInfo(hOut,&bInfo);COORD endPos=0,bInfo.dwSize.Y-1;SetConsoleCursorPositio

32、n(hOut,endPos);/设置光标位置SMALL_RECT rc=0,2,40,5;名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 18 页 -_getch();MoveText(10,5,rc);_getch();DeleteLine(5);CloseHandle(hOut);/关闭标准输出设备句柄 void DeleteLine(int row)SMALL_RECT rcScroll,rcClip;COORD crDest=0,row-1;CHAR_INFO chFill;CONSOLE_SCREEN_BUFFER_INFO bInfo;GetConsoleScree

33、nBufferInfo(hOut,&bInfo);rcScroll.Left=0;rcScroll.Top=row;rcScroll.Right=bInfo.dwSize.X-1;rcScroll.Bottom=bInfo.dwSize.Y-1;rcClip=rcScroll;chFill.Attributes=bInfo.wAttributes;chFill.Char.AsciiChar=;ScrollConsoleScreenBuffer(hOut,&rcScroll,&rcClip,crDest,&chFill);void MoveText(int x,int y,SMALL_RECT

34、rc)COORD crDest=x,y;CHAR_INFO chFill;CONSOLE_SCREEN_BUFFER_INFO bInfo;GetConsoleScreenBufferInfo(hOut,&bInfo);chFill.Attributes=bInfo.wAttributes;chFill.Char.AsciiChar=;ScrollConsoleScreenBuffer(hOut,&rc,NULL,crDest,&chFill);void ClearScreen(void)CONSOLE_SCREEN_BUFFER_INFO bInfo;GetConsoleScreenBuff

35、erInfo(hOut,&bInfo);COORD home=0,0;WORD att=bInfo.wAttributes;unsigned long size=bInfo.dwSize.X*bInfo.dwSize.Y;FillConsoleOutputAttribute(hOut,att,size,home,NULL);FillConsoleOutputCharacter(hOut,size,home,NULL);名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 18 页 -程序中,实现删除行的操作DeleteLine 的基本原理是:首先将裁剪区域和移动区域都设置成指定行 r

36、ow(包括该行)以下的控制台窗口区域,然后将移动的位置指定为(0,row-1)。这样,超出裁剪区域的内容被裁剪掉,从而达到删除行的目的。需要说明的是,若裁剪区域参数为NULL,则裁剪区域为整个控制台窗口。八、光标操作单击右键可弹出快捷菜单操作控制台窗口中的光标反映了文本插入的当前位置,通过SetConsoleCursorPosition 函数可以改变这个“当前”位置,这样就能控制字符(串)输出。事实上,光标本身的大小和显示或隐藏也可以通过相应的API 函数进行设定。例如:BOOL SetConsoleCursorInfo(/设置光标信息HANDLE hConsoleOutput,/句柄CONS

37、T CONSOLE_CURSOR_INFO*lpConsoleCursorInfo/光标信息);BOOL GetConsoleCursorInfo(/获取光标信息HANDLE hConsoleOutput,/句柄PCONSOLE_CURSOR_INFO lpConsoleCursorInfo/返回光标信息);这两个函数都与CONSOLE_CURSOR_INFO结构体类型有关,其定义如下:typedef struct _CONSOLE_CURSOR_INFO DWORD dwSize;/光标百分比大小BOOL bVisible;/是否可见 CONSOLE_CURSOR_INFO,*PCONSOL

38、E_CURSOR_INFO;需要说明的是,dwSize 值反映了光标的大小,它的值范围为1-100;当为 1 时,光标最小,仅是一条最靠下的水平细线,当为100,光标最大,为一个字符大小的方块。九、读取键盘信息单击右键可弹出快捷菜单操作键盘事件通常有字符事件和按键事件,这些事件所附带的信息构成了键盘信息。它是通过 API 函数 ReadConsoleInput 来获取的,其原型如下:名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 18 页 -BOOL ReadConsoleInput(HANDLE hConsoleInput,/输入设备句柄PINPUT_RECORD lpBuf

39、fer,/返回数据记录DWORD nLength,/要读取的记录数LPDWORD lpNumberOfEventsRead/返回已读取的记录数);其中,INPUT_RECORD定义如下:typedef struct _INPUT_RECORD WORD EventType;/事件类型union KEY_EVENT_RECORD KeyEvent;MOUSE_EVENT_RECORD MouseEvent;WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;MENU_EVENT_RECORD MenuEvent;FOCUS_EVENT_RECORD F

40、ocusEvent;Event;INPUT_RECORD;与键盘事件相关的记录结构KEY_EVENT_RECORD定义如下:typedef struct _KEY_EVENT_RECORD BOOL bKeyDown;/TRUE表示键按下,FALSE 表示键释放WORD wRepeatCount;/按键次数WORD wVirtualKeyCode;/虚拟键代码WORD wVirtualScanCode;/虚拟键扫描码union WCHAR UnicodeChar;/宽字符CHAR AsciiChar;/ASCII字符 uChar;/字符DWORD dwControlKeyState;/控制键状

41、态 KEY_EVENT_RECORD;我们知道,键盘上每一个有意义的键都对应着一个唯一的扫描码,虽然扫描码可以作为键的标识,但它依赖于具体设备的。因此,在应用程序中,使用的往往是与具体设备无关的虚拟键代码。这种虚拟键代码是与设备无关的键盘编码。在Visual C+中,最常用的虚拟键代码已被定义在Winuser.h 中,例如:VK_SHIFT表示 SHIFT 键,VK_F1 表示功能键F1 等。上述结构定义中,dwControlKeyState 用来表示控制键状态,它可以是CAPSLOCK_ON(CAPS LOCK灯亮)、ENHANCED_KEY(按下扩展键)、LEFT_ALT_PRESSED(

42、按下左ALT键)、LEFT_CTRL_PRESSED(按 下 左CTRL键)、NUMLOCK_ON(NUM LOCK灯 亮)、RIGHT_ALT_PRESSED(按下右ALT 键)、RIGHT_CTRL_PRESSED(按下右CTRL键)、SCROLLLOCK_ON(SCROLL LOCK灯亮)和 SHIFT_PRESSED(按下 SHIFT 键)中的一个或多名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 18 页 -个值的组合。下面的程序是将用户按键的字符输入到一个控制台窗口的某个区域中,并当按下NUM LOCK、CAPS LOCK 和 SCROLL LOCK键时,在控制台窗

43、口的最后一行显示这些键的状态。#include HANDLE hOut;HANDLE hIn;void DrawBox(bool bSingle,SMALL_RECT rc);void ClearScreen(void);void CharWindow(char ch,SMALL_RECT rc);/将 ch 输入到指定的窗口中void ControlStatus(DWORD state);/在最后一行显示控制键的状态void DeleteTopLine(SMALL_RECT rc);/删除指定窗口中最上面的行并滚动void main()hOut=GetStdHandle(STD_OUTPUT

44、_HANDLE);/获取标准输出设备句柄hIn=GetStdHandle(STD_INPUT_HANDLE);/获取标准输入设备句柄WORD att=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY|BACKGROUND_BLUE;/背景是蓝色,文本颜色是黄色SetConsoleTextAttribute(hOut,att);ClearScreen();/清屏INPUT_RECORD keyRec;DWORD state=0,res;char ch;SMALL_RECT rc=20,2,40,12;DrawBox(true,rc);COO

45、RD pos=rc.Left+1,rc.Top+1;SetConsoleCursorPosition(hOut,pos);/设置光标位置for(;)/循环 ReadConsoleInput(hIn,&keyRec,1,&res);if(state!=keyRec.Event.KeyEvent.dwControlKeyState)state=keyRec.Event.KeyEvent.dwControlKeyState;ControlStatus(state);if(keyRec.EventType=KEY_EVENT)if(keyRec.Event.KeyEvent.wVirtualKeyCo

46、de=VK_ESCAPE)break;/按 ESC 键退出循环if(keyRec.Event.KeyEvent.bKeyDown)ch=keyRec.Event.KeyEvent.uChar.AsciiChar;CharWindow(ch,rc);名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 18 页 -pos.X=0;pos.Y=0;SetConsoleCursorPosition(hOut,pos);/设置光标位置CloseHandle(hOut);/关闭标准输出设备句柄CloseHandle(hIn);/关闭标准输入设备句柄 void CharWindow(char c

47、h,SMALL_RECT rc)/将 ch 输入到指定的窗口中 static COORD chPos=rc.Left+1,rc.Top+1;SetConsoleCursorPosition(hOut,chPos);/设置光标位置if(ch0 x7e)return;WriteConsoleOutputCharacter(hOut,&ch,1,chPos,NULL);if(chPos.X=(rc.Right-1)chPos.X=rc.Left;chPos.Y+;if(chPos.Y(rc.Bottom-1)DeleteTopLine(rc);chPos.Y=rc.Bottom-1;chPos.X+

48、;SetConsoleCursorPosition(hOut,chPos);/设置光标位置 void ControlStatus(DWORD state)/在最后一行显示控制键的状态 CONSOLE_SCREEN_BUFFER_INFO bInfo;GetConsoleScreenBufferInfo(hOut,&bInfo);COORD home=0,bInfo.dwSize.Y-1;WORD att0=BACKGROUND_INTENSITY;WORD att1=FOREGROUND_GREEN|FOREGROUND_INTENSITY|BACKGROUND_RED;FillConsole

49、OutputAttribute(hOut,att0,bInfo.dwSize.X,home,NULL);FillConsoleOutputCharacter(hOut,bInfo.dwSize.X,home,NULL);SetConsoleTextAttribute(hOut,att1);COORD staPos=bInfo.dwSize.X-16,bInfo.dwSize.Y-1;SetConsoleCursorPosition(hOut,staPos);if(state&NUMLOCK_ON)WriteConsole(hOut,NUM,3,NULL,NULL);staPos.X+=4;名师

50、资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 18 页 -SetConsoleCursorPosition(hOut,staPos);if(state&CAPSLOCK_ON)WriteConsole(hOut,CAPS,4,NULL,NULL);staPos.X+=5;SetConsoleCursorPosition(hOut,staPos);if(state&SCROLLLOCK_ON)WriteConsole(hOut,SCROLL,6,NULL,NULL);SetConsoleTextAttribute(hOut,bInfo.wAttributes);/恢复原来的属性Se

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com