Windows編程——窗口生成的過程


 1 #include<windows.h>
 2 
 3 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//CALLBACK函數由Windows調用 

WndProc函數用來處理用戶在窗口上下達的指令。

步驟:

1.窗口類結構 WNDCLASS

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int iCmdShow)
{
    static TCHAR szAppName[]=TEXT("類的名字");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
                                 //CS 類風格選項 
    wndclass.style=CS_HREDRAW|CS_VREDRAW;// 調整高度(vehicle)、寬度(horizon)后是否重繪窗口 
    wndclass.lpfnWndProc=WndProc;//
    wndclass. cbClsExtra=0;//預留的額外空間 
    wndclass.cbWndExtra=0;//預留的額外空間 
    wndclass.hInstance=hInstance;//應用程序的實力句柄 
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//為所有基於該窗口的類 ;   IDI圖標的ID號,IDIcon 
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ;// 光標;    IDC光標的ID號 ,IDCursor 
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);// 
    wndclass.lpszMenuName=NULL;//菜單 
    wndclass.lpszClassName=szAppName;//窗口類的名字,第七行

2.注冊窗口類 RegisterClass

1     if(!RegisterClass(&wndclass)) 
2     {                                                                    //MB  消息框選項 
3         MessageBox(NULL,TEXT("這個程序需要在Windows NT才能執行!"),szAppName,MB_ICONERROR);
4         return 0;
5     }

 

3.創建窗口實例 CreateWindow  此時窗口在內存中誕生(句柄),但還未顯示出。

 1     hwnd= CreateWindow(szAppName,
 2             TEXT("學習Windows編程"),
 3             WS_OVERLAPPEDWINDOW,// WS  窗口風格   OVERLAPPEDWINDOW很多屬性疊加 
 4             CW_USEDEFAULT,//  初始x坐標                           CW 創建窗口選項  create window 
 5             CW_USEDEFAULT, //初始y坐標
 6             CW_USEDEFAULT,  //初始x方向尺寸
 7             CW_USEDEFAULT,//初始y方向尺寸
 8             NULL,            // 父窗口句柄
 9             NULL,   // 窗口菜單句柄
10             hInstance,   // 程序實例句柄
11             NULL);// 創建參數

 

4.顯示窗口 ShowWindow

ShowWindow(hwnd,iCmdShow);//顯示窗口 

 

5.更新窗口 UpdateWindow

 

 1 UpdateWindow(hwnd);//更新窗口
 2     
 3     
 4     //消息循環   
 5      while(GetMessage(&msg,NULL,0,0))
 6      {
 7          TranslateMessage(&msg);
 8          DispatchMessage(&msg);
 9     } 
10        
11       return msg.wParam;
12             
13 }

LRESULT  CALLBACK Wndproc函數

  hwnd是要處理窗口的句柄,message是消息ID,代表了不同的消息類型,wParam的值為按下按鍵的虛擬鍵碼,lParam則存儲按鍵的相關狀態信息。

 7 
 8 
 9 
10 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
11 {
12         HDC hdc;
13         PAINTSTRUCT ps;//存放繪制窗口需要的參數 
14         RECT rect;  //定義了矩形左上角和右下角的坐標 
15 
16         switch (message)
17         {
18         case WM_PAINT:
19                 hdc = BeginPaint(hwnd, &ps);  //device context 設備環境 
20                 GetClientRect(hwnd, &rect);  //獲得客戶區位置坐標信息 
21                 DrawText(hdc, TEXT("這里是徐徐風的第一個窗口~"), -1, &rect,
22                         DT_SINGLELINE | DT_CENTER | DT_VCENTER);//分別是顯示在 一行,居中,垂直居中  
23                 EndPaint(hwnd, &ps);
24                 return 0;
25         case WM_DESTROY:
26                 PostQuitMessage(0);
27                 return 0;
28         }
29 
30         return DefWindowProc(hwnd, message, wParam, lParam);
31 }

 

 

 

 

 

 

 

另外:

消息機制 : 1.FIFO  先進先出

                    2.WM_PAINT,WM_TIMER,WM_QUIT這三個消息時刻在消息隊列最后

       3.消息分為隊列化和非隊列化消息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM