关于SDI的最大化问题

huaboy408 2003-12-19 07:02:05
我修改的程序是基于MFC的SDI,程序运行时默认状态是最大化,即一打开程序就是最大化状态,我在框架类下面添家如下代码:
void CMainFrame::ActivateFrame(int nCmdShow)
{
// TODO: Add your specialized code here and/or call the base class
int nScreenCount=2;
int cxScreen = ::GetSystemMetrics(SM_CXSCREEN);
int cyScreen = ::GetSystemMetrics(SM_CYMAXIMIZED);
CRect rect;
rect.left = 0;
rect.top = 0;
rect.right = cxScreen;
rect.bottom = cyScreen;//wei le bu bei ren wu lan zhe zhu
if(nScreenCount==2)
{
rect.right=rect.right/2;
}
else if(nScreenCount==4)
{
rect.right=rect.right/2;
rect.bottom=rect.bottom/2;
}
WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT); wndpl.showCmd=SW_SHOW; wndpl.flags=WPF_SETMINPOSITION; wndpl.ptMinPosition=CPoint(0,0); wndpl.ptMaxPosition=CPoint(-::GetSystemMetrics(SM_CXBORDER),-::GetSystemMetrics(SM_CYBORDER)); wndpl.rcNormalPosition=rect; SetWindowPlacement(&wndpl);
nCmdShow=SW_SHOW;
CFrameWnd::ActivateFrame(nCmdShow);
}
在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数中设置为:
cs.style &= WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
| WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | ~WS_MAXIMIZEBOX/* | WS_MAXIMIZE*/;
这样程序运行起来好象根本没有执行这段代码,运行起来的默认状态还是最大化,当我双击标题栏或者点击还原按钮时,才达到我所要的效果(窗口占屏幕一半),请问各位这是什么原因,帮忙啊,急用,谢谢了。
...全文
131 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
huaboy408 2003-12-19
  • 打赏
  • 举报
回复
TO:carbon107(<软件开发思想.h>)
谢谢了,幸亏你提醒我在CWinApp::InitInstance()调用pMainFrame->ShowWindow(m_nCmdShow)前设置CWinApp::m_nCmdShow为SW_SHOWMAXIMIZED
要不然我还找不到原因呢,现在解决了,多谢。
carbon107 2003-12-19
  • 打赏
  • 举报
回复

在CWinApp::InitInstance()调用pMainFrame->ShowWindow(m_nCmdShow)前设置CWinApp::m_nCmdShow为SW_SHOWMAXIMIZED
carbon107 2003-12-19
  • 打赏
  • 举报
回复
要控制一个框架的的最大最小尺寸,你需要做两件事情。

  第一步:在CFrameWnd的继承类中处理消息WM_GETMINMAXINFO,结构MINMAXINFO设置了整个窗口类的限制,因此记住要考虑工具条,滚动条等等的大小。

// 最大最小尺寸的象素点 - 示例
#define MINX 200
#define MINY 300
#define MAXX 300
#define MAXY 400

void CMyFrameWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
 CRect rectWindow;
 GetWindowRect(&rectWindow);

 CRect rectClient;
 GetClientRect(&rectClient);

 // get offset of toolbars, scrollbars, etc.
 int nWidthOffset = rectWindow.Width() - rectClient.Width();
 int nHeightOffset = rectWindow.Height() - rectClient.Height();

 lpMMI->ptMinTrackSize.x = MINX + nWidthOffset;
 lpMMI->ptMinTrackSize.y = MINY + nHeightOffset;
 lpMMI->ptMaxTrackSize.x = MAXX + nWidthOffset;
 lpMMI->ptMaxTrackSize.y = MAXY + nHeightOffset;
}


  第二步:在CFrameWnd的继承类的PreCreateWindow函数中去掉WS_MAXIMIZEBOX消息,否则在最大化时你将得不到预料的结果.

BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
 cs.style &= ~WS_MAXIMIZEBOX;
 return CFrameWnd::PreCreateWindow(cs);
}

carbon107 2003-12-19
  • 打赏
  • 举报
回复
InitInstance()
huaboy408 2003-12-19
  • 打赏
  • 举报
回复
我已经试过了
int nScreenCount=2;
int cxScreen = ::GetSystemMetrics(SM_CXSCREEN);
int cyScreen = ::GetSystemMetrics(SM_CYMAXIMIZED);
CRect rect;
rect.left = 0;
rect.top = 0;
rect.right = cxScreen;
rect.bottom = cyScreen;//wei le bu bei ren wu lan zhe zhu
if(nScreenCount==2)
{
rect.right=rect.right/2;
}
else if(nScreenCount==4)
{
rect.right=rect.right/2;
rect.bottom=rect.bottom/2;
}
cs.x = rect.left;
cs.y = rect.top;
cs.cx = rect.Width();
cs.cy = rect.Height();

这样还是不行
carbon107 2003-12-19
  • 打赏
  • 举报
回复
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.x = 0;
cs.y = 0;
cs.cx = 1024;
cs.cy = 768;

cs.style = WS_BORDER | WS_CAPTION | WS_POPUPWINDOW | WS_MAXIMIZE;
cs.style &= ~FWS_ADDTOTITLE;
cs.style &= ~WS_SYSMENU;

if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return TRUE;
}
huaboy408 2003-12-19
  • 打赏
  • 举报
回复
没人帮忙啊,自己顶呀

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧