精华内容
下载资源
问答
  • 控制台窗口登录源码
  • VS显示控制台窗口

    万次阅读 2018-09-27 09:03:03
    有的时候我们在完成编程后, 运行发现没有控制台窗口, 比如我们用Qt编写的界面软件, 又想看到我们在代码中添加的打印日志信息,这个时候加上控制台窗口就能实现 方法: 项目–> 属性–>链接器–&...

    有的时候我们在完成编程后, 运行发现没有控制台窗口, 比如我们用Qt编写的界面软件, 又想看到我们在代码中添加的打印日志信息,这个时候加上控制台窗口就能实现

    方法:
    项目–> 属性–>链接器–>系统–>子系统(选择控制台即可)

    在这里插入图片描述

    展开全文
  • C语言控制台窗口图形界面编程

    万次阅读 多人点赞 2017-03-26 13:05:25
    下面介绍几个用于控制台窗口操作的API函数,如下: [cpp] view plain copy   //获取控制台窗口信息  GetConsoleScreenBufferInfo();    //获取控制台窗口标题  GetConsoleTitle();    //更改指定...

    一:设置句柄与窗口信息


    在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输入和标准输出设备的句柄。通过调用函数GetStdHandle可以获取当前标准输入以及输出设备的句柄。函数原型为:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. HANDLE GetStdHandle(DWORD nStdHandle);  
    2. /* 
    3. 其中,nStdHandle可以是 
    4. STD_INPUT_HANDLE    标准输入设备句柄 
    5. STD_OUTPUT_HANDLE   标准输出设备句柄 
    6. STD_ERROR_HANDLE    标准错误设备句柄 
    7. */  
           

           需要说明的是,“句柄”是Windows最常用的一个概念。它通常用来标识Windows资源(如菜单、 图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows系统内部表的索引值来使用 的。调用相关文本界面控制的API函数。这些函数可分为三类。一是用于控制台窗口操作的函数(包括窗口的缓冲区大小、窗口前景字符和背景颜色、窗口标题、大小和位置等);二是用于控制台输入输出的函数(包括字符属性操作函数);其他的函数并为最后一类。通过调用CloseHandle函数来关闭输入输出句柄。


           示例程序:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    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.     COORD 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(缓冲区宽度,也就是横坐标最大值加1) * screen_info.dwSize.Y(缓冲区高度,也就是纵坐标最大值加1) 
    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. }  
    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    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.     COORD dwSize;               //缓冲区大小  
    15.     COORD dwCursorPosition;     //当前光标位置  
    16.     WORD wAttributes;           //字符属性  
    17.     SMALL_RECT srWindow;        //当前窗口显示的大小和位置  
    18.     COORD dwMaximumWindowSize;  // 最大的窗口缓冲区大小  
    19. }CONSOLE_SCREEN_BUFFER_INFO;  

           还需要说明的是,虽然在C++中,iostream.h定义了cin和cout的标准输入和输出流对象。但它们只能实现基本的输入输出 操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h和conio.h友好相处,因为iostream.h和它们是C++两套不同的输入 输出操作方式,使用时要特别注意。



    二:窗口缓冲区的设置


    下面介绍几个用于控制台窗口操作的API函数,如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. //获取控制台窗口信息  
    2. GetConsoleScreenBufferInfo();  
    3.   
    4. //获取控制台窗口标题  
    5. GetConsoleTitle();  
    6.   
    7. //更改指定缓冲区大小  
    8. SetConsoleScreenBufferSize();  
    9.   
    10. //设置控制台窗口标题  
    11. SetConsoleTitle();  
    12.   
    13. //设置控制台窗口信息  
    14. SetConsoleWindowInfo();  


           下面的示例程序用于说明此类函数的使用:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <Windows.h>  
    4. #include <conio.h>  
    5. #define N 255  
    6.   
    7. int main()  
    8. {  
    9.     HANDLE handle_out;  //定义一个句柄  
    10.     CONSOLE_SCREEN_BUFFER_INFO scbi;    //定义一个窗口缓冲区信息结构体  
    11.     COORD size = {80, 25};      //定义一个坐标结构体  
    12.     char strtitle[N];  
    13.     handle_out = GetStdHandle(STD_OUTPUT_HANDLE);   //获得标准输出设备句柄  
    14.     GetConsoleScreenBufferInfo(handle_out, &scbi);  //获得窗口缓冲区信息  
    15.     GetConsoleTitle(strtitle, N);   //获得当前窗口标题  
    16.     printf("当前窗口标题为:%s\n", strtitle);  
    17.     _getch();  
    18.     SetConsoleTitle("控制台窗口操作");     //设置窗口标题为“控制台窗口操作”  
    19.     GetConsoleTitle(strtitle, N);           //获得当前窗口标题  
    20.     printf("当前窗口标题为:%s\n", strtitle);  
    21.     _getch();  
    22.     SetConsoleScreenBufferSize(handle_out, size);   // 重新设置缓冲区大小  
    23.     _getch();  
    24.     SMALL_RECT rc = {0, 0, 80-1, 25-1};     // 重置窗口位置和大小  
    25.     SetConsoleWindowInfo(handle_out, 1, &rc);  
    26.     CloseHandle(handle_out);    //关闭标准输出设备句柄  
    27.     return 0;  
    28. }  

           其中,SetConsoleScreenBufferSize函数指定新的控制台屏幕缓冲区的大小,以字符列和行为单位。指定的宽度和高度不能小于控制台屏幕缓冲区窗口的宽度和高度。指定的大小也不能小于系统允许的最小大小。这个最低取决于控制台当前的字体大小 (由用户选定)。


    三:文本属性


    在这里介绍一个设置文本属性的函数,原型如下

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. BOOL SetConsoleTextAttribute(   // 设置WriteConsole等函数的字符属性  
    2. HANDLE hConsoleOutput,          // 句柄  
    3. WORD wAttributes                // 文本属性  
    4. );  


           顺便提一下文本属性,其实就是颜色属性,有背景色和前景色(就是字符的颜色)两类,每一类只提供三原色(红,绿,蓝)和加强色(灰色,可与其他颜色搭配使用,使颜色变亮,后面会提到)。最后还有一个反色(不太清楚这个到底怎么用,很奇葩的东西)。示例程序如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <windows.h>  
    4. #include <conio.h>  
    5. /* 
    6. 基本文本属性 
    7. FOREGROUND_BLUE 蓝色 
    8. FOREGROUND_GREEN 绿色 
    9. FOREGROUND_RED 红色 
    10. FOREGROUND_INTENSITY 加强 
    11. BACKGROUND_BLUE 蓝色背景 
    12. BACKGROUND_GREEN 绿色背景 
    13. BACKGROUND_RED 红色背景 
    14. BACKGROUND_INTENSITY 背景色加强 
    15. COMMON_LVB_REVERSE_VIDEO 反色 
    16. */  
    17.   
    18. const WORD FORE_BLUE   = FOREGROUND_BLUE;           //蓝色文本属性  
    19. const WORD FORE_GREEN  = FOREGROUND_GREEN;          //绿色文本属性  
    20. const WORD FORE_RED    = FOREGROUND_RED;            //红色文本属性  
    21. const WORD FORE_PURPLE = FORE_BLUE | FORE_RED;      //紫色文本属性  
    22. const WORD FORE_CYAN   = FORE_BLUE | FORE_GREEN;    //青色文本属性  
    23. const WORD FORE_YELLOW = FORE_RED | FORE_GREEN;     //黄色文本属性  
    24. const WORD FORE_GRAY   = FOREGROUND_INTENSITY;      //灰色文本属性  
    25. const WORD BACK_BLUE   = BACKGROUND_BLUE;           //蓝色背景属性  
    26. const WORD BACK_GREEN  = BACKGROUND_GREEN;          //绿色背景属性  
    27. const WORD BACK_RED    = BACKGROUND_RED;            //绿色背景属性  
    28. const WORD BACK_PURPLE = BACK_BLUE | BACK_RED;      //紫色背景属性  
    29. const WORD BACK_CYAN   = BACK_BLUE | BACK_GREEN;    //青色背景属性  
    30. const WORD BACK_YELLOW = BACK_RED | BACK_GREEN;     //黄色背景属性  
    31. const WORD BACK_GRAY   = BACKGROUND_INTENSITY;      //灰色背景属性  
    32.   
    33. int main()  
    34. {  
    35.     HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  
    36.     CONSOLE_SCREEN_BUFFER_INFO csbi;                        //定义窗口缓冲区信息结构体  
    37.     GetConsoleScreenBufferInfo(handle_out, &csbi);          //获得窗口缓冲区信息  
    38.     SetConsoleTextAttribute(handle_out, FORE_BLUE);  
    39.     printf("蓝色字符\n");  
    40.     SetConsoleTextAttribute(handle_out, FORE_RED);  
    41.     printf("红色字符\n");  
    42.     SetConsoleTextAttribute(handle_out, FORE_GREEN);  
    43.     printf("绿色字符\n");  
    44.     SetConsoleTextAttribute(handle_out, FORE_PURPLE);  
    45.     printf("紫色字符\n");  
    46.     SetConsoleTextAttribute(handle_out, FORE_CYAN);  
    47.     printf("青色字符\n");  
    48.     SetConsoleTextAttribute(handle_out, FORE_YELLOW);  
    49.     printf("黄色字符\n");  
    50.     SetConsoleTextAttribute(handle_out, FORE_GRAY);  
    51.     printf("灰色字符\n");  
    52.     SetConsoleTextAttribute(handle_out, FORE_GREEN | FORE_BLUE | FORE_RED);  
    53.     printf("白色字符\n");  
    54.     SetConsoleTextAttribute(handle_out, BACK_BLUE);  
    55.     printf("蓝色背景\n");  
    56.     SetConsoleTextAttribute(handle_out, BACK_RED);  
    57.     printf("红色背景\n");  
    58.     SetConsoleTextAttribute(handle_out, BACK_GREEN);  
    59.     printf("绿色背景\n");  
    60.     SetConsoleTextAttribute(handle_out, BACK_PURPLE);  
    61.     printf("紫色背景\n");  
    62.     SetConsoleTextAttribute(handle_out, BACK_CYAN);  
    63.     printf("青色背景\n");  
    64.     SetConsoleTextAttribute(handle_out, BACK_YELLOW);  
    65.     printf("黄色背景\n");  
    66.     SetConsoleTextAttribute(handle_out, BACK_GRAY);  
    67.     printf("灰色背景\n");  
    68.     SetConsoleTextAttribute(handle_out, BACK_BLUE | BACK_RED | BACK_GREEN);  
    69.     printf("白色背景\n");  
    70.     SetConsoleTextAttribute(handle_out, BACK_GREEN | FORE_RED); //示例:绿色背景红色字符  
    71.     printf("绿色背景与红色字符的混合\n");  
    72.     SetConsoleTextAttribute(handle_out, FOREGROUND_INTENSITY | FORE_RED);   //示例:亮红色字符  
    73.     printf("亮色的生成,与加强色融合\n");  
    74.     return 0;  
    75. }  

           上述示例程序最好用C++来中编译,因为有C语言的编译器或者IDE不支持上述的定义常量的方式。需要从这个示例中了解的是三原色的混合是用C语言位运算中的按位或 | 运算符,背景颜色与字符颜色的同时定义也是使用这个运算符融合。另外,将任意颜色与对应的加强色(灰色,有前景和背景两种,需要对应)融合后会成为对应颜色的高亮版,比如红色字符与前景加强色的融合会结合成亮红色。


           至于反色,大家可以试试,当我设置了文本属性为反色后,输入字符都不显示了,但是下标还在移动,我估计反色将白色字符变成了黑色字符,与黑色背景一样,所以没有显示出来。至于反色与其他的组合以及其他的颜色组合,还需要大家一起探索、、、


    四:文本属性


    文本颜色属性已经学会了,那么下面就学习几个比较常用的文本输出函数,如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. BOOL FillConsoleOutputAttribute(    // 填充字符属性  
    2. HANDLE hConsoleOutput,              // 句柄  
    3. WORD wAttribute,                    // 文本属性  
    4. DWORD nLength,                      // 个数  
    5. COORD dwWriteCoord,                 // 开始位置  
    6. LPDWORD lpNumberOfAttrsWritten      // 返回填充的个数  
    7. );  
    8. BOOL FillConsoleOutputCharacter(    // 填充指定数据的字符  
    9. HANDLE hConsoleOutput,              // 句柄  
    10. TCHAR cCharacter,                   // 字符  
    11. DWORD nLength,                      // 字符个数  
    12. COORD dwWriteCoord,                 // 起始位置  
    13. LPDWORD lpNumberOfCharsWritten      // 已写个数  
    14. );  
    15. BOOL WriteConsoleOutputCharacter(   // 在指定位置处写指定数量的字符  
    16. HANDLE hConsoleOutput,              // 句柄  
    17. LPCTSTR lpCharacter,                // 字符串  
    18. DWORD nLength,                      // 字符个数  
    19. COORD dwWriteCoord,                 // 起始位置  
    20. LPDWORD lpNumberOfCharsWritten      // 已写个数  
    21. );  


           另外再介绍一个表示区域的结构体,如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. typedef struct _SMALL_RECT  //表示矩形区域的结构体  
    2. {  
    3.   SHORT Left;       //左边界  
    4.   SHORT Top;        //上边界  
    5.   SHORT Right;      //右边界  
    6.   SHORT Bottom;     //下边界  
    7. } SMALL_RECT;  
    8. /* 
    9. 微软官方的说法是 
    10. Left    区域的左上顶点的X坐标 
    11. Top     区域的左上顶点的Y坐标 
    12. Right   区域的右下顶点的X坐标 
    13. Bottom  区域的右下顶点的Y坐标 
    14. */  


           通过以上的文本输出函数,我们来做一个简单的在一个具有阴影效果的窗口显示字符串的示例程序,如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <Windows.h>  
    4. #include <conio.h>  
    5.   
    6. int main()  
    7. {  
    8.     char *str = "Hello World!";     //定义输出信息  
    9.     int len = strlen(str), i;  
    10.     WORD shadow = BACKGROUND_INTENSITY;     //阴影属性  
    11.     WORD text = BACKGROUND_GREEN | BACKGROUND_INTENSITY;    //文本属性  
    12.     HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  
    13.     CONSOLE_SCREEN_BUFFER_INFO csbi;    //定义窗口缓冲区信息结构体  
    14.     GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区信息  
    15.     SMALL_RECT rc;      //定义一个文本框输出区域  
    16.     COORD posText;      //定义文本框的起始坐标  
    17.     COORD posShadow;    //定义阴影框的起始坐标  
    18.     //确定区域的边界  
    19.     rc.Top = 8;     //上边界  
    20.     rc.Bottom = rc.Top + 4;     //下边界  
    21.     rc.Left = (csbi.dwSize.X - len) / 2 - 2;    //左边界,为了让输出的字符串居中  
    22.     rc.Right = rc.Left + len + 4;   //右边界  
    23.     //确定文本框起始坐标  
    24.     posText.X = rc.Left;  
    25.     posText.Y = rc.Top;  
    26.     //确定阴影框的起始坐标  
    27.     posShadow.X = posText.X + 1;  
    28.     posShadow.Y = posText.Y + 1;  
    29.     for (i=0; i<5; ++i)     //先输出阴影框  
    30.     {  
    31.         FillConsoleOutputAttribute(handle_out, shadow, len + 4, posShadow, NULL);  
    32.         posShadow.Y++;  
    33.     }  
    34.     for (i=0; i<5; ++i)     //在输出文本框,其中与阴影框重合的部分会被覆盖掉  
    35.     {  
    36.         FillConsoleOutputAttribute(handle_out, text, len + 4, posText, NULL);  
    37.         posText.Y++;  
    38.     }  
    39.     //设置文本输出处的坐标  
    40.     posText.X = rc.Left + 2;  
    41.     posText.Y = rc.Top + 2;  
    42.     WriteConsoleOutputCharacter(handle_out, str, len, posText, NULL);   //输出字符串  
    43.     SetConsoleTextAttribute(handle_out, csbi.wAttributes);   // 恢复原来的属性  
    44.     CloseHandle(handle_out);  
    45.     return 0;  
    46. }  


           以上样例在Code::Blocks 13.12中编译通过。


    五:文本移动


    控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动。下面我们介绍一个控制文本移动的函数,如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. BOOL ScrollConsoleScreenBuffer(             //文本移动函数  
    2.     HANDLE hConsoleOutput,                  //句柄  
    3.     const SMALL_RECT *lpScrollRectangle,    //移动区域  
    4.     const SMALL_RECT *lpClipRectangle,      //裁剪区域,如果为NULL,那么将代表整个屏幕缓冲区  
    5.     COORD dwDestinationOrigin,              //移动到的位置,这个点将成为移动区域的左上顶点  
    6.     const CHAR_INFO *lpFill                 //空出区域的填充字符  
    7. );  


           下面来看一个移动文本的样例程序,如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #include <stdio.h>  
    2. #include <conio.h>  
    3. #include <Windows.h>  
    4. #include <stdlib.h>  
    5.   
    6. int main()  
    7. {  
    8.     HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  
    9.     CONSOLE_SCREEN_BUFFER_INFO csbi;        //定义窗口缓冲区信息结构体  
    10.     SMALL_RECT scroll;      //定义移动区域  
    11.     COORD pos = {0, 5};     //移动位置  
    12.     CHAR_INFO chFill;       //定义填充字符  
    13.     GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区信息  
    14.     //定义填充字符的各个参数及属性  
    15.     chFill.Char.AsciiChar = ' ';  
    16.     chFill.Attributes = csbi.wAttributes;  
    17.     //输出文本  
    18.     printf("00000000000000000000000000000\n");  
    19.     printf("11111111111111111111111111111\n");  
    20.     printf("22222222222222222222222222222\n");  
    21.     printf("33333333333333333333333333333\n");  
    22.     //确定区域  
    23.     scroll.Left = 1;  
    24.     scroll.Top = 1;  
    25.     scroll.Right = 10;  
    26.     scroll.Bottom = 2;  
    27.     ScrollConsoleScreenBuffer(handle_out, &scroll, NULL, pos, &chFill); //移动文本  
    28.     return 0;  
    29. }  


           在上面的样例程序中,裁剪区域是整个控制台窗口的屏幕缓冲区,现在如果我们把裁剪区域设定为与移动区域一样,也就是说ScrollConsoleScreenBuffer函数的第三个参数也改成&scroll,那么结果会怎么样呢?



           为什么会发生这种现象呢?很明显示因为裁剪区域的设定问题,现在我们把裁剪区域依旧设定成移动区域,但是我们只把移动区域下移一行而不是移动在别的位置,看看会有什么现象发生?



           现在我们应该可以猜想出结论了,别急,再做一个实验,现在我们将裁减区域又重新改为整个屏幕缓冲区,看看会有什么样的现象发生?



           再来最后一个实验,我们将裁减区域减小为移动区域的上半部分,继续执行下移一行的操作,看看最终结果会怎么样?



           好了,现在我们通过归纳可以得出几个结论了,那就是

           一,裁减区域以外的区域不会受文本移动的影响。具体是:

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

    2,裁减区域以外的区域被移动到他处之后原区域不发生变化,因此不需要填充字符。

    总的归纳来说也就是原来是什么样子,文本移动后还是什么样子,不会改变。

           二,裁减区域以内的区域受文本移动的影响。具体是:

    1,当裁减区域以内的区域被移动到他处造成该区域为空时会被设定的字符填充,

    2,裁减区域以内的区域会被移动过来的区域覆盖。

    总的归纳来说也就是完全受文本移动的影响,移动过来就被覆盖,被移走就由设定的字符来填充



    六:光标操作


    控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动。下面我们介绍一个控制文本移动的函数,如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. BOOL ScrollConsoleScreenBuffer(             //文本移动函数  
    2.     HANDLE hConsoleOutput,                  //句柄  
    3.     const SMALL_RECT *lpScrollRectangle,    //移动区域  
    4.     const SMALL_RECT *lpClipRectangle,      //裁剪区域,如果为NULL,那么将代表整个屏幕缓冲区  
    5.     COORD dwDestinationOrigin,              //移动到的位置,这个点将成为移动区域的左上顶点  
    6.     const CHAR_INFO *lpFill                 //空出区域的填充字符  
    7. );  


           下面来看一个移动文本的样例程序,如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #include <stdio.h>  
    2. #include <conio.h>  
    3. #include <Windows.h>  
    4. #include <stdlib.h>  
    5.   
    6. int main()  
    7. {  
    8.     HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  
    9.     CONSOLE_SCREEN_BUFFER_INFO csbi;        //定义窗口缓冲区信息结构体  
    10.     SMALL_RECT scroll;      //定义移动区域  
    11.     COORD pos = {0, 5};     //移动位置  
    12.     CHAR_INFO chFill;       //定义填充字符  
    13.     GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区信息  
    14.     //定义填充字符的各个参数及属性  
    15.     chFill.Char.AsciiChar = ' ';  
    16.     chFill.Attributes = csbi.wAttributes;  
    17.     //输出文本  
    18.     printf("00000000000000000000000000000\n");  
    19.     printf("11111111111111111111111111111\n");  
    20.     printf("22222222222222222222222222222\n");  
    21.     printf("33333333333333333333333333333\n");  
    22.     //确定区域  
    23.     scroll.Left = 1;  
    24.     scroll.Top = 1;  
    25.     scroll.Right = 10;  
    26.     scroll.Bottom = 2;  
    27.     ScrollConsoleScreenBuffer(handle_out, &scroll, NULL, pos, &chFill); //移动文本  
    28.     return 0;  
    29. }  


           在上面的样例程序中,裁剪区域是整个控制台窗口的屏幕缓冲区,现在如果我们把裁剪区域设定为与移动区域一样,也就是说ScrollConsoleScreenBuffer函数的第三个参数也改成&scroll,那么结果会怎么样呢?



           为什么会发生这种现象呢?很明显示因为裁剪区域的设定问题,现在我们把裁剪区域依旧设定成移动区域,但是我们只把移动区域下移一行而不是移动在别的位置,看看会有什么现象发生?



           现在我们应该可以猜想出结论了,别急,再做一个实验,现在我们将裁减区域又重新改为整个屏幕缓冲区,看看会有什么样的现象发生?



           再来最后一个实验,我们将裁减区域减小为移动区域的上半部分,继续执行下移一行的操作,看看最终结果会怎么样?



           好了,现在我们通过归纳可以得出几个结论了,那就是

           一,裁减区域以外的区域不会受文本移动的影响。具体是:

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

    2,裁减区域以外的区域被移动到他处之后原区域不发生变化,因此不需要填充字符。

    总的归纳来说也就是原来是什么样子,文本移动后还是什么样子,不会改变。

           二,裁减区域以内的区域受文本移动的影响。具体是:

    1,当裁减区域以内的区域被移动到他处造成该区域为空时会被设定的字符填充,

    2,裁减区域以内的区域会被移动过来的区域覆盖。

    总的归纳来说也就是完全受文本移动的影响,移动过来就被覆盖,被移走就由设定的字符来填充



    七:键盘事件


     输入事件中的键盘事件通常有字符事件和按键事件,这些事件的附带信息构成了键盘输入的信息,而想要读取这些信息,是要通过API函数ReadConsoleInput来获取的,函数原型如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. BOOL ReadConsoleInput(              //读取输入信息  
    2.     HANDLE hConsoleInput,           //句柄  
    3.     PINPUT_RECORD lpBuffer,         //输入事件结构体的指针  
    4.     DWORD nLength,                  //要读取的记录数  
    5.     LPDWORD lpNumberOfEventsRead    //用来接受成功读取记录数的指针  
    6. );  //如果该函数成功调用,返回非零值  
    7. //输入事件结构体的指针可以是结构体数组的首地址,这样就可以一次性读取多个记录数。  


           下面介绍几个和读取键盘输入事件有关的结构体,各结构体原型如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. typedef struct _INPUT_RECORD    //输入事件结构体  
    2. {  
    3.     WORD  EventType;    //事件类型  
    4.     union  
    5.     {  
    6.         KEY_EVENT_RECORD          KeyEvent;     //按键事件  
    7.         MOUSE_EVENT_RECORD        MouseEvent;   //鼠标事件  
    8.         WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;  
    9.         MENU_EVENT_RECORD         MenuEvent;  
    10.         FOCUS_EVENT_RECORD        FocusEvent;  
    11.     } Event;    //具体的事件  
    12. } INPUT_RECORD;  
    13. /* 
    14. 其中事件类型EventType的值有5种 
    15. KEY_EVENT                   代表Event包含一个KEY_EVENT_RECODE结构体 
    16. MOUSE_EVENT                 代表Event包含一个MOUSE_EVENT_RECODE结构体 
    17. WINDOW_BUFFER_SIZE_EVENT    代表Event包含一个WINDOW_BUFFER_SIZE_EVENT_RECORD结构体 
    18. MENU_EVENT                  代表Event包含一个MENU_EVENT_RECORD结构体 
    19. FOCUS_EVENT                 代表Event包含一个FOCUS_EVENT_RECORD结构体 
    20. */  
    21.   
    22. typedef struct _KEY_EVENT_RECORD    //键盘事件结构体   
    23. {  
    24.     BOOL  bKeyDown;             //按键状态,true代表键按下,false代表键释放  
    25.     WORD  wRepeatCount;         //按键次数  
    26.     WORD  wVirtualKeyCode;      //虚拟键  
    27.     WORD  wVirtualScanCode;     //虚拟键扫描码  
    28.     union  
    29.     {  
    30.         WCHAR UnicodeChar;      //解释成Unicode宽字符  
    31.         CHAR  AsciiChar;        //解释成ASCII码字符  
    32.     } uChar;  
    33.     DWORD dwControlKeyState;    //控制键状态  
    34. } KEY_EVENT_RECORD;  
    35. /* 
    36. 控制键各状态的值 
    37. ENHANCED_KEY        扩展键被按下 
    38. LEFT_ALT_PRESSED    左Alt键被按下 
    39. LEFT_CTRL_PRESSED   左Ctrl键被按下 
    40. RIGHT_ALT_PRESSED   右Alt键被按下 
    41. RIGHT_CTRL_PRESSED  右Ctrl键被按下 
    42. NUMLOCK_ON          数字锁定被打开 
    43. SCROLLLOCK_ON       滚动锁定被打开 
    44. CAPSLOCK_ON         大写锁定被打开 
    45. SHIFT_PRESSED       Shift键被按下 
    46. */  

           当输入事件为键盘事件时,事件类型就为键盘事件,为其他事件时,事件类型就为对应的事件。另外,键盘上每个有意义的键都对应着一个唯一的扫描码,虽然扫描码可以作为键的标识,但是它是依赖于具体的设备的。因此,在应用程序中,使用的往往是与具体设备无关的虚拟键代码。这种虚拟键代码是一种与具体设备无关的键盘编码。而控制键状态比如大写锁定开启状态,Ctrl键按下状态等、、、


           下面是部分常用虚拟键代码表:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. /* 
    2. 虚拟键代码      值          键名称 
    3. -----------------------------------------------------             
    4. VK_BACK         0x08        退格键 
    5. VK_TAB          0x09        Tab键 
    6. VK_RETURN       0x0D        回车键 
    7. VK_SHIFT        0x10        Shift键 
    8. VK_LSHIFT       0xA0        左Shift键 
    9. VK_RSHIFT       0xA1        右Shift键 
    10. VK_CONTROL      0x11        Ctrl键 
    11. VK_LCONTROL     0xA2        左Ctrl键 
    12. VK_RCONTROL     0xA3        右Ctrl键 
    13. VK_MENU         0x12        Alt键 
    14. VK_LMENU        0xA4        左Alt键 
    15. VK_RMENU        0xA5        右Alt键 
    16. VK_PAUSE        0x13        Pause键 
    17. VK_CAPITAL      0x14        Caps Lock键 
    18. VK_NUMLOCK      0x90        Num Lock键 
    19. VK_SCROLL       0x91        Scroll Lock键 
    20. VK_ESCAPE       0x1B        Esc键 
    21. VK_SPACE        0x20        空格键 
    22. VK_PRIOR        0x21        Page Up键 
    23. VK_NEXT         0x22        Page Down键 
    24. VK_END          0x23        End键 
    25. VK_HOME         0x24        Home键 
    26. VK_LEFT         0x25        左方向键 
    27. VK_UP           0x26        上方向键 
    28. VK_RIGHT        0x27        右方向键 
    29. VK_DOWN         0x28        下方向键 
    30. VK_DELETE       0x2E        Delete键 
    31. VK_INSERT       0x2D        Insert键 
    32. '0'             0x30        0键(非小键盘) 
    33. '1'             0x31        1键(非小键盘) 
    34. '2'             0x32        2键(非小键盘) 
    35. ...             ...         ... 
    36. '9'             0x39        9键(非小键盘) 
    37. 'A'             0x41        A键 
    38. 'B'             0x42        B键 
    39. ...             ...         ... 
    40. 'Z'             0x5A        Z键 
    41. VK_SLEEP        0x5F        Sleep键 
    42. VK_NUMPAD0      0x60        小键盘0键 
    43. VK_NUMPAD1      0x61        小键盘1键 
    44. VK_NUMPAD2      0x62        小键盘2键 
    45. ...             ...         ... 
    46. VK_NUMPAD9      0x69        小键盘9键 
    47. VK_MULTIPLY     0x6A        小键盘乘键* 
    48. VK_ADD          0x6B        小键盘加键+ 
    49. VK_SUBTRACT     0x6D        小键盘减键- 
    50. VK_DIVIDE       0x6F        小键盘除键/ 
    51. VK_DECIMAL      0x6E        小键盘点键. 
    52. VK_F1           0x70        F1键 
    53. VK_F2           0x71        F2键 
    54. ...             ...         ... 
    55. VK_F12          0x7B        F12键 
    56. VK_F13          0x7C        F13键      注:别问我,我也不知道什么电脑有这么多键 
    57. ...             ...         ... 
    58. VK_F24          0x87        F24键 
    59. VK_OEM_1        0xBA        ;:键 
    60. VK_OEM_2        0xBF        /?键 
    61. VK_OEM_3        0xC0        ·~键 
    62. VK_OEM_4        0xDB        [{键 
    63. VK_OEM_5        0xDC        \|键 
    64. VK_OEM_6        0xDD        ]}键 
    65. VK_OEM_7        0xDE        '"键 
    66. VK_OEM_PLUS     0xBB        =+键 
    67. VK_OEM_MINUS    0xBD        -_键 
    68. VK_OEM_COMMA    0xBC        ,<键 
    69. VK_OEM_PERIOD   0xBE        .>键  
    70. */  

           以上是部分常用的微软虚拟键盘码表,想要知道更详细的,请参见MSDN。其中各个虚拟键的具体使用情况根据各人编译器或IDE等的不同而有所差异。下面是一个实现按Esc键就输出Esc的样例程序:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <windows.h>  
    4. #include <conio.h>  
    5. #define true 1  
    6. #define false 0  
    7.   
    8. int main()  
    9. {  
    10.     HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);      //获得标准输入设备句柄  
    11.     INPUT_RECORD keyrec;        //定义输入事件结构体  
    12.     DWORD res;      //定义返回记录  
    13.     for (;;)  
    14.     {  
    15.         ReadConsoleInput(handle_in, &keyrec, 1, &res);      //读取输入事件  
    16.         if (keyrec.EventType == KEY_EVENT)      //如果当前事件是键盘事件  
    17.         {  
    18.             if (keyrec.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) //当前事件的虚拟键为Esc键  
    19.             {  
    20.                 printf("Esc ");  
    21.             }  
    22.         }  
    23.     }  
    24.     return 0;  
    25. }  

           在上面的样例程序中,当你按下Esc键后又马上释放,程序会输出两次Esc,因为有两次事件的虚拟键代码都是Esc键的代码,一次是按下,一次是释放。如果要实现按下键后出现反应,释放不出现反应,那么将上例程序中第18行代码的条件改成

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. if (keyrec.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE  
    2.     && keyrec.Event.KeyEvent.bKeyDown == true)     //表示当前为键按下而不是键释放  
    就行了。


           根据控制键的状态我们可以实现不同的状态输出不同的值以及组合键的实现,下面的样例程序在大写锁定打开时输入A键则输出大写字母A,否则输出小写字母a。而在Shift键被按下的状态是则输出Shift+A以及Shift+a。样例程序如下

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <windows.h>  
    4. #include <conio.h>  
    5. #define true 1  
    6. #define false 0  
    7.   
    8. int main()  
    9. {  
    10.     HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);      //获得标准输入设备句柄  
    11.     INPUT_RECORD keyrec;        //定义输入事件结构体  
    12.     DWORD res;      //定义返回记录  
    13.     for (;;)  
    14.     {  
    15.         ReadConsoleInput(handle_in, &keyrec, 1, &res);      //读取输入事件  
    16.         if (keyrec.EventType == KEY_EVENT)      //如果当前事件是键盘事件  
    17.         {  
    18.             if (keyrec.Event.KeyEvent.wVirtualKeyCode == 'A'  
    19.                 && keyrec.Event.KeyEvent.bKeyDown == true)   //当按下字母A键时  
    20.             {  
    21.                 if (keyrec.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED)    //Shift键为按下状态  
    22.                 {  
    23.                     printf("Shift+");  
    24.                 }  
    25.                 if (keyrec.Event.KeyEvent.dwControlKeyState & CAPSLOCK_ON)  //大写锁定为打开状态  
    26.                 {  
    27.                     printf("A ");  
    28.                 }  
    29.                 else        //大写锁定关闭状态  
    30.                 {  
    31.                     printf("a ");  
    32.                 }  
    33.             }  
    34.         }  
    35.     }  
    36.     return 0;  
    37. }  

           由上例需要了解到的是,各个控制键状态的的确定并不是使用等于符号==而是按位与&运算符,因为在同一时刻可能有多种控制键状态值,比如各种锁定都被打开且各种控制键也被同时按下。使用&运算符则显得尤其高明,方便查询各个控制键的状态而不使之出现冲突。呵呵,不服不行啊,感慨一下,还是要多学习一下别人高明的地方,比如灵活运用位运算符实现各种功能等等······



    八:鼠标事件


    上次讲的是键盘事件,这次我们介绍鼠标事件。下面先介绍下鼠标事件的结构体以及相关信息。

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. typedef struct _MOUSE_EVENT_RECORD      //鼠标事件结构体  
    2. {  
    3.     COORD dwMousePosition;      //当前鼠标在控制台窗口缓冲区的位置  
    4.     DWORD dwButtonState;        //鼠标按键的状态  
    5.     DWORD dwControlKeyState;    //控制键状态  
    6.     DWORD dwEventFlags;         //鼠标事件类型  
    7. } MOUSE_EVENT_RECORD;  
    8. /* 
    9. 其中鼠标按键状态dwButtonState可能的值有 
    10. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    11. FROM_LEFT_1ST_BUTTON_PRESSED        最左边的鼠标键被按下      一般来说就是鼠标左键 
    12. FROM_LEFT_2ND_BUTTON_PRESSED        左起第二个鼠标键被按下    一般来说是鼠标中键,就是滚轮键 
    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. 鼠标事件类型dwEventFlags有以下几种 
    30. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    31. DOUBLE_CLICK            双击,第一击只作为普通按键事件,第二击才作为双击事件 
    32. MOUSE_HWHEELED          水平鼠标滚轮移动 
    33. MOUSE_MOVED             鼠标移动 
    34. MOUSE_WHEELED           垂直鼠标滚轮移动 
    35. 0                       当鼠标有键被按下或者释放 
    36. */  


           下面给一个样例程序,实现在控制台窗口缓冲区的最下面一行显示当前鼠标在缓冲区的坐标,单击左键在当前鼠标位置输出字母A,单击右键则输出字母B,双击任何鼠标键退出的功能。程序如下:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    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(COORD 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_RECORD mouserec;      //定义输入事件结构体  
    18.     DWORD res;      //用于存储读取记录  
    19.     COORD pos;      //用于存储鼠标当前位置  
    20.     COORD 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.Event.MouseEvent.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.     COORD 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. }  


           附上用本程序写的Hello world!的图:


           注意:当使用system函数后鼠标事件无法正常发生。


    展开全文
  • 一个简单的应用程序,在您的JVM GUI运行时隐藏JVM控制台窗口
  • 控制台窗口登录源码 cmd登录
  • 参考资料①-C语言控制台窗口界面编程 1、解决C语言设置窗口缓冲区问题 2、学习Windows控制台窗口界面知识
  • 控制台窗口托盘图标

    热门讨论 2012-03-22 11:55:15
    这个小程序是实现控制台窗口的托盘图标的小功能。有兴趣的可以看看。
  • 控制台窗口(console)

    千次阅读 2020-08-20 22:32:50
    在Qt项目开发过程中,经常有用到输出调试信息的时候,为了能实时的查看软件运行的状态,我们使用一个控制台窗口来专门输出调试信息,不需要的时候还可以控制隐藏掉它; #include <Windows.h> int main() { ...

    在Qt项目开发过程中,经常有用到输出调试信息的时候,为了能实时的查看软件运行的状态,我们使用一个控制台窗口来专门输出调试信息,不需要的时候还可以控制隐藏掉它;

    #include <Windows.h>

    int  main()
    {
    
     AllocConsole();
    
    freopen("CONOUT$","w",stdout);
    
    
    return 0;
    }

    main函数中的俩句代码就是用来显示控制台调试窗口的,我们可以利用代码判断来控制是否显示控制台窗口,从而达到使用的要求

    printf("只要包含了Windows.h头文件就可以用printf输出调试信息\n");

    #include <iostream>

    using namespace std;

    cout<<"要使用cout输出需要包含iostream和using namespace std"<<endl;

    展开全文
  • 控制台窗口登录源码 cmd登录
  • 控制台窗口操作

    千次阅读 2012-02-06 21:59:49
    用于控制台窗口操作的API函数如下: GetConsoleScreenBufferInfo 获取控制台窗口信息 GetConsoleTitle 获取控制台窗口标题 ScrollConsoleScreenBuffer 在缓冲区中移动数据块 SetConsoleScreenBufferSize 更改...
     用于控制台窗口操作的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 strTitle[255];
    GetConsoleTitle(strTitle, 255); // 获取窗口标题
    printf("当前窗口标题是:%s\n", 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)。

      四、文本属性操作

      与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中得到。

      五、文本输出

      文本输出函数有:

    BOOL FillConsoleOutputCharacter( // 填充指定数据的字符
    HANDLE hConsoleOutput, // 句柄
    TCHAR cCharacter, // 字符
    DWORD nLength, // 字符个数
    COORD dwWriteCoord, // 起始位置
    LPDWORD lpNumberOfCharsWritten // 已写个数
    );

    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的功能。不过在具体使用要注意它们的区别。
    展开全文
  • 控制台窗口最小化到托盘,点击最小化后的托盘图标恢复 Console opens, you press minimize, it minimizes to tray, you click icon, it maximizes
  • 让Win32窗口程序拥有控制台窗口

    千次阅读 2017-07-31 22:26:23
    让Win32窗口程序拥有控制台窗口  首先,为什么我们有了普通窗口后还要控制台窗口呢?因为我们可以用它方便的输出调试信息,而且普通玩家看到了也会觉得很高端。如果他会输几条命令,可能他会以为自己就是黑客了。 ...
  • .netcore 项目中,项目属性中,输出类型为“控制台应用程序”的,在调试运行时会有控制台窗口弹出,有人需要有人不需要,有人纳闷,调试的时候怎么没有控制台窗口跳出来,这个跟调试服务有关。 如果以IIS Express...
  • 然而,Visual C++的C++专用库却没有TC所支持的文本(字符)屏幕控制函数,为此本系列文章从一般控制步骤、控制台窗口操作、文本(字符)控制、滚动和移动光标、键盘和鼠标等几个方面讨论控制台窗口界面的编程控制方法。
  • 在基于对话框的mfc程序中,添加控制台窗口用于输出提示信息
  • 介绍控制台窗口界面如何设计,使控制台界面也能好看
  • 在基于对话框的mfc程序中,添加控制台窗口用于显示输出信息。
  • C语言隐藏控制台窗口

    2020-05-27 20:18:37
    隐藏C语言程序运行的黑窗口,在VS的开头加入下面的预编译命令: (预编译,Linker链接,windows模式,黑窗口是dos模式) #pragma comment(linker, "/subsystem:\"windows\" /entry:\...就可以隐藏控制台窗口了 ...
  • 隐藏控制台窗口

    千次阅读 2014-07-09 15:56:53
    在做opencv实验的时候发现了一个十分有趣的东西,那就是通过使用#pragma //隐藏控制台窗口 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
  • C# 控制台程序 隐藏控制台窗口

    千次阅读 2017-12-08 11:45:50
    在某些项目中,需要采用控制台程序,但是又不需要通过dos窗口进行交互,同时打算隐藏掉难看的控制台窗口。实现的方法很多,有的是修改链接命令。我采用的方法略有些麻烦,首先是给窗口命名,之后找到该窗口指针,...
  • C++隐藏控制台窗口

    千次阅读 2018-07-16 17:06:36
    最近遇到了C++控制台窗口需要隐藏的问题,记录下结局办法,供以后参考。   #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )    在程序中加上...
  • windows 控制台窗口也可以接收窗口消息,例子中接收了WM_COPYDATA消息,其实还可以接收其他消息。使用时只需用TestMessage进程给TestMessage2进程发送消息即可。
  • IDEA 打开多个控制台窗口 运行程序

    万次阅读 多人点赞 2019-08-02 19:54:21
    Netty 实现客户端之间通信聊天(控制台) 问题: 测试程序时,不能同时运行多个...IDEA 程序不能向eclipse一样 打开多个控制台窗口运行程序 解决: 勾选后OK即可 成功实现多个控制台窗口 运行程序 *** ...
  • 使用C语言写的一个小项目,在cmd控制台窗口实现的双人象棋,学艺不精,代码风格拙劣,代码量也很多,还请看官多多担待。
  • 在我们进行mfc编程和win32窗口编程时,会发现没有控制台窗口其实有时候很无助的,想展示一个数据,要么msg要么debug,但是往往最熟悉的还是那个黑色的窗口 方法: AllocConsole() ; 此函数会为当前进程分配一个...
  • IDEA 插件开发 创建一个控制台窗口

    千次阅读 2020-08-18 15:39:30
    文章目录IDEA 插件开发 创建一个控制台窗口 IDEA 插件开发 创建一个控制台窗口 package com.wretchant.fredis.util; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; ...
  • Visual Studio 设置控制台窗口位置

    千次阅读 2021-01-13 16:40:48
    Visual Studio 2008 控制台窗口默认生成的位置是固定在屏幕左上角的,每次都在同一个地方,如下图,很是不方便,有什么办法可以设置一下呢? 方法: 控制台窗口上边栏,右键-->属性 在弹出的窗口里设置就...
  • CONCPY复制显示的控制台窗口的文本,并将其写入剪贴板或文件。 也就是说,在窗口右边缘包裹的长行也将被包裹在复制的文本中。 制表符停止符将替换为控制台窗口中的空格。 尾随空格被剥离。 该工具在窗口缓冲区的开头...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 172,012
精华内容 68,804
关键字:

控制台窗口