標籤:play 格式 zcm include 按鈕 int toc 顯示 調用函數
第一個windows視窗
1 #include <windows.h> 2 /* Displays "Hello, World!" in client area */ 3 4 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//視窗過程函數 5 6 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 7 PSTR szCmdLine, int iCmdShow) 8 { 9 static TCHAR szAppName[] = TEXT("HelloWin");//視窗類別名稱10 char string[] = "Hello World!";11 HWND hwnd;//視窗控制代碼12 MSG msg;//訊息結構13 WNDCLASS wndclass;//定義視窗類別結構體變數14 /*下面代碼填充視窗類別資訊*/15 wndclass.style = CS_HREDRAW | CS_VREDRAW;//視窗樣式16 wndclass.lpfnWndProc = WndProc;//過程函數17 wndclass.cbClsExtra = 0;//擴充欄位18 wndclass.cbWndExtra = 0;//擴充欄位19 wndclass.hInstance = hInstance;//當前執行個體控制代碼20 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//設定程式表徵圖21 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//設定滑鼠22 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//用白色填充背景23 wndclass.lpszMenuName = NULL;//菜單24 wndclass.lpszClassName = szAppName;//類名25 /*註冊視窗類別*/26 if (!RegisterClass(&wndclass))27 {28 MessageBox(NULL, TEXT("This program requires Windows NT!"),29 szAppName, MB_ICONERROR);30 return 0;31 }32 //建立視窗create window33 hwnd = CreateWindow(szAppName, // window class name類名34 TEXT("The Hello Program"), // window caption標題35 WS_OVERLAPPEDWINDOW, // window style樣式36 CW_USEDEFAULT,// initial x position 橫座標原點37 CW_USEDEFAULT,// initial y position 縱座標原點38 CW_USEDEFAULT,// initial x size 39 CW_USEDEFAULT,// initial y size40 NULL, // parent window handle父視窗控制代碼41 NULL, // window menu handle菜單控制代碼42 hInstance, // program instance handle當前執行個體控制代碼43 NULL); // creation parameters 傳遞給視窗 WM_CREATE訊息的值的指標 一般為NULL44 ShowWindow(hwnd, iCmdShow);45 UpdateWindow(hwnd);46 //訊息迴圈,一直停在這裡,退出訊息迴圈就表示程式結束了47 while (GetMessage(&msg, NULL, 0, 0))48 {49 TranslateMessage(&msg);//翻譯50 DispatchMessage(&msg);//分發51 }52 return msg.wParam;53 }54 /* 訊息處理函數 */55 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)56 {57 HDC hdc;58 PAINTSTRUCT ps;59 RECT rect;60 switch (message)61 {62 case WM_PAINT:63 hdc = BeginPaint(hwnd, &ps);64 GetClientRect(hwnd, &rect);65 DrawText(hdc, TEXT("Hello World!"), -1, &rect,66 DT_SINGLELINE | DT_CENTER | DT_VCENTER);67 EndPaint(hwnd, &ps);68 return 0;69 //發送結束請求,裡面的參數為退出碼70 case WM_DESTROY:71 PostQuitMessage(0);72 return 0;73 }74 //調用預設的過程函數75 return DefWindowProc(hwnd, message, wParam, lParam);76 }
首先是通過WNDCLASS這個結構體來告訴系統我們要建立一個視窗。
1 ypedef struct tagWNDCLASSA { 2 UINT style; 3 WNDPROC lpfnWndProc; 4 int cbClsExtra; 5 int cbWndExtra; 6 HINSTANCE hInstance; 7 HICON hIcon; 8 HCURSOR hCursor; 9 HBRUSH hbrBackground;10 LPCSTR lpszMenuName;11 LPCSTR lpszClassName;12 } WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;
設定結構內的不同的欄位,調用RegisterClass函數來告訴系統,要註冊一個這樣的視窗類別型。
接下來就是通過調用函數CreateWindow建立一個剛才註冊的視窗類別型。
1 #define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, 2 nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) 3 CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y, 4 nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) 5 #define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y, 6 nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) 7 CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y, 8 nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) 9 #ifdef UNICODE10 #define CreateWindow CreateWindowW11 #else12 #define CreateWindow CreateWindowA13 #endif // !UNICODE
建立好的視窗還沒有顯示,這就要調用函數ShowWindow來顯示,以及UpdateWindow來更新。
ShowWindow( _In_ HWND hWnd, _In_ int nCmdShow);UpdateWindow( _In_ HWND hWnd);
訊息迴圈。GetMessage函數從訊息佇列中取得訊息。TranslateMessage函數 轉移某些鍵盤訊息。DispatchMessage函數將訊息發送給視窗訊息處理常式。
再來看WndProc這個函數內部。BeginPaint 開始繪製視窗。GetClientRect 取得視窗顯示地區的大小。DrawText 顯示字串。EndPaint 結束繪製視窗。PostQuitMessage 在訊息佇列中插入一個「退出程式」訊息。DefWindowProc 執行內定的訊息處理。
程式通常不直接呼叫視窗訊息處理常式,視窗訊息處理常式通常由Windows本身呼叫。通過呼叫SendMessage函數,程式能夠直接呼叫它自己的視窗訊息處理常式。
處理訊息。
WndProc處理的第一個訊息為WM_PAINT。當視窗顯示地區的一部分顯示內容或者全部變為「無效」,以致於必須「更新畫面」時,將由這個訊息通知程式。wndclass結構的style欄位設定為標誌CS_HREDRAW和CS_VREDRAW,這樣的格式設定指示Windows,改變視窗的大小、視窗最小化以及移動視窗後,顯示地區的顯示內容重新變得無效。
GetClientRect (hwnd, &rect) ;
第一個參數是程式視窗的控制代碼。第二個參數是一個指標,指向一個RECT型態的rectangle結構。該結構有四個LONG欄位,分別為left、top、right和bottom。GetClientRect將這四個欄位設定為視窗顯示地區的尺寸。left和top欄位通常設定為0,right和bottom欄位設定為顯示地區的寬度和高度(像素點數)。
DrawText(hdc, TEXT("Hello World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
DrawText可以輸出文字(正如其名字所表明的一樣)。由於該函數要輸出文字,第一個參數是從BeginPaint傳回的裝置內容控制代碼,第二個參數是要輸出的文字,第三個參數是 -1,指示字串是以位元組0終結的。
DrawText最後一個參數是一系列位旗標,它們均在WINUSER.H中定義(雖然由於其顯示輸出的效果,使得DrawText像一個GDI函數呼叫,但它確實因為相當進階的畫圖功能而成為User模組的一部分。此函數在/Platform SDK/Graphics and Multimedia Services/GDI/Fonts and Text中說明)。旗標指示了文字必須顯示在一行上,水平方向和垂直方向都位於第四個參數指定的矩形中央。因此,這個函數呼叫將讓字串「Hello World!」顯示在顯示地區的中央。
一旦顯示地區變得無效(正如在改變大小時所發生的情況一樣),WndProc就接收到一個新的WM_PAINT訊息。WndProc通過呼叫GetClientRect取得變化後的視窗大小,並在新視窗的中央顯示文字。
case WM_DESTROY: PostQuitMessage(0);
WM_DESTROY訊息指示,Windows正在根據使用者的指示關閉視窗。單擊Close按鈕或者在程式的系統功能表上選擇 Close時發生的。
return DefWindowProc(hwnd, message, wParam, lParam);
結構的wParam欄位是傳遞給PostQuitMessage函數的值(通常是0)。然後return敘述將退出WinMain並終止程式。
windows程式設計.視窗.