威尼斯网址开户网站:C语言控制台窗口图形界面编程(五).

<知识分享>

支配文件的移位是调控台窗口分界面编制程序的一个很要紧的法力,有了那一个效用我们得以兑现分界面包车型客车轮转。下边我们介绍贰个决定文件移动的函数,如下:

本连串小说改编自《C语言调整台窗口分界面编制程序(纠正版卡塔尔国》。本体系随笔会扬弃一些原稿中难懂难了解且临时用的一些,并改善了一些样例程序。只为了进一层清楚地上学C语言的决定台窗口界面编制程序。而想要越发浓重的询问本类别小说,请阅读《C语言调整台窗口分界面编程(改正版卡塔 尔(阿拉伯语:قطر‎》。

<知识分享>

 

 

 

上次讲的是键盘事件,此次大家介绍鼠标事件。上边先介绍下鼠标事件的结构体以致相关新闻。

在此边介绍三个装置文本属性的函数,原型如下

BOOL ScrollConsoleScreenBuffer(             //文本移动函数  

     
 《C语言调控台窗口分界面编制程序(校正版卡塔尔国》下载地址:

 

    HANDLE hConsoleOutput,                  //句柄  

 

  1. typedef struct _MOUSE_EVENT_RECOPAJEROD      //鼠标事件协会体  
  2. {  
  3.     老总TiguanD dwMousePosition;      //当前鼠标在支配台窗口缓冲区的职位  
  4.     DWO大切诺基D dwButtonState;        //鼠标开关的意况  
  5.     DWOLacrosseD dwControlKeyState;    //调节键状态  
  6.     DWO中华VD dw伊芙ntFlags;         //鼠标事件类型  
  7. } MOUSE_EVENT_RECORD;  
  8. /* 
  9. 中间鼠标按钮状态dwButtonState可能的值有 
  10. ~~~~~~~~~~~~~~~ 
  11. FROM_LEFT_1ST_BUTTON_PRESSED        最左边的鼠标键被按下      平常的话正是鼠标左键 
  12. FROM_LEFT_2ND_BUTTON_PRESSED        左起第4个鼠标键被按下    日常的话是鼠标中键,正是滚轮键 
  13. FROM_LEFT_3RD_BUTTON_PRESSED        左起第七个鼠标键被按下 
  14. FROM_LEFT_4TH_BUTTON_PRESSED        左起第七个鼠标键被按下 
  15. RIGHTMOST_BUTTON_PRESSED            最侧面的鼠标键被按下      平时的话是鼠标右键 
  16. ~~~~~~~~~~~~~~~ 
  17. 调节键状态dwControlKeyState与键盘事件的相近 
  18. ~~~~~~~~~~~~~~~ 
  19. ENHANCED_KEY        扩张键被按下  
  20. LEFT_ALT_PRESSED    左Alt键被按下  
  21. LEFT_CTRL_PRESSED   左Ctrl键被按下  
  22. RIGHT_ALT_PRESSED   右Alt键被按下  
  23. RIGHT_CTRL_PRESSED  右Ctrl键被按下  
  24. NUMLOCK_ON          数字锁定被张开  
  25. SCROLLLOCK_ON       滚动锁定被展开  
  26. CAPSLOCK_ON         大写锁定被展开  
  27. SHIFT_PRESSED       Shift键被按下 
  28. ~~~~~~~~~~~~~~~ 
  29. 鼠标事件类型dw伊芙ntFlags有以下两种 
  30. ~~~~~~~~~~~~~~~ 
  31. DOUBLE_CLICK            双击,第一击只充当平常按钮事件,第二击才作为双击事件 
  32. MOUSE_HWHEELED          水平鼠标滚轮移动 
  33. MOUSE_MOVED             鼠标移动 
  34. MOUSE_WHEELED           垂直鼠标滚轮移动 
  35. 0                       当鼠标有键被按下也许释放 
  36. */  

BOOL SetConsoleTextAttribute(   // 设置WriteConsole等函数的字符属性  

    const SMALL_RECT *lpScrollRectangle,    //移动区域  

     
 在Windows操作系统下用C语言编写调控台的窗口分界面首先要拿走当前行业内部输入和标准输出设备的句柄。通过调用函数GetStdHandle能够博伏贴前正规输入以至输出设备的句柄。函数原型为:

 

HANDLE hConsoleOutput,          // 句柄  

    const SMALL_RECT *lpClipRectangle,    
 //裁剪区域,假若为NULL,那么将意味全部荧屏缓冲区  

[cpp] view
plaincopy威尼斯网址开户网站 1威尼斯网址开户网站 2

     
 下边给二个样例程序,实今后调控台窗口缓冲区的最上面后生可畏行展现当前鼠标在缓冲区的坐标,单击左键在近年来鼠标地点输出字母A,单击右键则输出字母B,双击任何鼠标键退出的成效。程序如下:

WO凯雷德D wAttributes                // 文本属性  

    首席实施官LANDD dwDestinationOrigin,            
 //移动到的岗位,这一个点将改成活动区域的左上极点  

  1. HANDLE GetStdHandle(DWORD nStdHandle);  
  2. /* 
  3. 其中,nStdHandle可以是 
  4. STD_INPUT_HANDLE    标准输入设备句柄 
  5. STD_OUTPUT_HANDLE   标准输出设备句柄 
  6. STD_ERROR_HANDLE    规范错误设备句柄 
  7. */  
  1. #include <stdio.h>  
  2. #include <Windows.h>  
  3. #include <conio.h>  
  4.   
  5. HANDLE handle_in;  
  6. HANDLE handle_out;  
  7. CONSOLE_SCREEN_BUFFER_INFO csbi;        //定义窗口缓冲区新闻结构体  
  8.   
  9. void DisplayMousePosition(CEO陆风X8D pos);   //展现鼠标所在地方  
  10.   
  11. void gotoxy(int x, int y);  //将光标移到坐标为(x,y)的职位  
  12.   
  13. int main()  
  14. {  
  15.     handle_in = GetStdHandle(STD_INPUT_HANDLE);      //得到正式输入设备句柄  
  16.     handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //得到职业输出设备句柄  
  17.     INPUT_RECO奥迪Q5D mouserec;      //定义输入事件协会体  
  18.     DWOMuranoD res;      //用于存款和储蓄读取记录  
  19.     CEO奥迪Q5D pos;      //用于存款和储蓄鼠标当前岗位  
  20.     CEOCR-VD size = {80, 25};  //窗口缓冲区大小  
  21.     GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区音讯  
  22.     SetConsoleScreenBufferSize(handle_out, size);   //设置窗口缓冲区大小  
  23.     for (;;)  
  24.     {  
  25.         ReadConsoleInput(handle_in, &mouserec, 1, &res);      //读取输入事件  
  26.         pos = mouserec.伊芙nt.Mouse伊芙nt.dwMousePosition;    //得到当前鼠标地点  
  27.         gotoxy(0, 24);  //在第25行展现鼠标地点  
  28.         DisplayMousePosition(pos);      //展现鼠标地方  
  29.         if (mouserec.EventType == MOUSE_EVENT)    //尽管当前为鼠标事件  
  30.         {  
  31.             gotoxy(pos.X, pos.Y);  
  32.             //单击鼠标左键,输出字符A  
  33.             if (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)  
  34.             {  
  35.                 putchar(‘A’);  
  36.             }  
  37.             //单击鼠标右键,输出字符B  
  38.             if (mouserec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)  
  39.             {  
  40.                 putchar(‘B’);  
  41.             }  
  42.             //双击退出  
  43.             if (mouserec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)  
  44.             {  
  45.                 break;  
  46.             }  
  47.         }  
  48.     }  
  49.     CloseHandle(handle_out);  
  50.     CloseHandle(handle_in);  
  51.     return 0;  
  52. }  
  53.   
  54. void DisplayMousePosition(COORD pos)  
  55. {  
  56.     老板奥迪Q3D dis = {0, 24};        //在第24行显示鼠标地点  
  57.     WORD att = FOREGROUND_GREEN | FOREGROUND_INTENSITY; //文本属性  
  58.     GetConsoleScreenBufferInfo(handle_out, &csbi);  //拿到窗口缓冲区音讯  
  59.     printf(“X = %3d, Y = %3d”, (int)pos.X, (int)pos.Y);  
  60.     FillConsoleOutputAttribute(handle_out, att, 16, dis, NULL);  //填充文本属性  
  61.     return;  
  62. }  
  63.   
  64. void gotoxy(int x, int y)  
  65. {  
  66.     COORD pos = {x, y};  
  67.     SetConsoleCursorPosition(handle_out, pos);  
  68. }  

);  

    const CHAR_INFO *lpFill                 //空出区域的填充字符  

       

 

 

);  

 

       附上用本程序写的Hello
world!的图:威尼斯网址开户网站 3

 

 

     
 必要验证的是,“句柄”是Windows最常用的贰个概念。它平日用来标记Windows能源(如菜单、 Logo、窗口等)和道具等指标。就算能够把句柄驾驭为是叁个指针变量类型,但它不是指标所在之处指针,而是作为Windows系统内部表的索引值来利用 的。调用相关文本界面调控的API函数。这几个函数可分为三类。一是用于调控台窗口操作的函数(包含窗口的缓冲区大小、窗口前程字符和背景颜色、窗口标题、大小和地点等);二是用来调整台输入输出的函数(包蕴字符属性操作函数);其余的函数并为最后生龙活虎类。通过调用CloseHandle函数来关闭输入输出句柄。


     
 顺便提一下文本属性,其实正是颜色属性,有背景观和前程色(正是字符的颜料卡塔 尔(英语:State of Qatar)两类,每生机勃勃类只提供三原色(红,绿,蓝卡塔尔和抓好色(青古铜色,可与其余颜料搭配使用,使颜色变亮,前面会涉及卡塔 尔(阿拉伯语:قطر‎。最终还恐怕有叁个反色(不太精通这些到底怎么用,很奇葩的事物卡塔 尔(阿拉伯语:قطر‎。示例程序如下:

 

 

 

       下边来看贰个移动文本的样例程序,如下

       示例程序:

#include <stdio.h>  

 

[cpp] view
plaincopy威尼斯网址开户网站 4威尼斯网址开户网站 5

#include <stdlib.h>  

#include <stdio.h>  

  1. #include <stdio.h>  
  2. #include <windows.h>  
  3. #include <conio.h>  
  4.   
  5. int main(int argc,char *argv[])  
  6. {  
  7.     HANDLE handle_out;                              //定义三个句柄  
  8.     CONSOLE_SCREEN_BUFFER_INFO screen_info;         //定义窗口缓冲区音信结构体  
  9.     经理ENCORED pos = {0, 0};                             //定义叁个坐标结构体  
  10.     handle_out = GetStdHandle(STD_OUTPUT_HANDLE);   //获得正式输出设备句柄  
  11.     GetConsoleScreenBufferInfo(handle_out, &screen_info);   //获取窗口音信  
  12.     _getch();   //输入三个字符,不会显示到荧屏上  
  13.     /* 
  14.     向全部缓冲区填充字符’A’ 
  15.     在那之中填充的发端处为pos,坐标为{0, 0},相当于荧屏最左上角的字符处 
  16.     填充个数为screen_info.dwSize.X(缓冲区宽窄,也等于横坐标) * screen_info.dwSize.Y(缓冲区惊人,约等于纵坐标) 
  17.     因而得以直达向任何缓冲区填充字符’A’的功效 
  18.     */  
  19.     FillConsoleOutputCharacter(handle_out, ‘A’, screen_info.dwSize.X * screen_info.dwSize.Y, pos, NULL);  
  20.     CloseHandle(handle_out);    //关闭规范输出设备句柄  
  21.     return 0;  
  22. }  

#include <windows.h>  

#include <conio.h>  

[cpp] view
plaincopy威尼斯网址开户网站 6威尼斯网址开户网站 7

#include <conio.h>  

#include <Windows.h>  

  1. //程序中,COORD和CONSOLE_SCREEN_BUFFER_ INFO是wincon.h定义的调整台结构体类型  
  2. //原型如下  
  3.   
  4. //坐标结构体  
  5. typedef struct _COORD  
  6. {  
  7.     SHORT X;  
  8.     SHORT Y;  
  9. }COORD;  
  10.   
  11. //调整台窗口音信结构体  
  12. typedef struct _CONSOLE_SCREEN_BUFFER_INFO  
  13. {  
  14.     老板XC60D dwSize;               //缓冲区大小  
  15.     老董奔驰G级D dwCursorPosition;     //当前光标地点  
  16.     WO奥迪Q5D wAttributes;           //字符属性  
  17.     SMALL_RECT srWindow;        //当前窗口体现的尺寸和地点  
  18.     总COO奇骏D dw马克西姆umWindowSize;  // 最大的窗口缓冲区大小  
  19. }CONSOLE_SCREEN_BUFFER_INFO;  

/* 

#include <stdlib.h>  

 

基本文本属性 

  

  1. 还索要表达的是,纵然在C++中,iostream.h定义了cin和cout的规范输入和输出流对象。但它们只可以促成宗旨的输入输出 操作,对于调节台窗口分界面包车型客车决定却回天无力,并且不能够与stdio.h和conio.h和睦相处,因为iostream.h和它们是C++两套分裂的输入 输出操作办法,使用时要极度注意。
  2. (

    jzqt_t

    )

FOREGROUND_BLUE 蓝色 

int main()  


FOREGROUND_GREEN 绿色 

{  

FOREGROUND_RED 红色 

    HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);  
 //获得正式输出设备句柄  

FOREGROUND_INTENSITY 加强 

    CONSOLE_SCREEN_BUFFER_INFO csbi;      
 //定义窗口缓冲区音讯结构体  

BACKGROUND_BLUE 原野绿背景 

    SMALL_RECT scroll;      //定义移动区域  

BACKGROUND_GREEN 孔雀绿背景 

    老董库罗德D pos = {0, 5};     //移动地方  

BACKGROUND_RED 法国红背景 

    CHAR_INFO chFill;       //定义填充字符  

BACKGROUND_INTENSITY 背景观加强 

    GetConsoleScreenBufferInfo(handle_out, &csbi);
 //获得窗口缓冲区消息  

COMMON_LVB_REVERSE_VIDEO 反色 

    //定义填充字符的逐生机勃勃参数及品质  

*/  

    chFill.Char.AsciiChar = ‘ ‘;  

  

    chFill.Attributes = csbi.wAttributes;  

const WORD FORE_BLUE   = FOREGROUND_BLUE;           //普鲁士蓝文本属性  

    //输出文本  

const WORD FORE_GREEN  = FOREGROUND_GREEN;          //油红文本属性  

    printf(“00000000000000000000000000000\n”);  

const WORD FORE_RED    = FOREGROUND_RED;            //蓝绿文本属性  

    printf(“11111111111111111111111111111\n”);  

const WORD FORE_PURPLE = FORE_BLUE | FORE_RED;      //石青文本属性  

    printf(“22222222222222222222222222222\n”);  

const WORD FORE_CYAN   = FORE_BLUE | FORE_GREEN;    //深翠绿文本属性  

    printf(“33333333333333333333333333333\n”);  

const WORD FORE_YELLOW = FORE_RED | FORE_GREEN;     //藕灰文本属性  

    //分明区域  

const WORD FORE_GRAY   = FOREGROUND_INTENSITY;      //宝蓝文本属性  

    scroll.Left = 1;  

const WORD BACK_BLUE   = BACKGROUND_BLUE;           //灰湖绿背景属性  

    scroll.Top = 1;  

const WORD BACK_GREEN  = BACKGROUND_GREEN;          //影青背景属性  

    scroll.Right = 10;  

const WORD BACK_RED    = BACKGROUND_RED;            //月光蓝背景属性  

    scroll.Bottom = 2;  

const WORD BACK_PURPLE = BACK_BLUE | BACK_RED;      //紫蓝背景属性  

    ScrollConsoleScreenBuffer(handle_out, &scroll, NULL, pos, &chFill);
//移动文本  

const WORD BACK_CYAN   = BACK_BLUE | BACK_GREEN;    //血牙红背景属性  

    return 0;  

const WORD BACK_YELLOW = BACK_RED | BACK_GREEN;     //水绿背景属性  

}  

const WORD BACK_GRAY   = BACKGROUND_INTENSITY;      //海蓝背景属性  

 

  

 

int main()  

 

{  

 

    HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);  
 //得到专门的学问输出设备句柄  

 

    CONSOLE_SCREEN_BUFFER_INFO csbi;                      
 //定义窗口缓冲区音讯结构体  

 

    GetConsoleScreenBufferInfo(handle_out, &csbi);        
 //获得窗口缓冲区信息  

     
 在上头的样例程序中,裁剪区域是全体调控台窗口的荧屏缓冲区,今后假诺大家把裁剪区域设定为与运动区域同样,也正是说ScrollConsoleScreenBuffer函数的第多少个参数也改成&scroll,那么结果会什么啊?

    SetConsoleTextAttribute(handle_out, FORE_BLUE);  

 

    printf(“青古铜色字符\n”);  

 

    SetConsoleTextAttribute(handle_out, FORE_RED);  

 

    printf(“原野绿字符\n”);  

 

    SetConsoleTextAttribute(handle_out, FORE_GREEN);  

 

    printf(“海洋蓝字符\n”);  

     
 为何会发生这种情形吧?很显明示因为裁剪区域的设定难点,现在大家把裁剪区域依旧设定成移动区域,可是大家只把移动区域下移生机勃勃行并不是运动在其余地点,看看会有如何情况时有发生?

    SetConsoleTextAttribute(handle_out, FORE_PURPLE);  

 

    printf(“深蓝字符\n”);  

 

    SetConsoleTextAttribute(handle_out, FORE_CYAN);  

 

    printf(“卡其色字符\n”);  

 

    SetConsoleTextAttribute(handle_out, FORE_YELLOW);  

 

    printf(“孔雀蓝字符\n”);  

     
 以往大家理应可以推断出结论了,别急,再做八个试验,现在我们将压缩区域又再次改为总体显示器缓冲区,看看会有怎么着的情景发生?

    SetConsoleTextAttribute(handle_out, FORE_GRAY);  

 

    printf(“深黄字符\n”);  

 

    SetConsoleTextAttribute(handle_out, FORE_GREEN | FORE_BLUE |
FORE_RED);  

 

    printf(“青色字符\n”);  

 

    SetConsoleTextAttribute(handle_out, BACK_BLUE);  

 

    printf(“土黑背景\n”);  

     
 再来末了八个试验,我们将回降区域减小为移动区域的上半有的,继续实行下移豆蔻梢头行的操作,看看最后结出会怎样?

    SetConsoleTextAttribute(handle_out, BACK_RED);  

 

    printf(“浅石磨蓝背景\n”);  

 

    SetConsoleTextAttribute(handle_out, BACK_GREEN);  

 

    printf(“鲜红背景\n”);  

 

    SetConsoleTextAttribute(handle_out, BACK_PURPLE);  

 

    printf(“青色背景\n”);  

       好了,今后大家经过汇总可以摄取几个结论了,这正是

    SetConsoleTextAttribute(handle_out, BACK_CYAN);  

 

    printf(“羊毛白背景\n”);  

       生龙活虎,减弱区域以外的区域不会受公事移动的熏陶。具体是:

    SetConsoleTextAttribute(handle_out, BACK_YELLOW);  

 

    printf(“朱红背景\n”);  

1,减少区域以外的区域不会被挪动过来的区域覆盖,

    SetConsoleTextAttribute(handle_out, BACK_GRAY);  

 

    printf(“水铁灰背景\n”);  

2,收缩区域以外的区域被移动到他处随后原区域不产生变化,因而没有须要填充字符。

    SetConsoleTextAttribute(handle_out, BACK_BLUE | BACK_RED |
BACK_GREEN);  

 

    printf(“卡其灰背景\n”);  

总的归咎来讲也正是原先是怎么着样子,文本移动后恐怕怎么体统,不会变动。

    SetConsoleTextAttribute(handle_out, BACK_GREEN | FORE_RED);
//示例:乌紫背景灰黄字符  

 

    printf(“栗色背景与铁青字符的搅动\n”);  

       二,收缩区域之内的区域受公事移动的震慑。具体是:

    SetConsoleTextAttribute(handle_out, FOREGROUND_INTENSITY |
FORE_RED);   //示例:亮金棕字符  

 

    printf(“亮色的浮动,与巩固色融合\n”);  

1,当降低区域之内的区域被移动到她处产生该区域为空时会被设定的字符填充,

    return 0;  

 

在那处介绍叁个装置文本属性的函数,原型如下 BOOL SetConsoleTextAttribute(
// 设置WriteConsole等函数的字符属性 HANDLE hConsoleOutput, //
句柄…

2,减少区域之内的区域会被挪动过来的区域覆盖。

 

总的归结来讲也正是一心受公事移动的震慑,移动过来就被遮住,被移走就由设定的字符来填充

相关文章