WEB开发网
开发学院软件开发VC VC++深入详解:MFC框架窗口 阅读

VC++深入详解:MFC框架窗口

 2008-11-24 19:38:06 来源:WEB开发网   
核心提示: 从例3-11所示代码可知,AfxRegisterClass函数首先获得窗口类信息,VC++深入详解:MFC框架窗口(3),如果该窗口类已经注册,则直接返回一个真值;如果尚未注册,由此,我们知道MFC程序执行的脉络也是在WinMain函数之后,就调用RegisterClass函数注册该窗口类

从例3-11所示代码可知,AfxRegisterClass函数首先获得窗口类信息。如果该窗口类已经注册,则直接返回一个真值;如果尚未注册,就调用RegisterClass函数注册该窗口类。读者可以看出这个注册窗口类函数与第2章介绍的Win32 SDK编程中所使用的函数是一样的。

小技巧:如果在当前工程文件中查找某个函数或字符串,可以利用工具栏上的“Find in Files”工具按钮或Edit菜单下的Find in Files命令;如果在当前文件中查找某个函数或字符串,可以使用Ctrl+F快捷键或Edit菜单下的Find命令。

我们创建的这个MFC应用程序Test,实际上有两个窗口。其中一个是CMainFrame类的对象所代表的应用程序框架窗口。该类有一个PreCreateWindow函数,这是在窗口产生之前被调用的。该函数的默认实现代码如例3-12所示。

例3-12

  BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  {
    if( !CFrameWnd::PreCreateWindow(cs) )
      return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    // the CREATESTRUCT cs
    return TRUE;
  }

从其代码可知,该函数首先调用CFrameWnd的PreCreateWindow函数。后者的定义位于源文件WINFRM.CPP中,代码如例3-13所示。

例3-13

  BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
  {
    if (cs.lpszClass == NULL)
    {
      VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
      cs.lpszClass = _afxWndFrameOrView; // COLOR_WINDOW background
    }
    if ((cs.style & FWS_ADDTOTITLE) && afxData.bWin4)
      cs.style |= FWS_PREFIXTITLE;
    if (afxData.bWin4)
      cs.dwExStyle |= WS_EX_CLIENTEDGE;
    return TRUE;
  }

我们发现该函数中调用了AfxDeferRegisterClass函数,读者可以在AFXIMPL.H文件中找到后者的定义,定义代码如下:

#define AfxDeferRegisterClass(fClass) AfxEndDeferRegisterClass(fClass)

由其定义代码可以发现,AfxDeferRegisterClass实际上是一个宏,真正指向的是AfxEndDefer-RegisterClass函数。根据前面介绍的内容,我们知道这里完成的功能就是注册窗口类。

在CMainFrame类的PreCreateWindow函数处设置一个断点,调试运行Test程序,将会发现程序在调用theApp全局对象和WinMain函数之后,到达此函数处。由此,我们知道MFC程序执行的脉络也是在WinMain函数之后,窗口产生之前注册窗口类的。

上一页  1 2 3 

Tags:VC 深入 详解

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