ANIMATE_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_INTERNET_REG) {
init.dwICC = ICC_INTERNET_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_INTERNET_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_COOL_REG) {
init.dwICC = ICC_COOL_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_COOL_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_USEREX_REG) {
init.dwICC = ICC_USEREX_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_USEREX_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_DATE_REG) {
init.dwICC = ICC_DATE_CLASSES;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_DATE_REG);
}
if (fToRegister & AFX_WNDCOMMCTL_LINK_REG) {
init.dwICC = ICC_LINK_CLASS;
fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_
LINK_REG);
}
// save new state of registered controls
pModuleState->m_fRegisteredClasses |= fRegisteredClasses;
// special case for all common controls registered, turn on AFX_WNDCOMMCTLS_REG
if ((pModuleState->m_fRegisteredClasses & AFX_WIN95CTLS_MASK) == AFX_WIN95CTLS_MASK)
{
pModuleState->m_fRegisteredClasses |= AFX_WNDCOMMCTLS_REG; fRegisteredClasses |= AFX_WNDCOMMCTLS_REG; }
// must have registered at least as mamy classes as requested return (fToRegister & fRegisteredClasses) == fToRegister; }
他是在PreCreateWindow中调用的注册,
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) cs.style |= FWS_PREFIXTITLE;
cs.dwExStyle |= WS_EX_CLIENTEDGE; return TRUE; }
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; }
BOOL CView::PreCreateWindow(CREATESTRUCT & cs) {
ASSERT(cs.style & WS_CHILD); if (cs.lpszClass == NULL) {
VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)); cs.lpszClass = _afxWndFrameOrView; // COLOR_WINDOW background }
if (cs.style & WS_BORDER) {
cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; }
return TRUE; }
BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs) {
// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs
return CView::PreCreateWindow(cs); }
有几点要说明
(1)m_pMainWnd,头文件里并没有这个变量呀? 噢,这个在基类里定义的public 类型的变量,所以,他是通过继承得到的。
(2) 你注意过吗,当我们一点运行,会默认出来一个视图窗口,这是谁调用的呢?哦,就是下面这几行,它调用了opendocument() 函数。
CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (!ProcessShellCommand(cmdInfo)) return FALSE; (3)这个函数有个关键的地方 CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_myTYPE, RUNTIME_CLASS(CmyDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架 RUNTIME_CLASS(CmyView)); if (!pDocTemplate) return FALSE;
AddDocTemplate(pDocTemplate); 通过它,把视图,窗口和文档结合起来。
4:主窗口CMainFrame的创建
(1)通过CMainFrame* pMainFrame = new CMainFrame;
我们得到的是不断调用的基类 CMainFrame::CMainFrame() {
// TODO: 在此添加成员初始化代码 }
CMDIFrameWnd::CMDIFrameWnd() {
m_hWndMDIClient = NULL; }
CFrameWnd::CFrameWnd() {
ASSERT(m_hWnd == NULL);
m_nWindow = -1; m_bAutoMenuEnable = TRUE; m_lpfnCloseProc = NULL; m_hMenuDefault = NULL; m_hAccelTable = NULL; m_nIDHelp = 0; m_nIDTracking = 0; m_nIDLastMessage = 0; m_pViewActive = NULL;
m_cModalStack = 0; m_phWndDisable = NULL; m_pNotifyHook = NULL; m_hMenuAlt = NULL;
m_nIdleFlags = 0; m_rectBorder.SetRectEmpty();
m_bHelpMode = HELP_INACTIVE; m_dwPromptContext = 0;
m_pNextFrameWnd = NULL;
m_bInRecalcLayout = FALSE; m_pFloatingFrameClass = NULL; m_nShowDelay = -1; AddFrameWnd();
// unknown window ID // auto enable on by default // initialize modality support// no idle work at start // not in Shift+F1 help mode // not in list yet // no delay pending