CFormView不能WM_INITIALUPDATE消息的原因

   程序中没有发送消息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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值