| 如何将限制frame最大和最小尺寸? 为了达到限制的目的,你必须做以下两件事情。在CFrameWnd的继承类上处理WM_GETMINMAXINFO消息,这是因为当用户重新设置View的大小时,他们实际在处理View的Frame。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);
//取得工具栏等的offset
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继承类的PreCreateWindows中删除了WS_MAXIMIZEBOX。如果你没有删除,在View最大化时,Frame就会出问题。如果你确实希望看到会发生什么,你可以保留WM_MAXIMIZEBOX标记,看看最大化时会出现什么情况。
BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~WS_MAXIMIZEBOX;
return CFrameWnd::PreCreateWindow(cs);
} |