1. 程式人生 > >10 訊息佇列與一個簡單的視窗程式

10 訊息佇列與一個簡單的視窗程式

訊息:當我們點選滑鼠的時候,或者當我們按下鍵盤的時候,作業系統都要把這些動作記錄下來,儲存到一個結構體中,這個結構體就是訊息;
訊息佇列:每個執行緒只有一個訊息佇列;訊息對列與執行緒相關的;訊息佇列就是一堆連結串列;
視窗與執行緒的關係:一個執行緒可以有多個視窗,一個視窗指對應一個執行緒;
簡單的視窗程式示例:

/*-------------------------------
			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);
}