c语言mfc窗口,[转载]MFC程序显示主窗口的秘密,终于让我找到了!

从给一个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()函数去掉即可。

真没想到我这个问题居然有这么简单的解决办法,真是太让人高兴了

a4c26d1e5885305701be709a3d33442f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值