windows程式設計.視窗.

來源:互聯網
上載者:User

標籤: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程式設計.視窗.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.