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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

00. 目錄

文章目錄

    • 00. 目錄
    • 01. INPUT_RECORD結(jié)構(gòu)
    • 02. MOUSE_EVENT_RECORD結(jié)構(gòu)
    • 03. ReadConsoleInput函數(shù)
    • 04. 示例程序

01. INPUT_RECORD結(jié)構(gòu)

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

類型聲明:

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結(jié)構(gòu)。這些事件在內(nèi)部使用,應(yīng)該被忽略。
KEY_EVENT 0x0001事件成員包含一個KEY_EVENT_RECORD結(jié)構(gòu)有關(guān)鍵盤事件的信息。
MENU_EVENT 0x0008事件成員包含一個MENU_EVENT_RECORD結(jié)構(gòu)。這些事件在內(nèi)部使用,應(yīng)該被忽略。
MOUSE_EVENT 0x0002所述事件構(gòu)件包含MOUSE_EVENT_RECORD結(jié)構(gòu)用約鼠標(biāo)移動或按鍵按壓事件的信息。
WINDOW_BUFFER_SIZE_EVENT 0x0004事件成員包含一個WINDOW_BUFFER_SIZE_RECORD結(jié)構(gòu)有關(guān)控制臺屏幕緩沖區(qū)的新大小信息。

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

02. MOUSE_EVENT_RECORD結(jié)構(gòu)

描述控制臺INPUT_RECORD結(jié)構(gòu)中的鼠標(biāo)輸入事件。

類型聲明:

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

成員說明

dwMousePosition
一個COORD結(jié)構(gòu),它根據(jù)控制臺屏幕緩沖區(qū)的字符單元格坐標(biāo)包含光標(biāo)的位置。

dwButtonState
鼠標(biāo)按鈕的狀態(tài)。最低有效位對應(yīng)于最左邊的鼠標(biāo)按鈕。下一個最低有效位對應(yīng)于最右邊的鼠標(biāo)按鈕。下一位表示從左到右的鼠標(biāo)按鈕。然后,這些位從左到右對應(yīng)鼠標(biāo)按鈕。如果按下按鈕,則位為1。

為前五個鼠標(biāo)按鈕定義了以下常量。

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

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

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

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

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

03. ReadConsoleInput函數(shù)

從控制臺輸入緩沖區(qū)讀取數(shù)據(jù)并將其從緩沖區(qū)中刪除。

函數(shù)聲明:

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

官方參考網(wǎng)址: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;//定義輸入事件結(jié)構(gòu)體INPUT_RECORD mouseRecord;//用于存儲讀取記錄DWORD res;//用于存儲鼠標(biāo)當(dāng)前位置COORD pos;//獲取標(biāo)準(zhǔn)輸出句柄hOut = GetStdHandle(STD_OUTPUT_HANDLE);//獲取標(biāo)準(zhǔn)輸入句柄hIn = GetStdHandle(STD_INPUT_HANDLE);while (1){//讀取輸入事件ReadConsoleInput(hIn, &mouseRecord, 1, &res);//獲取鼠標(biāo)當(dāng)前位置pos = mouseRecord.Event.MouseEvent.dwMousePosition;//如果當(dāng)前事件是鼠標(biāo)事件if (mouseRecord.EventType == MOUSE_EVENT){//單擊鼠標(biāo)左鍵if (mouseRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){printf("鼠標(biāo)左鍵單擊 x: %d y: %d\n", pos.X, pos.Y);}//單擊鼠標(biāo)右鍵if (mouseRecord.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED){printf("鼠標(biāo)右鍵單擊 x: %d y: %d\n", pos.X, pos.Y);}//如果是雙擊就退出循環(huán)if (mouseRecord.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK){break;}}}//關(guān)閉句柄CloseHandle(hOut);CloseHandle(hIn);//system("pause");getchar();return 0; }

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。