我们现在再来看看AfxDeferRegisterClass是什么样子的:
#define AfxDeferRegisterClass(fClass) /
((afxRegisteredClasses & fClass) ? TRUE:AfxEndDeferRegisterClass(fClass)
#define afxRegisteredClasses AfxGetModuleState()->m_fRegisteredClasses
BOOL AFXAPI AfxEndDeferRegisterClass(short fClass)
{
WNDCLASS wndCls;
wndCls.lpfnWndProc = DefWindowProc;
if(fClass & AFX_WND_REG)
{
wndCls.lpszClassName=_afxWnd;
AfxRegisterClass(&wndCls);
}else if(fClass & AFX_WNDOLECONTROL_REG)
{
wndCls.lpszClassName=_afxWndOleControl;
AfxRegisterClass(&wndCls);
}else if(fClass & AFX_WNDCONTROLBAR_REG) {
wndCls.lpszClassName=_afxWndControlBar;
AfxRegisterClass(&wndCls);
}else if(fClass & AFX_WNDMDIFRAME_REG)
{
RegisterWithIcon(&wndCls,_afxWndMDIFrame,AFX_IDI_MDIFRAME);
}else if(fClass & AFX_WNDFRAMEORVIEW_REG)
{
RegisterWithIcon(&wndCls,_afxWndFrameOrView,AFX_IDI_STD_FRAME);
}else if(fClass & AFX_WNDCOMMCTLS_REG)
{
InitCommonControls();
}
}
从上面的代码可以看出,AfxDeferRegisterClass函数首先判断该窗口类是否注册,如已注册则直接返回,否则调用AfxEndDeferRegisterClass进行注册,即注册要求的默认窗口类。其中RegisterWithIcon和InitCommonControls最终也是转化为调用AfxRegisterClass,而AfxRegisterClass函数调用RegisterClass进行注册,啊,终于看到SDK中的RegisterClass了,看到它总有一种亲切感!
有了上面的知识,我们就可以很容易摸清MFC是怎样注册窗口类的了!我们知道Windows上所有看得见的东西,在MFC中都是继承于CWnd类的,而CWnd类创建窗口的成员函数是Create和CreateEx,由于Create最终是调用CreateEx,所以我们只需要看CreateEx函数就行了: BOOL CWnd::CreateEx(DWORD dwExStyle, LPCSTSTR lpszClassName,
…… LPVOID lpParam)
{
CREATESTRUCT cs;
cs.dwExStyle = dwExStyle;
… …
cs.lpCreateParams = lpParam;
PreCreateWindow(cs);
AfxHookWindowCreate(this);
HWND hWnd=::CreateWindowEx(cs.dwStyle,cs.lpszClass,…,cs.lpCreateParams);
……
}
啊,一看到CreateWindowEx,亲切感又来了,这不是和SDK中的CreateWindow一样嘛,是创建窗口!既然这样,那么注册窗口肯定在该函数之前,会是谁呢?如果你做过一点MFC程序,你就会对将眼光停留PreCreateWindow上。对!就是它了。 <  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
1/2 1 2 下一页 尾页 |