程序中没有发送消息WM_INITIALUPDATE,源码能说明一切:
void CFrameWnd::InitialUpdateFrame(CDocument* pDoc, BOOL bMakeVisible)
{
...
if (bMakeVisible)
{
// send initial update to all views (and other controls) in the frame
SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);
...
}
....
}
CMDIChildWnd* CMDIFrameWnd::CreateNewChild(CRuntimeClass* pClass,
UINT nResources, HMENU hMenu /* = NULL */, HACCEL hAccel /* = NULL */)
{
CMDIChildWnd* pFrame = (CMDIChildWnd*) pClass->CreateObject();
// load the frame
CCreateContext context;
context.m_pCurrentFrame = this;
pFrame->SetHandles(hMenu, hAccel);
if (!pFrame->LoadFrame(nResources,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &context))
{
TRACE(traceAppMsg, 0, "Couldn't load frame window.\n");
return NULL;
}
...
pFrame->InitialUpdateFrame(NULL, TRUE);
return pFrame;
}
void CDocTemplate::InitialUpdateFrame(CFrameWnd* pFrame, CDocument* pDoc,
BOOL bMakeVisible)
{
// just delagate to implementation in CFrameWnd
pFrame->InitialUpdateFrame(pDoc, bMakeVisible);
}
CSingleDocTemplate::OpenDocumentFile和CDocument* CMultiDocTemplate::OpenDocumentFile中调用CDocTemplate::InitialUpdateFrame
例如非文档单视图中代码如下就能发送WM_INITIALUPDATE
BOOL CMFCApplication45App::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。 否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
// 初始化 OLE 库
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
EnableTaskbarInteraction(FALSE);
// 使用 RichEdit 控件需要 AfxInitRichEdit2()
// AfxInitRichEdit2();
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
// 若要创建主窗口,此代码将创建新的框架窗口
// 对象,然后将其设置为应用程序的主窗口对象
CFrameWnd* pFrame = new CMainFrame;
if (!pFrame)
return FALSE;
m_pMainWnd = pFrame;
CCreateContext ct;
ct.m_pNewViewClass = RUNTIME_CLASS(CMyForm);
// 创建并加载框架及其资源
pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, nullptr,
&ct);
// 对框架进行更新并显示。
pFrame->InitialUpdateFrame(NULL,TRUE);
//在上面InitialUpdateFrame(NULL,TRUE)这句中已经包含pFrame->ShowWindow(SW_SHOW),因此下面这句注释掉。
//pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}