C語言控制台窗口圖形界面編程(八):鼠標事件


<知識分享>

上次講的是鍵盤事件,這次我們介紹鼠標事件。下面先介紹下鼠標事件的結構體以及相關信息。


  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,雙擊任何鼠標鍵退出的功能。程序如下:

  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!的圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM