如何最大化窗口

网上有关“如何最大化窗口”话题很是火热 ,小编也是针对如何最大化窗口寻找了一些与之相关的一些信息进行分析 ,如果能碰巧解决你现在面临的问题,希望能够帮助到您 。

1. 窗口的最大化

修改MFC的窗口界面的外观,修改MFC窗口的外观要用到类风格(CS_XXXX)和窗口风格(WS_XXXX) ,MFC在WinMain函数的最开始都定义了WNDCLASS窗口类,该类可以改变窗口的图标,背景 ,光标等;若要改变窗口的大小,一般在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中修改构造类cs的值,可以修改cs的cx ,cy来改变大小;

如 果要最大化,就要修改cs.style|=WS_MAXIMIZE 使主框架类(CMainFrame)最大化,自然视图类(CView)创建时也会跟随主框架类(CMainFrame)而变化 ,但是此时显示时,仍然是没 有变化,因为MFC主框架类(CMainFrame)的最后显示要通过SW_XXXX参数来决定 ,网上有些朋友就建议在 CXXXXApp::InitInstance()中的m_pMainWnd-ShowWindow(SW_SHOW);前加入 m_pMainWnd-ShowWindow(SW_SHOWMAXIMIZED);或直接改掉 ,其实最终效果可以实现,但运行开始时会出现先是 正常的小窗口,然后马上变成最大化 ,给人的视觉效果明显不好,

那为什么会产生这种效果,是因为在 m_pMainWnd-ShowWindow(SW_SHOWMAXIMIZED);调用之前会先调用 CMainFrame::ActivateFrame(int nCmdShow);此时便会根据nCmdShow(默认为SW_SHOWNORMAL)调用显示窗口一次 ,SW_SHOWNORMAL会根据cs中的 cx,cy,x ,y来显示窗口,所以cs.style便失去作用(视图类(CView)已经创建,所以它已经是最大化了) ,所以再次调用 m_pMainWnd-ShowWindow(SW_SHOWMAXIMIZED);会形成视觉暂留,

最终解决方法是重载CMainFrame::ActivateFrame(int nCmdShow);令nCmdShow=SW_SHOWMAXIMIZED即可,然后m_pMainWnd-ShowWindow(SW_SHOW);会根据之前的设置而显示窗口

2. CView中的控件改变大小 。

使用GetClientRect (&rect)可以得到客户区的大小 ,但是MFC先按默认大小显示窗口然后再最大化 ,所以在OnInitialUpdate()函数里调用GetClientRect ()函数得到的Rect大小是最大化以前,若想在OnInitialUpdate()函数里生成控件并均匀排列无法达到预期效果,这时候需要在程序最大化以后再在重载的OnSize ()函数里调用控件的MoveWindow函数重新布局控件。

1、

要控制一个框架的的最大最小尺寸,你需要做两件事情.在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);

}

2 、

由于一般窗口大小的改变 ,都是用户拖动窗口边框而造成的。所以,我们可以截获主窗口消息 WM_NCHITTEST在其响应函数中判断CWnd::OnNcHitTest()的返回值是否为 HTRIGHT,HTLEFT,HTTOP,HTBOTTOM四个值之一,如果是 ,说明用户此时已点击了四个边框之一,此时我们应该返回 HTCLIENT.那么,鼠标的形状就不会变成水平或垂直的双向箭头 ,用户就不可能依靠拖动边框来改变窗口大小了 。

另外,还应补上一个小漏洞,就是还要把系统菜单中的SC_SIZE去掉。

关于“如何最大化窗口 ”这个话题的介绍 ,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

(24)

猜你喜欢

发表回复

本站作者才能评论

评论列表(3条)

  • 书生思烟的头像
    书生思烟 2025年09月20日

    我是乐信号的签约作者“书生思烟”

  • 书生思烟
    书生思烟 2025年09月20日

    本文概览:网上有关“如何最大化窗口”话题很是火热,小编也是针对如何最大化窗口寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1. 窗口的最大化修改...

  • 书生思烟
    用户092012 2025年09月20日

    文章不错《如何最大化窗口》内容很有帮助

联系我们:

邮件:乐信号@gmail.com

工作时间:周一至周五,9:30-17:30,节假日休息

关注微信