正文

windows application和MFC application原理2006-01-15 15:57:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/9658.html

分享到:

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

阅读(5938) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册