Win32 Application基本架構

來源:互聯網
上載者:User

//程式入口

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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.