日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言】控制台窗口图形界面编程(七):鼠标事件

發布時間:2024/4/24 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言】控制台窗口图形界面编程(七):鼠标事件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. INPUT_RECORD結構
    • 02. MOUSE_EVENT_RECORD結構
    • 03. ReadConsoleInput函數
    • 04. 示例程序

01. INPUT_RECORD結構

描述控制臺輸入緩沖區中的輸入事件。可以使用ReadConsoleInputPeekConsoleInput函數從輸入緩沖區讀取這些記錄,也可以使用WriteConsoleInput函數將這些記錄寫入輸入緩沖區。

類型聲明:

typedef struct _INPUT_RECORD {WORD EventType;union {KEY_EVENT_RECORD KeyEvent;MOUSE_EVENT_RECORD MouseEvent;WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;MENU_EVENT_RECORD MenuEvent;FOCUS_EVENT_RECORD FocusEvent;} Event; } INPUT_RECORD;

EventType

輸入事件類型的句柄和存儲在Event成員中的事件記錄。

該成員可以是以下值之一。

值含義
FOCUS_EVENT 0x0010事件成員包含一個FOCUS_EVENT_RECORD結構。這些事件在內部使用,應該被忽略。
KEY_EVENT 0x0001事件成員包含一個KEY_EVENT_RECORD結構有關鍵盤事件的信息。
MENU_EVENT 0x0008事件成員包含一個MENU_EVENT_RECORD結構。這些事件在內部使用,應該被忽略。
MOUSE_EVENT 0x0002所述事件構件包含MOUSE_EVENT_RECORD結構用約鼠標移動或按鍵按壓事件的信息。
WINDOW_BUFFER_SIZE_EVENT 0x0004事件成員包含一個WINDOW_BUFFER_SIZE_RECORD結構有關控制臺屏幕緩沖區的新大小信息。

事件
事件信息。此成員的格式取決于EventType成員指定的事件類型。

02. MOUSE_EVENT_RECORD結構

描述控制臺INPUT_RECORD結構中的鼠標輸入事件。

類型聲明:

typedef struct _MOUSE_EVENT_RECORD {COORD dwMousePosition;DWORD dwButtonState;DWORD dwControlKeyState;DWORD dwEventFlags; } MOUSE_EVENT_RECORD;

成員說明

dwMousePosition
一個COORD結構,它根據控制臺屏幕緩沖區的字符單元格坐標包含光標的位置。

dwButtonState
鼠標按鈕的狀態。最低有效位對應于最左邊的鼠標按鈕。下一個最低有效位對應于最右邊的鼠標按鈕。下一位表示從左到右的鼠標按鈕。然后,這些位從左到右對應鼠標按鈕。如果按下按鈕,則位為1。

為前五個鼠標按鈕定義了以下常量。

值含義
FROM_LEFT_1ST_BUTTON_PRESSED 0x0001最左邊的鼠標按鈕。一般來說鼠標左鍵
FROM_LEFT_2ND_BUTTON_PRESSED 0x0004左起第二個按鈕。一般來說是鼠標中鍵,就是滾輪鍵
FROM_LEFT_3RD_BUTTON_PRESSED 0x0008左起第三個按鈕。
FROM_LEFT_4TH_BUTTON_PRESSED 0x0010左起第四個按鈕。
RIGHTMOST_BUTTON_PRESSED 0x0002最右邊的鼠標按鈕。一般來說鼠標右鍵

dwControlKeyState
控制鍵的狀態。該成員可以是以下一個或多個值。

值含義
CAPSLOCK_ON 0x0080大寫鎖定被打開
ENHANCED_KEY 0x0100擴展鍵被按下
LEFT_ALT_PRESSED 0x0002按下左ALT鍵。
LEFT_CTRL_PRESSED 0x0008按下左CTRL鍵。
NUMLOCK_ON 0x0020數字鎖定被打開
RIGHT_ALT_PRESSED 0x0001按下右ALT鍵。
RIGHT_CTRL_PRESSED 0x0004按下右CTRL鍵。
SCROLLLOCK_ON 0x0040滾動鎖定被打開
SHIFT_PRESSED 0x0010按下SHIFT鍵。

dwEventFlags
鼠標事件的類型。如果此值為零,則表示正在按下或釋放鼠標按鈕。否則,此成員是以下值之一。

值含義
DOUBLE_CLICK 0x0002雙擊的第二次單擊(按下按鈕)發生。第一次單擊作為常規按鈕事件返回。
MOUSE_HWHEELED 0x0008水平鼠標滾輪被移動了。如果dwButtonState成員的高位字包含正值,則輪子向右旋轉。否則,車輪向左旋轉。
MOUSE_MOVED 0x0001發生了鼠標位置的變化。
MOUSE_WHEELED 0x0004垂直鼠標滾輪被移動。如果dwButtonState成員的高位字包含正值,則輪向前旋轉,遠離用戶。否則,車輪向后旋轉,朝向用戶。

03. ReadConsoleInput函數

從控制臺輸入緩沖區讀取數據并將其從緩沖區中刪除。

函數聲明:

BOOL WINAPI ReadConsoleInput(_In_ HANDLE hConsoleInput,_Out_ PINPUT_RECORD lpBuffer,_In_ DWORD nLength,_Out_ LPDWORD lpNumberOfEventsRead ); 功能:從控制臺輸入緩沖區讀取數據并將其從緩沖區中刪除。 參數:hConsoleInput 控制臺輸入緩沖區的句柄。句柄必須具有GENERIC_READ訪問權限。lpBuffer 指向接收輸入緩沖區數據的INPUT_RECORD結構數組的指針。nLength 數組元素中lpBuffer參數 指向的數組大小。lpNumberOfEventsRead 指向接收讀取的輸入記錄數的變量的指針。返回值:如果函數成功,則返回值為非零值。如果函數失敗,則返回值為零。要獲取擴展錯誤信息,請調用GetLastError。

官方參考網址:https://docs.microsoft.com/en-us/windows/console/readconsoleinput

04. 示例程序

#include<stdio.h> #include<string.h> #include<stdlib.h>#include <Windows.h> #include <conio.h>int main(void) {//定義句柄變量HANDLE hOut = NULL;HANDLE hIn = NULL;//定義輸入事件結構體INPUT_RECORD mouseRecord;//用于存儲讀取記錄DWORD res;//用于存儲鼠標當前位置COORD pos;//獲取標準輸出句柄hOut = GetStdHandle(STD_OUTPUT_HANDLE);//獲取標準輸入句柄hIn = GetStdHandle(STD_INPUT_HANDLE);while (1){//讀取輸入事件ReadConsoleInput(hIn, &mouseRecord, 1, &res);//獲取鼠標當前位置pos = mouseRecord.Event.MouseEvent.dwMousePosition;//如果當前事件是鼠標事件if (mouseRecord.EventType == MOUSE_EVENT){//單擊鼠標左鍵if (mouseRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){printf("鼠標左鍵單擊 x: %d y: %d\n", pos.X, pos.Y);}//單擊鼠標右鍵if (mouseRecord.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED){printf("鼠標右鍵單擊 x: %d y: %d\n", pos.X, pos.Y);}//如果是雙擊就退出循環if (mouseRecord.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK){break;}}}//關閉句柄CloseHandle(hOut);CloseHandle(hIn);//system("pause");getchar();return 0; }

總結

以上是生活随笔為你收集整理的【C语言】控制台窗口图形界面编程(七):鼠标事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。