當前位置:首頁 » 編程語言 » c語言按鈕事件
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言按鈕事件

發布時間: 2022-05-23 20:23:58

c語言如何讓點擊關閉按鈕時出現詢問是否退出 若退出則進行操作再退出 最好說明代碼寫在怎麼寫 !!!!!

C語言的代碼大多是命令行程序,並沒有關閉按鈕。
如果你是用C語言調用WINDOWS API寫WINDOWS程序,在消息循環WM_CLOSE
消息裡面彈msgbox,確認是否關閉。

② c語言鍵盤按鍵觸發怎麼表示

可以用FlexibleButton表示。

FlexibleButton 是一個基於標准 C 語言的小巧靈活的按鍵處理庫,支持單擊、連擊、短按、長按、自動消抖,可以自由設置組合按鍵,可用於中斷和低功耗場景。

該按鍵庫解耦了具體的按鍵硬體結構,理論上支持輕觸按鍵與自鎖按鍵,並可以無限擴展按鍵數量。另外,FlexibleButton 使用掃描的方式一次性讀取所有所有的按鍵狀態,然後通過事件回調機制上報按鍵事件。

核心的按鍵掃描代碼僅有三行,沒錯,就是經典的 三行按鍵掃描演算法。使用 C 語言標准庫 API 編寫,也使得該按鍵庫可以無縫兼容任意的處理器平台,並且支持任意 OS 和 non-OS(裸機編程)。

快速體驗:

FlexibleButton 庫中提供了一個測試常式 ./examples/demo_rtt_iotboard.c,該常式基於 RT-Thread OS 進行測試,硬體平台選擇了 RT-Thread IoT Board Pandora v2.51 開發板。

當然你可以選擇使用其他的 OS,或者使用裸機測試,只需要移除 OS 相關的特性即可。

如果你使用自己的硬體平台,只需要將 FlexibleButton 庫源碼和常式加入你既有的工程下即可。

DEMO 程序說明:

該示常式序可以直接在 RT-Thread stm32l475-atk-pandora BSP 中運行,可以在該 BSP 目錄下,使用 menuconfig 獲取本軟體包。

③ c語言怎麼監聽鍵盤按鍵

  1. 在Microsoft Windows 中,鍵盤和滑鼠是兩個標準的用戶輸入源,在一些交疊的操作中通常相互補充使用。當然,滑鼠在今天的應用程序中比10年前使用得更為廣泛。甚至在一些應用程序中,我們更習慣於使用滑鼠,例如在游戲、畫圖程序、音樂程序,以及Web創覽器等程序中就是這樣。然而,我們可以不使用滑鼠,但絕對不能從一般的PC中拆掉鍵盤。
    Windows程序獲得鍵盤輸入的方式:鍵盤輸入以消息的形式傳遞給程序的窗口過程。實際上,第一次學習消息時,鍵盤就是一個明顯的例子:消息應該傳遞給應用程序的信息類型。
    Windows用8種不同的消息來傳遞不同的鍵盤事件。這好像太多了,但是(就像我們所看到的一樣)程序可以忽略其中至少一半的消息而不會有任何問題。並且,在大多數情況下,這些消息中包含的鍵盤信息會多於程序所需要的。處理鍵盤的部分工作就是識別出哪些消息是重要的,哪些是不重要的。
    鍵盤基礎知識
    雖然應用程序在很多情況下可以通過滑鼠實現信息的輸入,但到現在為止鍵盤仍然是PC機中不可替代的重要輸入設備。
    用鍵盤當作輸入設備,每當用戶按下或釋放某一個鍵時,會產生一個中斷,該中斷激活鍵盤驅動程序KEYBOARD.DRV來對鍵盤中斷進行處理。 KEYBOARD.DRV程序會根據用戶的不同操作進行編碼,然後調用Windows用戶模塊USER.EXE生成鍵盤消息,並將該消息發送到消息隊列中等候處理。
    1.掃描碼和虛擬碼
    掃描碼對應著鍵盤上的不同鍵,每一個鍵被按下或釋放時,都會產生一個唯一的掃描碼作為本身的標識。掃描碼依賴於具體的硬體設備,即當相同的鍵被按下或釋放時,在不同的機器上可能產生不同的掃描碼。在程序中通常使用由Windows系統定義的與具體設備無關的虛擬碼。在擊鍵產生掃描碼的同時,鍵盤驅動程序KEYBOARD.DRV截取鍵的掃描碼,然後將其翻譯成對應的虛擬碼,再將掃描碼和虛擬碼一齊編碼形成鍵盤消息。所以,最後發送到消息隊列的鍵盤消息中,既包含了掃描碼又包含了虛擬碼。
    經常使用的虛擬碼在WINDOWS.H文件中定義,常用虛擬碼的數值、常量符號和含義如表所示。

    取值(16進制) 常量符號 含義
    01 VK_LBUTTON 滑鼠左鍵
    02 VK_RBUTTON 滑鼠右鍵
    03 VK_CANCEL Break中斷鍵
    04 VK_MBUTTON 滑鼠中鍵
    05-07 -- 未定義
    08 VK_BACK (BackSpace)鍵
    09 VK_TAB Tab鍵
    0A-0B -- 未定義
    0C VK_CLEAR Clear鍵
    0D VK_RETURN Enter鍵
    0E-0F -- 未定義
    10 VK_SHIFT Shift鍵
    11 VK_CONTROL Ctrl鍵
    12 VK_MENU Alt鍵
    13 VK_PAUSE Pause鍵
    14 VK_CAPTIAL CapsLock鍵
    15-19 -- 漢字系統保留
    1A -- 未定義
    1B VK_ESCAPE Esc鍵
    1C-1F -- 漢字系統保留
    20 VK_SPACE 空格鍵
    21 VK_PRIOR PageUp鍵
    22 VK_NEXT PageDown鍵
    23 VK_END End鍵
    24 VK_HOME Home鍵
    25 VK_LEFT ←(Left Arrow)鍵
    26 VK_UP ↑(Up Arrow)鍵
    27 VK_RIGHT →(Right Arrow)鍵
    28 VK_DOWN ↓(Down Arrow)鍵
    29 VK_SELECT Select鍵
    2A -- OEM保留
    2B VK_EXECUTE Execute鍵
    2C VK_SNAPSHOT Print Screen鍵
    2D VK_INSERT Insert鍵
    2E VK_DELETE Delete鍵
    2F VK_HELP Help鍵
    30-39 VK_0-VK_9 數字鍵0-9
    3A-40 -- 未定義
    41-5A VK_A-VK_Z 字母鍵A-Z
    5B-5F -- 未定義
    60-69 VK_NUMPAD0-VK_NUMPAD9 小鍵盤數字鍵0-9
    6A VK_MULTIPLY *(乘號)鍵
    6B VK_ADD +(加號)鍵
    6C VK_SEPAPATOR 分隔符鍵
    6E VK_SUBTRACT -(減號)鍵
    6F VK_DECIMAL .(小數點)鍵
    70-87 VK_DIVIDE /(除號)鍵
    88-8F VK_F1-VK_F24 F1-F24功能鍵
    90 VK_NUMBERLOCK Number lock鍵
    91 VK_SCROLL Scroll lock鍵
    92-B9 -- 未定義
    BA-C0 -- OEM保留
    C1-DA -- 未定義
    DB_E4 -- OEM保留
    E5 -- 未定義
    E6 -- OEM保留
    E7-E8 -- 未定義
    E9-F5 -- OEM保留
    F6-FE -- 未定義


    2.輸入焦點
    同一時刻,Windows中可能有多個不同的程序在運行,也就是說有多個窗口同時存在。這時,鍵盤由多個窗口共享,但只有一個窗口能夠接收到鍵盤消息,這個能夠接收鍵盤消息的窗口被稱為擁有輸入焦點的窗口。
    擁有輸入焦點的窗口應該是當前的活動窗口,或者是活動窗口的子窗口,其標題和邊框會以高亮度顯示,以區別於其他窗口。擁有輸入焦點的也可以是圖標而不是窗口,此時,Windows也將消息發送給圖標,只是消息的格式略有不同。
    窗口過程可以通過發送WM_SETFOCUS和 WM_KILLFOCUS消息使窗體獲得或失去輸入焦點。程序也可以通過捕獲WM_SETFOCUS和WM_KILLFOCUS消息來判斷窗體何時獲得或失去輸入焦點。其中WM_SETFOCUS消息表示窗口正獲得輸入焦點,WM_ KILLFOCUS消息表示窗口正失去輸入焦點。
    3.鍵盤消息
    鍵盤消息分為系統鍵消息和非系統鍵消息。系統鍵消息是指由Aft鍵和其他鍵組合而產生的按鍵消息。當系統鍵被按下時產生WM_ SYSKEYDOWN消息,當系統鍵被釋放時產生WM_SYSKEYUP消息。 Aft鍵與其他鍵形成的組合鍵通常用於對程序菜單和系統菜單進行選擇,或用於在不同的程序之間進行切換。因此,系統鍵消息應該交由Windows進行處理,用戶所編制的程序一般不處理系統鍵消息,而是將這些消息交由DefWindowProc函數進行處理。如果用戶想對系統鍵消息進行處理,應該在處理完這些消息後,再將其發送給DefWindowProc函數,使得Windows系統能夠正常工作。
    某些擊鍵消息可以被轉換成字元消息,例如字母鍵、數字鍵等。而有些鍵只能產生按鍵消息而沒有字元消息,例如 Shift鍵、Insert鍵等。消息循環中的 TranslateMessage函數可以實現從擊鍵消息向字元消息的轉化。當GetMessage函數捕獲一個WM_SYSKEYDOWN消息或 WM_KEYDOWN消息後,TranslateMessage函數判斷產生該消息的鍵是否能夠被轉換成字元消息,如果能,就將該消息轉換成字元消息,再通過DispatchMessape函數將轉換後的字元消息發送到消息隊列中去。字元消息共有以下四種,如表所示。

    字元 系統字元 非系統字元
    普通字元 WM_SYSCHAR WM_CHAR
    死字元 WM_SYSDEADCHAR WM_DEADCHAR

    其中死字元是由某些特殊鍵盤上的按鍵所造成的,Windows一般忽略死字元所產生的消息。
    Windows的消息一般是通過一個MSG結構體變數傳送給消息處理函數的。對於鍵盤消息, MSG結構體變數的各個域中較重要的是lParam域和 wParam域。wParam域用於保存按鍵的虛擬鍵代碼或字元的ASCII碼。對於非字元消息,wParam域保存按鍵的虛擬健代碼;對於字元消息, wParam域不保存字元的ASCII碼。lParam域則用於保存擊鍵時產生的附加信息,實際上一個32位的lParam變數被分為六部分,記錄了以下相關信息:重復次數、OEM掃描碼、擴展鍵標志、關聯鍵標志、前一擊鍵狀態和轉換狀態。lParam域各位的含義如表所示。

    位數 含義
    0-15 擊鍵重復次數累加
    16-23 OEM掃描碼
    24 是否為擴展鍵
    25-28 未定義
    29 是否便用關聯鍵,及Alt鍵是否同時按下。
    30 前一次擊鍵狀態,0表示該鍵前一次狀態為抬起,1表示前一次狀態為按下
    31 轉換狀態

    按鍵的次序不同,產生的消息也不相同。例如,按下並釋放1鍵,讀過程依次產生如表所示三條消息。按下1鍵所產生的消息和wParam的取值

    消息 wParam變數取值
    WM_KEYDOWN 虛擬碼1
    WM_CHAR ASCII碼「1」
    WM_KEYUP 虛擬碼1

    如果按下Shift鍵後再按下1鍵並釋放,則依次產生如表所示的消息。按下 Shift鍵後按 1健所產生的消息和 wParam的取值

    消息 wParam變數取值
    WM_KEYDOWN 虛擬碼 VK_SHIFT
    WM_KEYDOWN 虛擬碼 VK_1
    WM_CHAR ASCII碼「1」
    WM_KEYUP 虛擬碼 VK_1
    WM_KEYUP 虛擬碼 VK_SHIF


  2. 鍵盤應用實例
    下面通過一個應用程序實例來說明在實際編程中如何處理鍵盤消息。

    #include<windows.h>
    #include<stdio.h>
    //全局變數
    RECTrc;//記錄滾屏的矩形區域
    ?
    intxChar,yChar;//文本輸入點坐標
    WNDCLASSEXwnd;//窗口類結構變數
    charszAppName[]="鍵盤消息監視程序";//窗口類名
    //函數聲明
    LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
    BOOLMyRegisterClass(HINSTANCEhInstance);
    BOOLInitInstance(HINSTANCEhInstance,intiCmdShow);
    //函數:WinMain
    //作用:入口函數
    intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRszCmdLine,intiCmdShow)
    {
    MSGmsg;
    if(!MyRegisterClass(hInstance))
    {
    returnFALSE;
    }

    if(!InitInstance(hInstance,iCmdShow))
    {
    returnFALSE;
    }

    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    returnmsg.wParam;
    }
    //函數:ShowKey
    //作用:實現在窗口中顯示按鍵信息
    voidShowKey(HWNDhwnd,intiType,char*szMessage,WPARAMwParam,LPARAMlParam)
    {
    staticchar*szFormat[2]={"%-14s%3d%c%6u%4d%5s%5s%6s%6s",
    "%-14s%3d%c%6u%4d%5s%5s%6s%6s"};
    charszBuffer[80];
    HDChdc;
    ScrollWindowEx(hwnd,0,-yChar,&rc,&rc,NULL,NULL,SW_INVALIDATE);
    hdc=GetDC(hwnd);
    SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
    TextOut(hdc,
    xChar,
    rc.bottom-yChar,
    szBuffer,
    wsprintfszBuffer,
    szFormat[iType],
    szMessage,//消息
    wParam,//虛擬鍵代碼
    (BYTE)(iType?wParam:『』),//顯示字元值
    LOWORD(lParam),//重復次數
    HIWORD(lParam)&0xFF,//OEM鍵盤掃描碼
    //判斷是否為增強鍵盤的擴展鍵
    (PSTR)(0x01000000&lParam?「是」:「否」),
    //判斷是否同時使用了ALT鍵
    (PSTR)(0x20000000&lParam?「是」:「否」),
    (PSTR)(0x40000000&lParam?「按下」:「抬」),
    //判斷前一次擊鍵狀
    (PSTR)(0x80000000&lParam?「按下」:「抬起」))
    //判斷轉換狀態?
    );
    ReleaseDC(hwnd,hdc);?
    ValidateRect(hwnd,NULL);?
    }
    //函數:WndProc
    //作用:處理主窗口的消息
    LRESULTCALLBACKWndProc(HWNDhwnd,UINTiMsg,WPARAMwParam,LPARAMlParam)
    {
    staticcharszTop[]="消息鍵字元重復數掃描碼擴展碼ALT前一狀態轉換狀態";
    staticcharszUnd[]="______________________________________________";
    //在窗口中輸出文字作為信息標題
    HDChdc;
    PAINTSTRUCTps;
    TEXTMETRICtm;
    switch(iMsg)
    {
    caseWM_CREATE://處理窗口創建的消息
    hdc=GetDC(hwnd);//設定字體
    SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));//檢取當前字體的度量數據
    GetTextMetrics(hdc,&tm);
    xChar=tm.tmAveCharWidth;//保存字體平均寬度
    yChar=tm.tmHeight;//保存字體高度
    ReleaseDC(hwnd,hdc);
    rc.top=3*yChar/2;
    return0;
    caseWM_SIZE://處理窗口大小改變的消息
    //窗體改變後保存新的滾屏區域右下角坐標
    rc.right=LOWORD(lParam);
    rc.bottom=HIWORD(lParam);
    UpdateWindow(hwnd);
    return0;
    caseWM_PAINT://處理窗口重繪消息
    InvalidateRect(hwnd,NULL,TRUE);
    hdc=BeginPaint(hwnd,&ps);
    SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
    SetBkMode(hdc,TRANSPARENT);
    TextOut(hdc,xChar,yChar/2,szTop,(sizeofszTop)-1);
    TextOut(hdc,xChar,yChar/2,szUnd,(sizeofszUnd)-1);
    EndPaint(hwnd,&ps);
    return0;
    caseWM_KEYDOWN:
    //處理鍵盤上某一鍵按下的消息
    ShowKey(hwnd,0,"WM_KEYDOWN",wParam,lParam);
    return0;
    caseWM_KEYUP:
    //處理鍵盤上某一按下鍵被釋放的消息
    ShowKey(hwnd,0,"WM_KEYUP",wParam,lParam);
    return0;
    caseWM_CHAR:
    //處理擊鍵過程中產生的非系統鍵的可見字元消息
    howKey(hwnd,1,"WM_CHAR",wParam,lParam);
    return0;
    caseWM_DEADCHAR:
    //處理擊鍵過程中產生的非系統鍵"死字元"消息
    ShowKey(hwnd,1,"WM_DEADCHAR",wParam,lParam);
    return0;
    caseWM_SYSKEYDOWN:
    //處理系統鍵按下的消息
    ShowKey(hwnd,0,"WM_SYSKEYDOWN",wParam,lParam);
    break;
    caseWM_SYSKEYUP:
    //處理系統鍵抬起的消息
    ShowKey(hwnd,0,"WM_SYSKEYUP",wParam,lParam);
    break;
    caseWM_SYSCHAR://處理系統鍵可見字元消息
    ShowKey(hwnd,1,"WM_SYSCHAR",wParam,lParam);
    break;
    caseWM_SYSDEADCHAR://處理系統鍵"死字元"消息
    ShowKey(hwnd,1,"WM_SYSDEADCHAR",wParam,lParam);
    break;
    caseWM_DESTROY:
    //處理結束應用程序的消息
    PostQuitMessage(0);
    return0;
    }
    returnDefWindowProc(hwnd,iMsg,wParam,lParam);
    }
    //函數:MyRegisterClass
    //作用:注冊窗口類
    BOOLMyRegisterClass(HINSTANCEhInstance)
    {
    wnd.cbSize=sizeof(wnd);
    wnd.style=CS_HREDRAW|CS_VREDRAW;
    wnd.lpfnWndProc=WndProc;
    wnd.cbClsExtra=0;
    wnd.cbWndExtra=0;
    wnd.hInstance=hInstance;
    wnd.hIcon=LoadIcon(NULL,IDI_APPLICATION);?
    wnd.hCursor=LoadCursor(NULL,IDC_ARROW);
    wnd.hbrBackground=(HBRUSH)
    GetStockObject(WHITE_BRUSH);
    wnd.lpszMenuName=NULL;
    wnd.lpszClassName=szAppName;
    wnd.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
    returnRegisterClassEx(&wnd);
    }
    //函數:InitInstance
    //作用:創建主窗口
    BOOLInitInstance(HINSTANCEhInstance,intiCmdShow)
    {
    HWNDhwnd;
    hwnd=CreateWindow(szAppName,
    "鍵盤消息監視程序",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,
    CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,NULL,hInstance,NULL
    );
    if(!hwnd)
    {
    returnFALSE;
    }
    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);
    returnTRUE;
    }

④ 用C語言編寫windows窗體程序,怎麼創建按鈕以及怎麼添加按鈕的觸發事件啊

Windows
窗體程序是基於消息機制的,所有控制項,它的本質都是一個窗體,都是使用
CreateWindows
函數來創建,不過類名,則需要指定為系統預先注冊的控制項類,比如,你要創建一個按鈕控制項,就要這樣子
CreateWindows(
"BUTTON",
"按鈕標題"
),CreateWindows
這個函數你應該用了不少了吧,其餘的參數可以參考
MSDN,但是類名我們指定了
「BUTTON」,說明我們要創建一個按鈕,每個按鈕都有一個唯一的
ID,通過你的消息處理函數,可以知道哪個按鈕發生了什麼事件,詳細講的話,非常多,你可以參考
MSDN,或者《Windows
程序設計》這本書

⑤ 定義一個按鍵,按一下開,再按一下關的c語言程序

定義一個布爾型的全局變數kg,在按鈕事件裡面只需要一句:kg=!kg;

bool kg; //開關
void CTestDlg::OnButton1()
{
kg=!kg;
}

⑥ 求救c語言 如果要檢測兩個鍵同時被按下和鬆手檢測的,要怎麼樣寫呢

C語言 用getch() 可以即時獲得按鍵的鍵值。
如果按下一個鍵,手不移動,根據你的鍵盤設置(按鍵時間長於多少則為新的按鍵),getch()會連續獲得鍵值。
組合鍵將輸出組合鍵的鍵值。
某些鍵,按一次會有2個鍵值,例如 F1,F2...F12, 上下左右箭頭鍵。

Windows 和MFC c++ 程序 可以或的 各種復雜的按鍵「事件」,按著,抬起,按下抬起,你可以測時間間隔,時間延時,可以寫很嚕蘇的程序。

#include<stdlib.h>
#include<stdio.h>
void main()
{
int i;
int key,key2;
// 普通鍵用 getch();取得
key = getch();
printf("\nkey value = 0x%02x -- %d\n",key,key);
key = getch();
printf("\nkey value = 0x%02x -- %d\n",key,key);
key = getch();
printf("\nkey value = 0x%02x -- %d\n",key,key);
key = getch();
printf("\nkey value = 0x%02x -- %d\n",key,key);
// 箭頭鍵
if (key == 0xe0) {
key = getch();
printf("\nkey value = %02x -- %d\n",key,key);
};
// F1鍵
if (key == 0) {
key2 = getch();
printf("\nkey value = %02x\n",key2);
switch (key2) {
case 0x003b: printf("F1 key");break;
case 0x003c: printf("F2 key");break;
case 0x003d: printf("F3 key");break;
case 0x003e: printf("F4 key");break;
case 0x003f: printf("F5 key");break;
case 0x0040: printf("F6 key");break;
case 0x0041: printf("F7 key");break;
default: break;
};
};

}

⑦ C語言或者C++滑鼠點擊怎麼觸發下面這個事件

主要思路如下:

「取車」按鈕:

判斷當前是否有車(總車位不等於300),沒車的時候提示並返回;

有車時,判斷1層是否有車(1層車位不等於140),1層有車則1層車位數+1,否則2層車位數+1;

「存車」按鈕類似。

偽代碼如下:

voidbtnGet_click(objectsender,evente)//「取車」按鈕點擊方法
//VS的話,方法名稱一般可以通過界面雙擊控制項自動生成
{
if(iParkingNum==300)//總車位為300(沒車)
{
MessageBox.Show("沒車提示","提示標題");
return;
}
if(iLv1ParkingNum<140)//1層車位小於140(有車)
iLv1ParkingNum+=1;//1層車位+1
else
iLv2ParkingNum+=1;//2層車位+1
}

voidbtnPut_click(objectsender,evente)//「存車」按鈕點擊方法
{
if(iParkingNum<1)//總車位為0(車位已滿)
{
MessageBox.Show("沒車位提示","提示標題");
return;
}
if(iLv1ParkingNum>0)//1層車位大於0(有車位)
iLv1ParkingNum-=1;//1層車位-1
else
iLv2ParkingNum-=1;//2層車位-1
}

以上,有其他問題請追問。

⑧ 如何利用c語言添加button按鈕

Windows 窗體程序是基於消息機制的,所有控制項,它的本質都是一個窗體,都是使用 CreateWindows 函數來創建,不過類名,則需要指定為系統預先注冊的控制項類,比如,你要創建一個按鈕控制項,就要這樣子 CreateWindows( "BUTTON", "按鈕標題" ),CreateWindows 這個函數你應該用了不少了吧,其餘的參數可以參考 MSDN,但是類名我們指定了 「BUTTON」,說明我們要創建一個按鈕,每個按鈕都有一個唯一的 ID,通過你的消息處理函數,可以知道哪個按鈕發生了什麼事件,詳細講的話,非常多,你可以參考 MSDN,或者《Windows 程序設計》這本書 。