深入淺出MFC筆記——第一章

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nCmdShow)

{

if (!hPrevInstance)

if (!InitApplication(hInstance))

return (FALSE);

if (!InitInstance(hInstance, nCmdShow))

return (FALSE);

...

}

//--------------------------------------------------

BOOL InitApplication(HINSTANCE hInstance)

{

WNDCLASS wc;

...

return (RegisterClass(&wc));

}

//--------------------------------------------------

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

_hWnd = CreateWindow(...);

...

}

 

1. Windows 3.x 時代窗口類別只需註冊一次,即可供同一程序的後續每一個

執行實例(instance)使用。所以我們把RegisterClass 這個動作安排在「只有第一個執行個體纔會進入」的InitApplication 函數中。產生窗口,是每一個執行實例( instance ) 都得做的動作, 所以我們把CreateWindow 這個動作安排在「任何執行實例都會進入」的InitInstance 函數中。現在的版本中已經被忽略,這樣寫的原因MFC 把這兩個函數包裝成CWinApp 的兩個虛擬成員函數。

 

2. TranslateMessage 是爲了將鍵盤消息轉化。

 

3. CreateWindow函數發出WM_CREATE消息產生窗口,DefWindowProc 收到WM_CLOSE 後, 調用DestroyWindow 把窗口清除。DestroyWindow 本身又會送出WM_DESTROY。程序對WM_DESTROY 的標準反應是調用PostQuitMessage PostQuitMessage 沒什麼其它動作,就只送出WM_QUIT 消息,準備讓消息循環中的GetMessage 取得0結束。

 

4. Console程序與DOS程序的差別:利用Windows 編譯器、聯結器做出來的程序,都是所謂Win32 程序。如果程序是以main 爲進入點,調用Cruntime 函數和「不牽扯GUI」的Win32 API 函數,那麼就是一個console 程序。過去在DOS 環境下開發的程序,稱爲DOS 程序,它也是以main 爲程序進入點,可以調用C runtime 函數。但不可能調用Win32 API 函數。

 

5. 使用CreateProcess函數創建進程,建立新進程之前,系統必須做出兩個核心對象,也

就是「進程對象」和「執行線程對象」。調用ExitProcess函數進程可以結束自己的生命,調用TerminateProcess函數可以結束其它進程的生命。最好不用利用TerminateProcess函數結束子進程生命,因爲系統不會清理子進程遺留下來的垃圾。使用CloseHandle函數可以割斷父進程和子進程之間的關聯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章