doc_view结构中让窗口一开始就最大化探讨 作者:enoloo
一般的做法是在 C**App::InitInstance()中,修改成这样: { //... m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(); //... } 或者,还在 CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中,添加: { //... cs.style |= WS_MAXIMIZE; //... }
这种做法能产生窗口最大化,但效果是显示的时候窗口从普通大小"闪"到最大化。还有的做法,是先将窗口隐藏,然后再最大化。那么怎样使窗口正常一开始出现就最大化?看看下面的流程,从 C**App::InitInstance()中的ProcessShellCommand(...)开始: { //... //ProcessShellCommand中第一次显示了窗口 if (!ProcessShellCommand(cmdInfo)) return FALSE; m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(); //... }
->CWinApp::ProcessShellCommand ->AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL) //如果你自己处理了ID_FILE_NEW要调用CWinApp::OnFileNew() ->CWinApp::OnFileNew() ->CDocManager::OnFileNew() ->CSingleDocTemplate::OpenDocumentFile //当前文档模板初始化 ->CSingleDocTemplate::CreateNewDocument //创建文档 //加载资源并创建主窗口(顺便创建视图),但没显示 ->CSingleDocTemplate::CreateNewFrame ->CFrameWnd::InitialUpdateFrame { //... int nCmdShow = -1; // default CWinApp* pApp = AfxGetApp(); if (pApp != NULL && pApp->m_pMainWnd == this) { nCmdShow = pApp->m_nCmdShow; // use the parameter from WinMain pApp->m_nCmdShow = -1; // set to default after first time } ActivateFrame(nCmdShow); //在这里第一次显示窗口 //... } ->CFrameWnd::ActivateFrame(int nCmdShow) // nCmdShow is the normal show mode this frame should be in { // translate default nCmdShow (-1) if (nCmdShow == -1) { if (!IsWindowVisible()) nCmdShow = SW_SHOWNORMAL; else if (IsIconic()) nCmdShow = SW_RESTORE; }
// bring to top before showing BringToTop(nCmdShow);
if (nCmdShow != -1) { // show the window as specified ShowWindow(nCmdShow); //第一次显示窗口
// and finally, bring to top after showing BringToTop(nCmdShow); } } ->***
从上面可以看出,CWinApp::ProcessShellCommand函数创建了窗口并显示,这是窗口第一次显示,先于: m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow();
怎么解决问题? 然窗口第一次显示就最大化?
CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line //在ParseCommandLine之后,ProcessShellCommand之前,添加这句!!! m_nCmdShow = SW_SHOWMAXIMIZED; if (!ProcessShellCommand(cmdInfo)) return FALSE;
// The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow();
问题解决。

|