龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC++深入详解:MFC框架窗口(1)(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
从例3-10所示代码可知,AfxEndDeferRegisterClass函数首先判断窗口类的类型,然后赋予其相应的类名(wndcls.lpszClassName变量),这些类名都是MFC预定义的。之后就

  从例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;
  }

精彩图集

赞助商链接