10 訊息佇列與一個簡單的視窗程式
阿新 • • 發佈:2018-12-15
訊息:當我們點選滑鼠的時候,或者當我們按下鍵盤的時候,作業系統都要把這些動作記錄下來,儲存到一個結構體中,這個結構體就是訊息;
訊息佇列:每個執行緒只有一個訊息佇列;訊息對列與執行緒相關的;訊息佇列就是一堆連結串列;
視窗與執行緒的關係:一個執行緒可以有多個視窗,一個視窗指對應一個執行緒;
簡單的視窗程式示例:
/*------------------------------- MyWindows.c ---------------------------------*/ #include<Windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, //入口函式,WINAPI即是__stdcall(函式呼叫約定的一種) HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("MyWindows"); //定義視窗類的名字 HWND hwnd; //視窗控制代碼定義 MSG msg; //定義訊息 WNDCLASS wndclass; //Windows類定義 wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景,先要得到畫刷控制代碼傳回 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//游標 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//圖示 wndclass.hInstance = hInstance;//模組控制代碼,如前面說的.exe .dll等地址 wndclass.lpfnWndProc = WndProc;//過程函式 wndclass.lpszClassName = szAppName; //類名 wndclass.lpszMenuName = NULL;//選單 wndclass.style = CS_HREDRAW | CS_VREDRAW;//調整寬度和高度重新繪製視窗 if (!RegisterClass(&wndclass)){ //填完視窗類註冊該視窗類 MessageBox(NULL, TEXT("此程式需要在Windows NT平臺上執行!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, //建立視窗並設定其具體特徵,返回視窗控制代碼,視窗類名 TEXT("Win模板"), //視窗標題 WS_OVERLAPPEDWINDOW, //類風格的擴充套件 CW_USEDEFAULT, //初始視窗座標 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, //有無父視窗 NULL, //有無選單 hInstance, NULL ); ShowWindow(hwnd, iCmdShow); //顯示視窗 UpdateWindow(hwnd); //更新視窗 while (GetMessage(&msg, NULL, 0, 0)){ TranslateMessage(&msg); //翻譯訊息 DispatchMessage(&msg); //派送訊息到系統,系統再呼叫WinProc函式處理訊息 } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//傳入訊息結構體的前四個引數 { HDC hdc; //Handle of device context PAINTSTRUCT ps; //繪畫結構 RECT rect; //矩形結構 switch (message) { case WM_PAINT: hdc = BeginPaint(hwnd, &ps); //填充hdc結構 GetClientRect(hwnd, &rect); //獲取客戶區矩形信 DrawText(hdc, TEXT("這是一個簡單的視窗!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: //點選右上角關閉傳送WM_DESTROY訊息 PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }