doc_view结构中让窗口一开始就最大化探讨(转)


  一般的做法是在 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();
posted @ 2009-08-10 16:28  eric_lgf  阅读(312)  评论(0编辑  收藏  举报