关于MFC中窗口最大化的两篇文章

女生的网名这么多〃 提交于 2020-02-29 19:35:13

文一:转载(http://dev.csdn.net/htmls/28/28675.html

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();

问题解决。

文二:转载http://blog.csdn.net/ziren235/archive/2006/05/19/745651.aspx

如何让MFC窗口启动时最大化 收藏

这两天在网上搜了好多,都不行,因为都是同一篇文章的转载,于是只好自己慢慢摸索。终于,黄天不负苦心人。

只需将App类InitInstance()函数中m_pMainWnd->ShowWindow()的参数改为SW_SHOWMAXIMIZED即可。

微软MSDN网页中有相关介绍:

MFC Library Reference  

CWnd::ShowWindow

Sets the visibility state of the window.

BOOL ShowWindow(    int nCmdShow );

Parameters

nCmdShow

Specifies how the CWnd is to be shown. It must be one of the following values:

  • SW_HIDE   Hides this window and passes activation to another window.
  • SW_MINIMIZE   Minimizes the window and activates the top-level window in the system's list.
  • SW_RESTORE   Activates and displays the window. If the window is minimized or maximized, Windows restores it to its original size and position.
  • SW_SHOW   Activates the window and displays it in its current size and position.
  • SW_SHOWMAXIMIZED   Activates the window and displays it as a maximized window.
  • SW_SHOWMINIMIZED   Activates the window and displays it as an icon.
  • SW_SHOWMINNOACTIVE   Displays the window as an icon. The window that is currently active remains active.
  • SW_SHOWNA   Displays the window in its current state. The window that is currently active remains active.
  • SW_SHOWNOACTIVATE   Displays the window in its most recent size and position. The window that is currently active remains active.
  • SW_SHOWNORMAL   Activates and displays the window. If the window is minimized or maximized, Windows restores it to its original size and position.

Return Value

Nonzero if the window was previously visible; 0 if the CWnd was previously hidden.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!