当用户改变窗口大小时,若小于某一值,便不再缩小窗口,如何才能做到?

解决方案 »

  1.   

    响应WM_GETMINMAXINFO消息。如最小尺寸是640*480void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
    {
    // TODO: Add your message handler code here and/or call default
    lpMMI->ptMinTrackSize.x = 640;
    lpMMI->ptMinTrackSize.y = 480;
    CXTFrameWnd::OnGetMinMaxInfo(lpMMI);
    }
      

  2.   

    为了达到限制的目的,你必须做以下两件事情。在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); }