//程式入口
intAPIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ MSG msg; //訊息結構體 //向系統註冊視窗類別別,輸入的參數“hInstance”是目前程式運個體的對象代碼 MyRegisterClass(hInstance); //運行初始化函數 if( ! InitInstance(hInstance,nCmdShow) //InitInstance函數進行初始執行個體化操作 { return FALSE; } while( GetMessage( &msg,NULL, 0, 0 ) ) //GetMessage函數從訊息佇列中抓取訊息 { TranslateMessage(&msg); //對鍵盤訊息進行轉換成系統訊息 DispatchMessage(&msg); //指派訊息到WndProc函數給對應的訊息處理函數處理 } return msg.wParam; //退出時返回給作業系統的訊息}
//MyRegisterClass函數
ATMO MyRegisterClass( HINSTANCE hInstance ){ WNDCLASSEX wcex; wcex.cbsize = sizeof(WNDCLASSEX); //WNDCLASS所佔用的記憶體位元組 wcex.style = CS_HREARAW | CS_VREDRAW; //表單的樣式 wcex.lpfnWndProc = (WNDPROC) WndProc; //訊息處理函數名,自己命名 wcex.cbClsExtra = 0; //指定分配給視窗類別結構(此處指lpszClassName)之後的額外位元組數 wcex.cbWndExtra = 0; //指定分配給視窗執行個體(此處指hInstance)之後的額外位元組數 wcex.hInstance = hInstance; //指定視窗過程所對應的執行個體控制代碼 wcex.hIcon =NULL; //工作列上的表徵圖,NULL表示採用預設表徵圖 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //指定游標的樣式 wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW+1); //指定視窗的背景畫刷 wcex.lpszMenuName = NULL; //通過菜單資源名稱載入菜單 wcex.lpszClassName = "seekCName"; //視窗類別的類名(一個結構體而已,並不是C++的類) wcex.hIconSm = NULL; //視窗標題列左側的小表徵圖,NULL表示採用預設表徵圖 return RegisterClassEx(&wcex);}
//WNDCLASSEX只是比WNDCLASS多了cbsize和hIconSm這兩個成員,其它的都是一樣。
//以上參數具體參看:http://baike.baidu.com/view/1750396.html
Nwcex.lpszName = "lpszClassName"詳解:
當程式員將wcex結構按自己要求填寫完成後就可以調用RegisterClass(或RegisterClassEx)函數將該類註冊,這樣以後凡是要建立該視窗,只需要以該類名(lpszClassName中指定)為參數調用CreateWindow,你看多方便呀,真是一舉多得啊!如下Instance函數中的CreateWindow中的第一個參數“seekName”。
//InitInstance函數
BOOL Instance( HINSTANCE hInstance, int nCmdShow ){ HWND hWnd; hInst = hInstance; //建立一個視窗對象 hWnd = CreateWindow( "seekCName", //視窗類別名 "繪圖視窗", //視窗標題列的標題 WS_OVERLAPPEDWINDOW, //視窗的風格,定義為普通型 CW_USEDEFAULT, //視窗左上方X軸座標 0, //視窗左上方Y軸座標 CW_USEDEFAULT, //表單的寬度 10, //表單的高度 NULL, //父表單控制代碼 NULL, //菜單控制代碼 hInstance, //此應用程式的執行個體控制代碼 NULL); //一般不用,設為空白 if( !hWnd ) { return FALSE; } MoveWindow( hWnd, 10, 10, 600, 450, true ); //設定視窗顯示位置及視窗大小 ShowWindow( hWnd, nCmdShow ); //顯示表單 UpdateWindow( hWnd ); //更新表單 return TRUE;}
詳解ShowWindow和UpdateWindow的作用:
UpdateWindow只是更新客戶區的多個無效地區(待更新地區),如果客戶區的某個地區需要重畫了,那麼windows只是將這個地區設為無效區,此時它不是立即重畫,而是等待使用者或者系統自動調用UpdateWindow,這樣如果有多個地區需要重畫的話,就可以串聯成一個無效區鏈表,這樣只需調用一次UpdateWindow就將這些無效區重畫了,而不用多次調用,提高了效率。
UpdateWindow()只向表單發送WM_PAINT訊息,在發送之前判斷GetUpdateRect(hWnd,NULL,TRUE)看有無可繪製的用戶端區域,如果沒有,則不發送WM_PAINT。
UpdateWindow是在HDC上畫圖的(無論視窗隱藏與否),不是用來顯示視窗的;
ShowWindow 是用來顯示/隱藏視窗,而不是用來在HDC上作圖的。
//WndProc函數
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ){ PAINTSTRUCT ps; HDC hdc; switch( message ) { case WM_PAINT: //視窗重繪訊息 hdc = BeginPaint( hWnd, &ps ); //用hdc進行具體的繪圖動作 EndPaint( hWnd, &ps ); break; case WM_DESTROY: //視窗結束訊息 PostQuitMessage(0); break; default: return DefWindowProc( hWnd, message, wParam, lParam ); //預設處理函數 } retrun 0;}