防止用户改变窗口大小的方法

来源:互联网 发布:淘宝上架宝贝时间技巧 编辑:程序博客网 时间:2024/06/05 04:34

1,在OnNcHitTest函数处理中,不处理返回HTTOPLEFT,HTTOPRIGHT,HTBOTTOMLEFT,HTBOTTOMRIGHT。

2,在OnGetMinMaxInfo函数中,用setwindowpos,如果你想使你的窗口被人设置大小时不能无限制的缩小,你可以处理wm_size事件,然后判断当前窗口的大小,当小于你的要求时,用setqindowpos来保持窗口的大小。

方法0:不需要做特别的事情,只需要在CMainFrame添加消息响应WM_GETMINMAXINFO即可……用这个函数可以解决OnSize闪烁问题~

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // TODO:在此添加消息处理程序代码和/或调用默认值
   lpMMI->ptMinTrackSize.x =900;
   lpMMI->ptMinTrackSize.y =600;
   lpMMI->ptMaxTrackSize.x=900;
   lpMMI->ptMaxTrackSize.y=600;
   CFrameWnd::OnGetMinMaxInfo(lpMMI);
}



CWnd::OnGetMinMaxInfo

afx_msg void OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI );

参数:

lpMMI指向一个MINMAXINFO结构,其中包含了有关窗口的最大化大小和位置以及最小、最大跟踪大小的信息。有关这个结构的更多信息参见MINMAXINFO结构。


说明:
每当Windows需要知道窗口的最大化位置或大小,或者最小、最大的跟踪大小时,框架就调用这个成员函数。最大化大小是指当窗口的边框被完全扩展时窗口的大小。窗口的最大跟踪大小是指用边框改变窗口的大小时可以达到的最大窗口大小。窗口的最小跟踪大小是指用边框改变窗口大小时可以达到的最小窗口大小。
Windows填充一个点组成的数组,为不同的位置和大小指定了缺省值。应用程序可以在OnGetMinMaxInfo中改变这些值。
注意框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现,则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。


方法一:重载消息:WM_GETMINMAXINFO。

1. 消息:ON_WM_GETMINMAXINFO
BEGIN_MESSAGE_MAP(COfflineSCDlg, CDialog)
//{{AFX_MSG_MAP(COfflineSCDlg)
ON_WM_GETMINMAXINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

2. 类定义:afx_msg void OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI);
public:
// Dialog Data
//{{AFX_DATA(COfflineSCDlg)
enum { IDD = IDD_AAA_DIALOG };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(COfflineSCDlg)
public:
virtual BOOL DestroyWindow();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDVsupport
virtual void OnSize(UINT nType, int cx, int cy);
afx_msg void OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI );
//}}AFX_VIRTUAL

3. 实现:OnGetMinMaxInfo
// 限制窗口的大小
voidCAAADlg::OnGetMinMaxInfo(MINMAXINFO  FAR*   lpMMI)
{
lpMMI->ptMinTrackSize.x=400; //限定最小宽度
lpMMI->ptMinTrackSize.y=400; //限定最小高度
// lpMMI->ptMaxTrackSize.x=100; //限定最大宽度
// lpMMI->ptMaxTrackSize.y=100; //限定最大高度

CDialog::OnGetMinMaxInfo(lpMMI);  
}

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

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