深入浅出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函数可以割断父进程和子进程之间的关联。

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