在Windows编程中,限制窗口最大或最小尺寸的最佳方法是恰当的处理WM_GETMINMAXINFO消息。然而,必须记住的是用户改变大小的窗口不是视图本身--而是视图的父框架窗口。因此,必须在视图的父框架窗口中处理这种大小的改变。
第1步:使用ClassWizard创建新的CMDIChildWnd派生类,它将实现所希望的视图大小限制。
第2步:使用ClassWizard在新创建的CMDIChildWnd派生类中增加WM_GETMINMAXINFO消息处理函数。该消息处理函数的程序清单如下(它限制了窗口的跟踪尺寸,这样框架窗口的成员区域保持在200X50和400X200像素之间):
第3步:选择性的使用ClassWizard在CMDIChildWnd派生类中重载PreCreateWindow()虚函数,该函数的实现清单如下所示(它从窗口风格中移去了WS_MAXIMIZEBOX风格,既最大化按钮):
第4步:不要忘记在适当的文档模板中说明视图框架类,以得到所希望的行为。
解释:
当窗口的大小或位置要改变时,Windows给窗口发送WM_GETMINMAXINFO消息。通过处理该消息并修改MINMAXINFO结构中的各个字段,可以明确的重载窗口的 默认的最大位置和尺寸,或者重载它的 最小或最大跟踪尺寸。
当使用ClassWizard来处理WM_GETMINMAXINFO消息时,ClassWizard产生一个句柄,原型如下:
最大尺寸和位置字段 控制了 当设置窗口为“最大化”状态时的尺寸和位置。
最小和最大跟踪尺寸 分别是 用户使用边界改变窗口大小时,所能达到的最小和最大尺寸。
每个字段都是POINT类型,pt.x和pt.y分别表示了给定大小的宽度和高度。例如lpMMI->ptMinTrackSize.x是允许跟踪的最小宽度,lpMMI->ptMaxTrackSize.y是允许跟踪的最大高度。
关于在第4步中移去Maxmize选项按钮,答案是:如果在处理WM_GETMINMAXINFO消息过程中没有移去这个按钮,那么当框架窗口最大化时就不能正常显示。
附加注释:
在MINMAXINFO结构中赋给ptMinTrackSize和ptMaxTrackSize字段的数值设置了 整个窗口 的跟踪限制,而不仅仅是它的成员区域。因此,这些数值必须考虑到各种接口的窗口小部件(工具栏、滚动栏等等)以及非客户区元素:边界、标题等等。上面程序代码说明了如何计算这些非成员元素的花费。
注意:其它的大部分的解决方案都是使用传统的Windows消息--WM_SIZE、WM_WINDOWPOSCHANGING、WM_WINDOWPOSCHANGED等等--来限制窗口的大小。通常来说,这样做得不到很好的可接受结果。WM_GETMINMAXINFO消息是实现这种功能的最佳选择。
限制MDI窗口尺寸
本文介绍了一种在Windows编程中限制MDI子窗口大小的方法,通过处理WM_GETMINMAXINFO消息并修改MINMAXINFO结构来设定窗口的最小和最大跟踪尺寸。
20

被折叠的 条评论
为什么被折叠?



