从给一个MFC程序加入闪屏开始,就遇上了这样一个问题:在闪屏显示的时候,主窗口也一并显示了出来,而通常很多带闪屏的程序都是等闪屏结束以后才显示主窗口的,于是便想到了不让主窗口在一运行便显示出来,可却始终没能找到MFC程序第一次显示主窗口的地方,被这个问题困扰了好久,昨天终于找到答案了,答案就在下面这篇文章里面:
-------------------------------------------
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();
问题解决。
-------------------------------------------
正如这篇文章所说,如果不想让程序运行的时候主窗口显示出来,在ParseCommandLine之后,ProcessShellCommand之前,添加这句:m_nCmdShow
= SW_HIDE;并且将其后的ShowWindow()和UpdateWindow()函数去掉即可。
真没想到我这个问题居然有这么简单的解决办法,真是太让人高兴了