C語言控制台視窗圖形介面編程之八 滑鼠事件

來源:互聯網
上載者:User

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

typedef struct _MOUSE_EVENT_RECORD      //滑鼠事件結構體    {        COORD dwMousePosition;      //當前滑鼠在控制台視窗緩衝區的位置        DWORD dwButtonState;        //滑鼠按鍵的狀態        DWORD dwControlKeyState;    //修飾鍵狀態        DWORD dwEventFlags;         //滑鼠事件類型    } MOUSE_EVENT_RECORD;    /*   其中滑鼠按鍵狀態dwButtonState可能的值有   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   FROM_LEFT_1ST_BUTTON_PRESSED        最左邊的滑鼠鍵被按下      一般來說就是滑鼠左鍵   FROM_LEFT_2ND_BUTTON_PRESSED        左起第二個滑鼠鍵被按下    一般來說是滑鼠中鍵,就是滾輪鍵   FROM_LEFT_3RD_BUTTON_PRESSED        左起第三個滑鼠鍵被按下   FROM_LEFT_4TH_BUTTON_PRESSED        左起第四個滑鼠鍵被按下   RIGHTMOST_BUTTON_PRESSED            最右邊的滑鼠鍵被按下      一般來說是滑鼠右鍵   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   修飾鍵狀態dwControlKeyState與鍵盤事件的一樣   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   ENHANCED_KEY        擴充鍵被按下    LEFT_ALT_PRESSED    左Alt鍵被按下    LEFT_CTRL_PRESSED   左Ctrl鍵被按下    RIGHT_ALT_PRESSED   右Alt鍵被按下    RIGHT_CTRL_PRESSED  右Ctrl鍵被按下    NUMLOCK_ON          數字鎖定被開啟    SCROLLLOCK_ON       滾動鎖定被開啟    CAPSLOCK_ON         大寫鎖定被開啟    SHIFT_PRESSED       Shift鍵被按下   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   滑鼠事件類型dwEventFlags有以下幾種   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   DOUBLE_CLICK            雙擊,第一擊只作為普通按鍵事件,第二擊才作為雙擊事件   MOUSE_HWHEELED          水平滑鼠滾輪移動   MOUSE_MOVED             滑鼠移動   MOUSE_WHEELED           垂直滑鼠滾輪移動   0                       當滑鼠有鍵被按下或者釋放   */

本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/

下面給一個範例程式,實現在控制台視窗緩衝區的最下面一行顯示當前滑鼠在緩衝區的座標,單擊左鍵在當前滑鼠位置輸出字母A,單擊右鍵則輸出字母B,雙擊任何滑鼠鍵退出的功能。程式如下:

#include <stdio.h>    #include <windows.h>    #include <conio.h>            HANDLE handle_in;    HANDLE handle_out;    CONSOLE_SCREEN_BUFFER_INFO csbi;        //定義視窗緩衝區資訊結構體            void DisplayMousePosition(COORD pos);   //顯示滑鼠所在位置            void gotoxy(int x, int y);  //將游標移到座標為(x,y)的位置            int main()    {        handle_in = GetStdHandle(STD_INPUT_HANDLE);      //獲得標準輸入裝置控制代碼        handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //獲得標準輸出裝置控制代碼        INPUT_RECORD mouserec;      //定義輸入事件結構體        DWORD res;      //用於儲存讀取記錄        COORD pos;      //用於儲存滑鼠當前位置        COORD size = {80, 25};  //視窗緩衝區大小        GetConsoleScreenBufferInfo(handle_out, &csbi);  //獲得視窗緩衝區資訊        SetConsoleScreenBufferSize(handle_out, size);   //設定視窗緩衝區大小        for (;;)        {            ReadConsoleInput(handle_in, &mouserec, 1, &res);      //讀取輸入事件            pos = mouserec.Event.MouseEvent.dwMousePosition;    //獲得當前滑鼠位置            gotoxy(0, 24);  //在第25行顯示滑鼠位置            DisplayMousePosition(pos);      //顯示滑鼠位置            if (mouserec.EventType == MOUSE_EVENT)    //如果當前為滑鼠事件            {                gotoxy(pos.X, pos.Y);                //單擊滑鼠左鍵,輸出字元A                if (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)                {                    putchar('A');                }                //單擊滑鼠右鍵,輸出字元B                if (mouserec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)                {                    putchar('B');                }                //雙擊退出                if (mouserec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)                {                    break;                }            }        }        CloseHandle(handle_out);        CloseHandle(handle_in);        return 0;    }            void DisplayMousePosition(COORD pos)    {        COORD dis = {0, 24};        //在第24行顯示滑鼠位置        WORD att = FOREGROUND_GREEN | FOREGROUND_INTENSITY; //文字屬性        GetConsoleScreenBufferInfo(handle_out, &csbi);  //獲得視窗緩衝區資訊        printf("X = %3d, Y = %3d", (int)pos.X, (int)pos.Y);        FillConsoleOutputAttribute(handle_out, att, 16, dis, NULL);  //填充文字屬性        return;    }            void gotoxy(int x, int y)    {        COORD pos = {x, y};        SetConsoleCursorPosition(handle_out, pos);    }

附上用本程式寫的Hello world!的圖:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.