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

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

 2008-11-24 19:38:06 来源:WEB开发网   
核心提示: 从例3-10所示代码可知,AfxEndDeferRegisterClass函数首先判断窗口类的类型,VC++深入详解:MFC框架窗口(2),然后赋予其相应的类名(wndcls.lpszClassName变量),这些类名都是MFC预定义的,之后就调用AfxRegisterClass函数注册窗

从例3-10所示代码可知,AfxEndDeferRegisterClass函数首先判断窗口类的类型,然后赋予其相应的类名(wndcls.lpszClassName变量),这些类名都是MFC预定义的。之后就调用AfxRegisterClass函数注册窗口类,后者的定义也位于WINCORE.CPP文件中,代码如例3-11所示。

例3-11

  BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass)
  {
    WNDCLASS wndcls;
    if (GetClassInfo(lpWndClass->hInstance, lpWndClass->lpszClassName,
      &wndcls))
    {
      // class already registered
      return TRUE;
    }
    if (!::RegisterClass(lpWndClass))
    {
      TRACE1("Can't register window class named %sn",
        lpWndClass->lpszClassName);
      return FALSE;
    }
    if (afxContextIsDLL)
    {
      AfxLockGlobals(CRIT_REGCLASSLIST);
      TRY
      {
        // class registered successfully, add to registered list
        AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
        LPTSTR lpszUnregisterList = pModuleState->m_szUnregisterList;
        // the buffer is of fixed size -- ensure that it does not overflow
        ASSERT(lstrlen(lpszUnregisterList) + 1 +
          lstrlen(lpWndClass->lpszClassName) + 1 <
          _countof(pModuleState->m_szUnregisterList));
        // append classname + newline to m_szUnregisterList
        lstrcat(lpszUnregisterList, lpWndClass->lpszClassName);
        TCHAR szTemp[2];
        szTemp[0] = 'n';
        szTemp[1] = '';
        lstrcat(lpszUnregisterList, szTemp);
      }
      CATCH_ALL(e)
      {
        AfxUnlockGlobals(CRIT_REGCLASSLIST);
        THROW_LAST();
        // Note: DELETE_EXCEPTION not required.
      }
END_CATCH_ALL
      AfxUnlockGlobals(CRIT_REGCLASSLIST);
    }
    return TRUE;
  }

Tags:VC 深入 详解

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