窗口类的诞生(注册自己的窗口类二)
来源:互联网 发布:centos traceroute安装 编辑:程序博客网 时间:2024/05/18 02:05
我们现在再来看看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上。对!就是它了。
PreCreateWindow函数是CWnd类的一个虚拟函数,提供程序设置待创建窗口的属性(包括窗口类),这样继承于CWnd的类都可以按照自己的要求在PreCreateWindow中设置自己的属性了,而且我们看到MFC也是这样做的:
BOOL CWnd::PreCreateWindow(CREATESTRUCT &cs)
{
if(cs.lpszClass = = NULL)
{
AfxDeferRegisterClass(AFX_WND_REG);
cs.lpszClass = _afxWnd;
}
return TRUE;
}
BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT &cs)
{
if(cs.lpszClass = = NULL)
{
AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);
cs.lpszClass = _afxWndFrameOrView;
}
return TRUE;
}
BOOL CMDIFrameWnd::PreCreateWindow(CREATESTRUCT &cs)
{
if(cs.lpszClass = = NULL)
{
AfxDeferRegisterClass(AFX_WNDMDIFRAME_REG);
cs.lpszClass = _afxWndMDIFrame;
}
}
BOOL CMDIChildWnd::PreCreateWindow(CREATESTRUCT &cs)
{
return CFrameWnd::PreCreateWindow(cs);
}
BOOL CView::PreCreateWindow(CREATESTRUCT &cs)
{
if(cs.lpszClass = = NULL)
{
AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);
cs.lpszClass = _afxWndFrameOrView;
}
}
就是通过继承的方法,MFC实现常用类的窗口注册(代码并不完全,是从MFC中抽取对我们有意义的一部分代码)。
四.在MFC中注册自己的窗口类
在MFC中创建一个窗口,就必须是继承于CWnd类的,这样你的CMyWnd类自然就有了PreCreateWindow方法。你想注册有自己个性的窗口类,那么就在该函数中进行吧。也就是在PreCreateWindow函数中注册自己的窗口类,然后将窗口类的类名以及待创建窗口的其它属性(见CREATESTRUCT结构)填写cs,然后返回系统,供系统创建你的窗口。
- 窗口类的诞生(注册自己的窗口类二)
- 窗口类的诞生(注册自己的窗口类一)
- 深入浅出MFC:窗口类的注册与窗口的诞生
- MFC 窗口类的诞生
- 学习笔记之深入浅出MFC 第2讲 窗口类注册与窗口的诞生
- VC窗口类注册与诞生
- 窗口类之注册与窗口之诞生
- 窗口类之注册与窗口之诞生
- 在MFC中注册自己的窗口类名
- 注册窗口类的步骤
- MFC程序对win32的封装总结(窗口类的注册,窗口的创建,窗口的窗口过程指定)
- VC初学者入门系列之一:窗口类的诞生
- 主窗口的诞生过程
- (Windows编程)窗口的诞生
- Window Class Registration(窗口类的注册)
- MFC程序开发-窗口的诞生
- 注册窗口类
- 注册窗口类
- ubuntu中的安装与卸载
- C++学习笔记二 —— 3.3 指针类型
- SQLStory摘录(六)————不可能的错误
- 窗口类的诞生(注册自己的窗口类一)
- SQLStory摘录(八)————数据抽取
- 窗口类的诞生(注册自己的窗口类二)
- 用JavaScript编制显示日期和中文星期
- SQLStory摘录(七)————触摸NULL值
- struts傻瓜式学习(一天篇)
- SQLStory摘录(一)————简单查询初探
- 111111
- 一个画图类,类似ms_chart的线图,适用于科学仿真数据分
- 简单hql语句
- SQLStory摘录(四)————信息挖掘初步