windows application的原理,其实主要就是依靠下面两个函数
WinMain(hInst, hPrev, ...)
{
MSG msg;
RegisterClass(...);//定义窗口类的属性和行为(其实就是窗口函数)
CreateWindow(...);//产生窗口
ShowWindow(...);//显示窗口
UpdateWindow(...);//先传递WM_PAINT给窗口以驱动窗口的绘图操作
while(GetMessage(&msg...)) //从消息队列中取得消息
{
TranslateMessage(...);//转换键盘消息
//下面这个函数用于分派消息,借助USER模块的协助。
//当消息产生后,OS标志消息属于哪个窗口,而窗口类只有一个统一的窗口函数WndProc()
//这个知道消息属于哪个窗口就知道应该调用哪个窗口函数
DispatchMessage(...);
}
return msg.wParam;
}
//窗口函数,是一个回调函数(就是由你设计的,但是不是你调用,而是为系统准备的)
WndProc(hwnd, msg, wParam, lParam)
{
switch (msg)
{
//case后面一般包含消息处理函数
case WM_CREATE: ...
case WM_COMMAND: ...
case WM_LBUTTONDOWN: ...
case WM_PAINT: ...
case WM_CLOSE: ...
case WM_DESTROY: ...
default: return DefWindowProc(...);
}
return(0);
}
MFC application其实也是windows application,它如何对windows application进行改进
1.MFC把有着相当固定行为的WinMain()内部的操作封装在CWinApp类里面,
MFC把有着相当固定行为的WndProc()内部的操作封装在CFrameWnd类里面,
2.MFC的主函数(实际上我们都没有见过,因为MFC把它隐藏了)AfxWinMain()只是扮演驾驭它们的角色
3.定义继承自CWinApp的CMYWinApp以及CMYWinApp的一个全局对象theApp(Wizard自动完成),CMYWinApp
中的全局变量将因为全局对象theApp的诞生而获得配置和赋值
下面看看精简的AfxWinMain()
int AFXAPI AfxWinMain (...)
{
CWinApp* pApp = AfxGetApp();//其实就是取得CMyWinApp对象指针
AfxWinInit(...);//RegisterClass包含在这里面
//下面这三个函数都是虚函数
pApp->InitApplication();//大部分情况下在CMyWinApp中并没有改写它
//在CWinApp中是空函数,所以在CMyWinApp一定要改写它。
//在这个函数里面定义一个CMyFrameWnd的实例,从而调用CMyFrameWnd的构造函数,在
//CMyFrameWnd的构造函数里面有一个Create(NULL, "Hello MFC", ...,)来完成窗口的创建。
//具体的Create(NULL, "Hello MFC", ...,)的实现原理有兴趣请参考侯捷《深入浅出MFC》第六章
//这里完成的功能其实就相当于上面windows中的CreateWindow。
//InitInstance()除了完成了CreateWindow的功能外,里面还包含了
//ShowWindow()和UpdateWindow();
pApp->InitInstance();
//GetMessage,DispatchMessag包含在这个函数里面实现,具体的消息如何获得以及如何处理可请参考侯捷《深入浅出MFC》第六章
//消息的处理考试应该会考,上课分析得也比较清楚
nReturnCode = pApp->Run();
AfxWinTerm();
}
评论