欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

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

    • 资源ID:39657930       资源大小:203.99KB        全文页数:15页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    -1-控制台窗口界面的编程控制丁有和所属类别:C&C+开发工具:Visual C+6.0 文章难度级别:摘要:文本(字符)界面的控制台应用程序开发是深入学习C+、掌握交互系统的实现方法的最简单的一种手段。然而,Visual C+的 C+专用库却没有TC 所支持的文本(字符)屏幕控制函数,为此本文从一般控制步骤、控制台窗口操作、文本(字符)控制、滚动和移动、光标、键盘和鼠标等几个方面讨论控制台窗口界面的编程控制方法。最近几年,越来越多的高校开设了C+语言这门课程。我们知道,学习一门语言必须与其开发环境相结合,才能在学习与应用这两方面相得益彰。在众多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/XP 操作系统中运行后,就会弹出一个窗口。例如下列过程:(1)单击 Visual C+标准工具栏上的“New Text File”按钮,打开一个新的文档窗口。(2)选择 File|Save 菜单或按快捷键Ctrl+S 或单击标准工具栏的Save 按钮,弹出“保存为”文件对话框。将文件名为“Hello.cpp”(注意扩展名.cpp 不能省略)。(3)在文档窗口中输入下列代码:#include void main()coutHello,Console!endl;(4)单击小型编译工具栏中的“Build”按钮或按F7 键,系统出现一个对话框,询问是否将此项目的工作文件夹设定源文件所在的文件夹,单击是按钮,系统开始编译。(5)单击小型编译工具栏中的“Execute Program”按钮或按Ctrl+F5 键,运行刚才的程序。(6)程序运行后,弹出下图的窗口。这就是控制台窗口,与传统的DOS 屏幕窗口相比最主要的区别有:(1)默认的控制台窗口有系统菜单和标题,它是一个内存缓冲区窗口,缓冲区大小取决于Windows 操作系统的分配;而DOS 屏幕是一种物理窗口,不具有Windows 窗口特性,其大小取决于ROM BIOS 分配的内存空间。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 15 页 -2-(2)控制台窗口的文本操作是调用低层的Win32 APIs,而 DOS 屏幕的文本操作是通过调用BIOS 的 16(10h)中断而实现的。(3)默认的控制台窗口可以接收键盘和鼠标的输入信息,设备驱动由Windows 管理,而 DOS 屏幕窗口接收鼠标时需要调用 33h 中断,且鼠标设备驱动程序由自己安装。二、控制台文本窗口的一般控制步骤在 Visual C+6.0 中,控制台窗口界面的一般编程控制步骤如下:(1)调用 GetStdHandle 获取当前的标准输入(STDIN)和标准输出(STDOUT)设备句柄。函数原型为:HANDLE GetStdHandle(DWORD nStdHandle);其中,nStdHandle 可以是STD_INPUT_HANDLE(标准输入设备句柄)、STD_OUTPUT_HANDLE(标准输出设备句柄)和STD_ERROR_HANDLE(标准错误句柄)。需要说明的是,“句柄”是 Windows 最常用的概念。它通常用来标识Windows 资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为 Windows 系统内部表的索引值来使用的。(2)调用相关文本界面控制的API 函数。这些函数可分为三类。一是用于控制台窗口操作的函数(包括窗口的缓冲区大小、窗口前景字符和背景颜色、窗口标题、大小和位置等);二是用于控制台输入输出的函数(包括字符属性操作函数);其他的函数并为最后一类。(3)调用 CloseHandle()来关闭输入输出句柄。注意,在程序中还必须包含头文件windows.h。下面看一个程序:#include#include#include void main()HANDLE hOut;hout=GetStdHandle(STD_OUTPUT_HANDLE);/获取标准输出设备句柄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.X*bInfo.dwSize.Y,pos,NULL);/向窗口中填充字符以获得清屏的效果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;/当前光标位置WORD wAttributes;/字符属性SMALL_RECT srWindow;/当前窗口显示的大小和位置COORD dwMaximumWindowSize;/最大的窗口缓冲区大小 CONSOLE_SCREEN_BUFFER_INFO;还需要说明的是,虽然在C+中,iostream.h 定义了 cin 和 cout 的标准输入和输出流对象。但它们只能实现基本的输入输出操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h 和 conio.h 友好相处,因为 iostream.h 和它们是 C+两套不同的输入输出操作方式,使用时要特别注意。三、控制台窗口操作用于控制台窗口操作的API 函数如下:GetConsoleScreenBufferInfo 获取控制台窗口信息GetConsoleTitle 获取控制台窗口标题ScrollConsoleScreenBuffer 在缓冲区中移动数据块SetConsoleScreenBufferSize 更改指定缓冲区大小SetConsoleTitle 设置控制台窗口标题SetConsoleWindowInfo 设置控制台窗口信息此外,还有窗口字体、显示模式等控制函数,这里不再细说。下列举一个示例,程序如下:#include#include#include 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();COORD size=80,25;SetConsoleScreenBufferSize(hOut,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 字符相似,控制台窗口中的字符也有相应的属性。这些属性分为:文本的前景色、背景色和双字节字符集(DBCS)属性三种。事实上,我们最关心是文本颜色,这样可以构造出美观的界面。颜色属性都是一些预定义标识:FOREGROUND_BLUE 蓝色FOREGROUND_GREEN 绿色FOREGROUND_RED 红色FOREGROUND_INTENSITY 加强BACKGROUND_BLUE 蓝色背景BACKGROUND_GREEN 绿色背景BACKGROUND_RED 红色背景BACKGROUND_INTENSITY 背景色加强COMMON_LVB_REVERSE_VIDEO 反色与文本属性相关的主要函数有:BOOL FillConsoleOutputAttribute(/填充字符属性HANDLE hConsoleOutput,/句柄WORD wAttribute,/文本属性DWORD nLength,/个数COORD dwWriteCoord,/开始位置LPDWORD lpNumberOfAttrsWritten/返回填充的个数);BOOL SetConsoleTextAttribute(/设置 WriteConsole等函数的字符属性HANDLE hConsoleOutput,/句柄WORD wAttributes /文本属性);BOOL WriteConsoleOutputAttribute(/在指定位置处写属性HANDLE hConsoleOutput,/句柄CONST WORD*lpAttribute,/属性DWORD nLength,/个数COORD dwWriteCoord,/起始位置LPDWORD lpNumberOfAttrsWritten /已写个数);另外,获取当前控制台窗口的文本属性是通过调用函数GetConsoleScreenBufferInfo后,在 CONSOLE_SCREEN_ BUFFER_INFO结构成员 wAttributes中得到。2 文本输出文本输出函数有:BOOL FillConsoleOutputCharacter(/填充指定数据的字符HANDLE hConsoleOutput,/句柄TCHAR cCharacter,/字符DWORD nLength,/字符个数COORD dwWriteCoord,/起始位置LPDWORD lpNumberOfCharsWritten /已写个数);名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 15 页 -5-BOOL WriteConsole(/在当前光标位置处插入指定数量的字符HANDLE hConsoleOutput,/句柄CONST VOID*lpBuffer,/字符串DWORD nNumberOfCharsToWrite,/字符个数LPDWORD lpNumberOfCharsWritten,/已写个数LPVOID lpReserved /保留);BOOL WriteConsoleOutput(/向指定区域写带属性的字符HANDLE hConsoleOutput,/句柄CONST CHAR_INFO*lpBuffer,/字符数据区COORD dwBufferSize,/数据区大小COORD dwBufferCoord,/起始坐标PSMALL_RECT lpWriteRegion /要写的区域);BOOL WriteConsoleOutputCharacter(/在指定位置处插入指定数量的字符HANDLE hConsoleOutput,/句柄LPCTSTR lpCharacter,/字符串DWORD nLength,/字符个数COORD dwWriteCoord,/起始位置LPDWORD lpNumberOfCharsWritten /已写个数);可 以 看 出:WriteConsoleOutput函 数 功 能 相 当 于SetConsoleTextAttribute和WriteConsole的 功 能。而WriteConsoleOutputCharacter 函数相当于SetConsoleCursorPosition(设置光标位置)和 WriteConsole 的功能。不过在具体使用要注意它们的区别。3 文本操作示例下面看一个示例程序:#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 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;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 15 页 -6-y1=bInfo.dwSize.Y/2-2;x2=x1+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;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 rc=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 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;名师资料总结-精品资料欢迎下载-名师精心整理-第 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;WriteConsoleOutputCharacter(hOut,&chBox1,1,pos,NULL);for(pos.Y=rc.Top+1;pos.Yrc.Bottom;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;WriteConsoleOutputCharacter(hOut,&chBox2,1,pos,NULL);for(pos.X=rc.Left+1;pos.Xrc.Right;pos.X+)WriteConsoleOutputCharacter(hOut,&chBox4,1,pos,NULL);pos.X=rc.Right;WriteConsoleOutputCharacter(hOut,&chBox3,1,pos,NULL);程序运行结果如下图所示。需要说明的是,上述程序在不同的字符代码页面(code page)下显示的结果是不同的。例如,中文Windows 操作系统的默认代码页是简体中文(936),在该代码页面下值超过128 的单字符在Windows NT/XP 是显示不出来的。下表列出了可以使用的代码页。代码页(Code page)说明1258 越南文1257 波罗的海文1256 阿拉伯文1255 希伯来文1254 土耳其语1253 希腊文1252 拉丁文(ANSI)1251 斯拉夫文1250 中欧文950 繁体中文949 韩文936 简体中文932 日文874 泰文850 使用多种语言(MS-DOS拉丁文)437 MS-DOS 美语/英语名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 15 页 -8-五、滚动和移动ScrollConsoleScreenBuffer 是实现文本区滚动和移动的API 函数。它可以将指定的一块文本区域移动到另一个区域,被移空的那块区域由指定字符填充。函数的原型如下:BOOL ScrollConsoleScreenBuffer(HANDLE hConsoleOutput,/句柄CONST SMALL_RECT*lpScrollRectangle,/要滚动或移动的区域CONST SMALL_RECT*lpClipRectangle,/裁剪区域COORD dwDestinationOrigin,/新的位置CONST CHAR_INFO*lpFill /填充字符);利用这个 API 函数还可以实现删除指定行的操作。下面来举一个例子,程序如下:#include#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;/背景是蓝色,文本颜色是黄色SetConsoleTextAttribute(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;SetConsoleCursorPosition(hOut,endPos);/设置光标位置SMALL_RECT rc=0,2,40,5;_getch();MoveText(10,5,rc);_getch();DeleteLine(5);CloseHandle(hOut);/关闭标准输出设备句柄 void DeleteLine(int row)SMALL_RECT rcScroll,rcClip;名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 15 页 -9-COORD crDest=0,row-1;CHAR_INFO chFill;CONSOLE_SCREEN_BUFFER_INFO bInfo;GetConsoleScreenBufferInfo(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 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;GetConsoleScreenBufferInfo(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);程序中,实现删除行的操作DeleteLine 的基本原理是:首先将裁剪区域和移动区域都设置成指定行row(包括该行)以下的控制台窗口区域,然后将移动的位置指定为(0,row-1)。这样,超出裁剪区域的内容被裁剪掉,从而达到删除行的目的。需要说明的是,若裁剪区域参数为NULL,则裁剪区域为整个控制台窗口。六、光标、键盘和鼠标1 光标操作控制台窗口中的光标反映了文本插入的当前位置,通过SetConsoleCursorPosition 函数可以改变这个“当前”位置,这样就能控制字符(串)输出的位置。事实上,光标本身的大小和显示或隐藏也可以通过相应的API 函数进行设定。例如:BOOL SetConsoleCursorInfo(/设置光标信息HANDLE hConsoleOutput,/句柄CONST CONSOLE_CURSOR_INFO*lpConsoleCursorInfo /光标信息名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 15 页 -10-);BOOL GetConsoleCursorInfo(/获取光标信息HANDLE hConsoleOutput,/句柄PCONSOLE_CURSOR_INFO lpConsoleCursorInfo /返回光标信息);这两个函数都与CONSOLE_CURSOR_INFO结构体类型有关,其定义如下:typedef struct _CONSOLE_CURSOR_INFO DWORD dwSize;/光标百分比大小BOOL bVisible;/是否可见 CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO;需要说明的是,dwSize 值反映了光标的大小,它的值范围为1-100;当为 1 时,光标最小,仅是一条最靠下的水平细线,当为 100,光标最大,为一个字符大小的方块。2 读取键盘信息键盘事件通常有字符事件和按键事件,这些事件所附带的信息构成了键盘信息。它是通过API 函数 ReadConsoleInput 来获取的,其原型如下:BOOL ReadConsoleInput(HANDLE hConsoleInput,/输入设备句柄PINPUT_RECORD lpBuffer,/返回数据记录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 FocusEvent;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;/控制键状态 KEY_EVENT_RECORD;名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 15 页 -11-我们知道,键盘上每一个有意义的键都对应着一个唯一的扫描码,虽然扫描码可以作为键的标识,但它依赖于具体设备的。因此,在应用程序中,使用的往往是与具体设备无关的虚拟键代码。这种虚拟键代码是与设备无关的键盘编码。在Visual C+中,最常用的虚拟键代码已被定义在Winuser.h 中,例如:VK_SHIFT 表示 SHIFT 键,VK_F1 表示功能键F1 等。上 述 结 构 定 义 中,dwControlKeyState用 来 表 示 控 制 键 状 态,它 可 以 是CAPSLOCK_ON(CAPS LOCK灯 亮)、ENHANCED_KEY(按下扩展键)、LEFT_ALT_PRESSED(按 下 左ALT键)、LEFT_CTRL_PRESSED(按 下 左 CTRL键)、NUMLOCK_ON(NUM LOCK 灯亮)、RIGHT_ALT_PRESSED(按下右 ALT 键)、RIGHT_CTRL_PRESSED(按下右 CTRL 键)、SCROLLLOCK_ON(SCROLL LOCK灯亮)和 SHIFT_PRESSED(按下 SHIFT 键)中的一个或多个值的组合。下面的程序是将用户按键的字符输入到一个控制台窗口的某个区域中,并当按下NUM LOCK、CAPS LOCK 和 SCROLL LOCK 键时,在控制台窗口的最后一行显示这些键的状态。#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_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);COORD 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.wVirtualKeyCode=VK_ESCAPE)break;/按 ESC键退出循环if(keyRec.Event.KeyEvent.bKeyDown)ch=keyRec.Event.KeyEvent.uChar.AsciiChar;CharWindow(ch,rc);名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 15 页 -12-pos.X=0;pos.Y=0;SetConsoleCursorPosition(hOut,pos);/设置光标位置CloseHandle(hOut);/关闭标准输出设备句柄CloseHandle(hIn);/关闭标准输入设备句柄 void CharWindow(char ch,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+;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;FillConsoleOutputAttribute(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;SetConsoleCursorPosition(hOut,staPos);if(state&CAPSLOCK_ON)WriteConsole(hOut,CAPS,4,NULL,NULL);名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 15 页 -13-staPos.X+=5;SetConsoleCursorPosition(hOut,staPos);if(state&SCROLLLOCK_ON)WriteConsole(hOut,SCROLL,6,NULL,NULL);SetConsoleTextAttribute(hOut,bInfo.wAttributes);/恢复原来的属性SetConsoleCursorPosition(hOut,bInfo.dwCursorPosition);/恢复原来的光标位置

    注意事项

    本文(2022年2022年控制台窗口的文本界面控 .pdf)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开