控制台窗口界面的编程控制(六)

2016-02-19 18:08 33 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】


    十、读取鼠标信息
  
  与读取键盘信息方法相似,鼠标信息也是通过ReadConsoleInput来获取的,其MOUSE_EVENT_RECORD具有下列定义:
  
  typedef strUCt _MOUSE_EVENT_RECORD {
   COORD dwMousePosition; // 当前鼠标位置
   DWord dwButtonState; // 鼠标按钮状态
   DWORD dwControlKeyState; // 键盘控制键状态
   DWORD dwEventFlags; // 事件状态
  } MOUSE_EVENT_RECORD;
  
  其中,dwButtonState反映了用户按下鼠标按钮的情况,它可以是:FROM_LEFT_1ST_BUTTON_PRESSED(最左边按钮)、RIGHTMOST_BUTTON_PRESSED(最右边按钮)、FROM_LEFT_2ND_BUTTON_PRESSED(左起第二个按钮)、FROM_LEFT_3RD_BUTTON_PRESSED(左起第三个按钮)和FROM_LEFT_4TH_BUTTON_PRESSED (左起第四个按钮)。而dwEventFlags表示鼠标的事件,如DOUBLE_CLICK(双击)、MOUSE_MOVED(移动)和MOUSE_WHEELED(滚轮滚动,只适用于windows 2000/XP)。dwControlKeyState的含义同前。
  
  下面举一个例子。这个例子能把鼠标的当前位置显示在控制台窗口的最后一行上,若单击鼠标左键,则在当前位置处写一个字符‘A’,若双击鼠标任一按钮,则程序终止。具体代码如下:
  
  #include <WINDOWS.H>
  #include <STDIO.H>
  #include <STRING.H>
  HANDLE hOut;
  HANDLE hIn;
  void ClearScreen(void);
  void DispMousePos(COORD pos); // 在最后一行显示鼠标位置
  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 mouseRec;
   DWORD state = 0, res;
   COORD pos = {0, 0};
   for(;;) // 循环
   {
  ReadConsoleInput(hIn, &mouseRec, 1, &res);
  if (mouseRec.EventType == MOUSE_EVENT){
   if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK) break;
  // 双击鼠标退出循环
  pos = mouseRec.Event.MouseEvent.dwMousePosition;
  DispMousePos(pos);
  if (mouseRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
  FillConsoleOutputCharacter(hOut, 'A', 1, pos, NULL);
   }
  }
  pos.X = 0; pos.Y = 0;
  SetConsoleCursorPosition(hOut, pos); // 设置光标位置
  CloseHandle(hOut); // 关闭标准输出设备句柄
  CloseHandle(hIn); // 关闭标准输入设备句柄
   }
  
  void DispMousePos(COORD pos) // 在最后一行显示鼠标位置
  {
   CONSOLE_SCREEN_BUFFER_INFO bInfo;
   GetConsoleScreenBufferInfo( hOut, &bInfo );
   COORD home = {0, bInfo.dwSize.Y-1};
   WORD att0 = BACKGROUND_INTENSITY ;
   FillConsoleOutputAttribute(hOut, att0, bInfo.dwSize.X, home, NULL);
   FillConsoleOutputCharacter(hOut, ' ', bInfo.dwSize.X, home, NULL);
   char s[20];
   sprintf(s,"X = %2lu, Y = %2lu",pos.X, pos.Y);
   SetConsoleTextAttribute(hOut, att0);
   SetConsoleCursorPosition(hOut, home);
   WriteConsole(hOut, s, strlen(s), NULL, NULL);
   SetConsoleTextAttribute(hOut, bInfo.wAttributes); // 恢复原来的属性
   SetConsoleCursorPosition(hOut, bInfo.dwCursorPosition); // 恢复原来的光标位置
  }
  
  void ClearScreen(void)
  {
   CONSOLE_SCREEN_BUFFER_INFO bInfo;
   GetConsoleScreenBufferInfo( hOut, &bInfo );
   COORD home = {0, 0};
   unsigned long size = bInfo.dwSize.X * bInfo.dwSize.Y;
   FillConsoleOutputAttribute(hOut, bInfo.wAttributes, size, home, NULL);
   FillConsoleOutputCharacter(hOut, ' ', size, home, NULL);
  }
   
  十一、结语
  
  综上所述,利用控制台窗口的Widows API函数可以设计简洁美观的文本界面,使得用Visual C++ 6.0开发环境深入学习C++以及文本界面设计成为一件比较轻易的事件。当然文本界面的设计还需要一定的方法和技巧,限于篇幅,这里不再阐述。
  

来源:https://www.tulaoshi.com/n/20160219/1616863.html

延伸阅读
《求生之路2》控制台命令 打开控制台输入Sv_Cheats 1 下面就是命令代码: god 1 无敌 noclip 穿墙 sv_infinite_ammo 1 无限弹药不换弹夹 give health 加满血 give ammo 加满弹夹 melee_range 70 (预设为70)近战武器的伤害范围数值越高能砍得越远 sb_dont_bash 1 强制电脑队友不用手推 sb_dont_shoot 1 强制电脑队友不开枪 sb_takecontrol * 游...
《骨色争霸》控制台命令 按【 SHIFT+~ 】开启控制台 金钱100W=vegasbaby(gamechar); 无限生命=godlike(gamechar); 增加弹药=goodtimes(gamechar); 完成使命正常=beatThisShit(gamechar); 开启所有的小鸡选择性别店=unlockChicks(gamechar); 未成年人慎入!《骨色争霸》情色游戏将于秋季面市 国外游戏开发商D.Hub今日宣布这款成人级的...
你的电脑有没有摄像头?看到别人用QQ玩视屏你会不会去想怎么实现的? 这里介绍使用DELPHI使用MS的AVICAP32.DLL就可轻松的实现对摄像头编程, 如果再加上你的网络编程水平,实现一个视屏聊天就不成什么问题了。 看看下面代码的代码: const WM_CAP_START = WM_USER; const WM_CAP_STOP = WM_CAP_START + 68; const...
《地铁2033》游戏相关控制台秘籍 WinXP玩家 在 C:\Documents & Settings\X\Local Settings\Application Data\4A Games\Metro 2033\ Vista/7玩家, 在 C:\Users\X\AppData\Local\4A Games\Metro 2033\ 找到user.cfg,找不到的话,在windows控制面板下的文档选项调节显示隐藏文件。 加入代码就可以启动秘籍。有很多选项。 例如:加入 g...
下面就介绍一下,如何隐藏win32 console application的console窗口 因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译 器的链接开关选项(也就是linker选项). 首先我们来看一下linker的 /subsystem 选项 该选项的语法形式如下: /subsystem:{console|efi_application|efi_boot_service_driver| efi_rom|efi_runtime_driver|n...

经验教程

725

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部