深入浅出mfc随笔——MFc程序的生死因果

1:窗口的显示与更新

CMyWinApp theApp___AfxWinInit___pApp->Initapplication____pApp->InitInstance____m_pMainWnd=new CMyFramWnd()____CMyFramewnd中Create(NULL,"fds",....);____m_pMainWnd->showWindow(m_nCmdShow);____m_pMainwnd->updatewindow()____pApp->run();

其中pApp指向CMyWinApp对象。CMywinapp继承自CWinApp。而Run又是CWinApp的一个虚函数,并没有改写他。所以相当与调用CWinApp::Run,在该函数中又实际的调用了CWinThread,CWinThread中的pumpMessage真正的做了消息循环的事情。

获得的消息如何交给适当的程序去处理呢。sdk程序的做法是调用DispatchMessage.把消息丢给窗口函数。mfc也是如此。在afxenddeferregisterclass程序代码。他在注册四种窗口类之前已经指定窗口函数为wndcls.lpfnwndproc=defwindowproc;

虽然窗口函数被指定为defwindowproc成员函数。但事实上消息并不是被送往该处。而是afxwndproc的全局函数中。再通过message map机制把消息和处理函数连接在一起。

然后程序的死亡。wm_close____默认函数_____destroywindow发出wm_destroy_____postquitmessage发出wm_quit_____exitinstance

注意:如果类的成员函数是一个callback函数。你必须声明它为static。才能把C++编译器加诸于函数的一个隐藏参数this去掉。凡是你设计而却由windows系统调用的函数。统称为callback函数。这些函数都有一定的类型。

C++的static成员函数的特性是。即使对象还没有产生。static对象也已经存在(函数或变量都如此),换句话说,对象还没有产生之前你已经可以掉用类的static函数或使用类的static变量了

原文地址:https://www.cnblogs.com/lzjsky/p/1761706.html