关于MFC中窗口最大化

来源:互联网 发布:dnf网络卡会丢伤害吗 编辑:程序博客网 时间:2024/05/14 15:17

文一:转载(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.

原创粉丝点击