1. 程式人生 > >win32API 入口WinMain()內部機理

win32API 入口WinMain()內部機理

ear brush red wndproc 調用約定 函數 line edraw con

win32API 入口WinMain()內部機理

  • 入口 WinMain()
  • 前面戴兩重“帽子”:一個"int"是指返回值; 一個WINAPI指“調用約定”。
  • 後面有四個參數:
    • HINSTANCE hInstance, 由操作系統生成的“當前實例句柄”。
    • HINSTANCE hPrevInstance,"先前實例句柄"----已經遭廢棄,以前有用到過,現在已無用。“二貨”都會遭到”白眼“,一般賦值null。
    • LPSTR lpCmdLine,由外部傳遞進來的命令行,如:用記事本打開一個txt文件,內裏實現是把txt文件路徑傳入記事本程序,而記事本也要從入口WinMain()進入的,LPSTR lpCmdLine就來接收此路徑參數。
    • int nShowCmd 顯示參數,由操作系統指定。
  • WNDCLASSEX 結構用於註冊窗口類
    • cbSize:
      • wcex.cbSize = sizeof( WNDCLASSEX );
      • WNDCLASSEX 的大小。我們可以用sizeof(WNDCLASSEX)來獲得準確的值。
    • cbClsExtra:
      • wcex.cbClsExtra = 0;
      • 指定緊跟在窗口類結構後的附加字節數。窗口類關聯的一個額外的空間。基本已經用不到。
    • cbWndExtra:
      • wcex.cbWndExtra = 0;
      • 指定緊跟在窗口事例後的附加字節數。如果一個應用程序在資源中用CLASS偽指令註冊一個對話框類時,則必須把這個成員設成DLGWINDOWEXTRA。窗口關聯的一個額外的空間。
    • hbrBackground:
      • wcex.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH );
      • 背景畫刷的句柄。
    • hCursor:
      • wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
      • 光標的句柄。
    • hIcon:
      • wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION );
      • 圖標的句柄,任務欄上面的圖標。
    • hIconSm:
      • wcex.hIconSm = LoadIcon( NULL, IDI_WINLOGO );
      • 和窗口類關聯的小圖標。如果該值為NULL。則把hIcon中的圖標轉換成大小合適的小圖標。標題欄左邊的小圖標。
    • hInstance:
      • wcex.hInstance = hInstance;
      • 本模塊的事例句柄。
    • lpfnWndProc:
      • wcex.lpfnWndProc = (WNDPROC) WndProc;
      • 窗口處理函數的指針。
      • WNDCLASSEX 中最重要的成員莫過於lpfnWndProc了。前綴 lpfn 表示該成員是一個指向函數的長指針。在 Win32中由於內存模式是 FLAT 型,所以沒有 near 或 far 的區別。每一個窗口類必須有一個窗口過程,當 Windows 把屬於特定窗口的消息發送給該窗口時,該窗口的窗口類負責處理所有的消息,如鍵盤消息或鼠標消息。由於窗口過程差不多智能地處理了所有的窗口消息循環,所以您只要在其中加入消息處理過程即可。
    • lpszClassName:
      • wcex.lpszClassName = "My Class";
      • 指向類名稱的指針。
    • lpszMenuName:
      • wcex.lpszMenuName = NULL;
      • 指向菜單的指針。
    • style:
      • wcex.style = CS_HREDRAW | CS_VREDRAW;
      • 從這個窗口類派生的窗口具有的風格。您可以用“or”操作符來把幾個風格或到一起。
    • return RegisterClassEx( &wcex );

win32API 入口WinMain()內部機理