這兒牽涉到windows的訊息機制,我們來簡單描述一下:
windows系統首先將訊息放入訊息佇列中,應用程式的訊息迴圈就是從應用程式的訊息佇列中檢取訊息,並將訊息發送相應的視窗過程函數中進一步處理。
在下面程式中的視窗過程函數時WndProc。
#include "windows.h"LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//視窗過程int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){HWND hwnd;//視窗控制代碼MSG msg;//訊息WNDCLASS wndclass;//視窗類別/*視窗類別的定義是通過給視窗類別資料結構wndclass賦值完成*/wndclass.style = CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc = WndProc;//定義視窗處理函數wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance; //當前執行個體控制代碼,不可為空wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = "HELLO win";/*視窗類別的註冊,windows系統本身提供部分預定義的視窗類別。視窗類別必須先註冊再使用*/if (!RegisterClass(&wndclass)){MessageBox(NULL,"視窗註冊失敗!","HELLO win",0);return 0;}/*建立一個視窗,通過CreateWindow()實現*/hwnd = CreateWindow("HELLO win","我的視窗", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);/*顯示一個視窗,通過ShowWindow()實現*/ShowWindow(hwnd,SW_SHOWMAXIMIZED);UpdateWindow(hwnd); //更新視窗,包括視窗的客戶區//進入訊息迴圈:當從應用程式訊息佇列中檢取的訊息是WM_QUIT時,則退出迴圈while (GetMessage(&msg,NULL,0,0)){//TranslateMessage(&msg);//轉換某些鍵盤訊息DispatchMessage(&msg);//將訊息發送給視窗過程,這裡是wndProc}return msg.wParam;}// 視窗過程函數的定義LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){switch(message){case WM_CREATE ://視窗建立產生的訊息return 0; break;case WM_LBUTTONDOWN: MessageBox(NULL,"你好,我的visual C++世界","問候",0);return 0;break;case WM_RBUTTONDOWN: MessageBox(NULL,"fuck","問候",0);return 0;break;case WM_DESTROY: PostQuitMessage(0);return 0; break;}return DefWindowProc(hwnd,message,wParam,lParam);//執行預設的訊息處理}