MFC让窗口一开始就最大化

看原帖,本贴尾有链接

 

作者: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();

问题解决。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jianzhanger/archive/2009/02/18/3904798.aspx

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是一种在 Windows 平台上开发图形用户界面的框架。在 MFC 最大化窗口后自适应是指窗口最大化状态下可以自动适应屏幕大小。 MFC 提供了一些函数和方法来实现窗口的自适应。其,可以使用 `GetSystemMetrics` 函数获取屏幕的宽度和高度信息,然后根据获取到的屏幕信息来调整窗口的大小和布局。 首先,可以在窗口的 `OnSize` 函数获取屏幕的宽度和高度,代码如下: ```cpp void CMyWindow::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); // 获取屏幕的宽度和高度 int screenWidth = GetSystemMetrics(SM_CXSCREEN); int screenHeight = GetSystemMetrics(SM_CYSCREEN); // 在最大化状态下调整窗口大小 if (nType == SIZE_MAXIMIZED) { // 计算新的窗口宽度和高度 int newWidth = cx - (screenWidth - cx); int newHeight = cy - (screenHeight - cy); // 调整窗口大小 SetWindowPos(nullptr, 0, 0, newWidth, newHeight, SWP_NOMOVE); } } ``` 上述代码,`GetSystemMetrics` 函数的参数 `SM_CXSCREEN` 和 `SM_CYSCREEN` 分别代表屏幕的宽度和高度。在窗口最大化后,计算新的窗口宽度和高度时,使用原来的宽度和高度减去屏幕宽度和高度的差值,得到新的大小。 调用 `SetWindowPos` 函数来设置新的窗口大小,其参数 `SWP_NOMOVE` 表示窗口位置不变,只改变窗口大小。 通过以上方法,在 MFC 可以实现窗口最大化后的自适应效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值