WEB开发网
开发学院软件开发VC VC初学者入门系列之一:窗口类的诞生 阅读

VC初学者入门系列之一:窗口类的诞生

 2006-07-20 11:38:32 来源:WEB开发网   
核心提示: 有了上面的知识,我们就可以很容易摸清MFC是怎样注册窗口类的了!我们知道Windows上所有看得见的东西,VC初学者入门系列之一:窗口类的诞生(5),在MFC中都是继承于CWnd类的,而CWnd类创建窗口的成员函数是Create和CreateEx,由于Create最终是调用CreateEx

有了上面的知识,我们就可以很容易摸清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,然后返回系统,供系统创建你的窗口。

上一页  1 2 3 4 5 

Tags:VC 初学者 入门

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接