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

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去掉。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Microsoft Foundation Classes (MFC) 是一组用于 Windows 编程的标准 C++ 类库,它使得创建图形用户界面(GUI)变得更加容易。在 MFC 中设置窗口大小主要有两种方式:通过属性编辑器直接设置,以及在代码中动态修改。 ### 通过属性编辑器设置窗口大小 在使用 MFC 的情况下,通常在 Visual Studio 或其他 IDE 中打开 MFC 项目的属性页面(右击项目 -> 属性)。在“资源”或“项目属性”中找到“主框架”或“视图”,并进入“窗口”选项卡。 在这里,您可以看到窗口的“最小尺寸”、“最大尺寸”以及“默认尺寸”。您可以直接修改这些值来设置窗口的大小限制。此外,“初始位置和大小”部分允许指定窗口首次加载时的尺寸和位置。 ### 在代码中设置窗口大小 在 MFC 应用中,您也可以通过编写代码动态改变窗口大小。这通常是通过修改 `CFrameWnd` 或其派生类(例如 `CDialog` 或 `CToolKit` 等)的对象的尺寸来完成的。以下是一个简单的示例: ```cpp // 假设 `MyView` 是您的视图类的一个实例 void MyView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // 当窗口大小发生变化时,根据需要调整布局或内容 AdjustLayout(); } void MyView::AdjustLayout() { // 您可以根据窗口的新大小来调整 UI 元素的位置和大小 // 例如,移动某个按钮或者重新分配文本区域的尺寸 CRect rect; // 用于存放当前控件的矩形坐标 myButton.GetWindowRect(rect); // 假设 `myButton` 是您想要调整大小的按钮 // 根据新的窗口尺寸调整按钮的位置和大小 rect.right += 50; // 增加一些额外空间 rect.bottom -= 30; // 减小底部空间以便适应新的高度需求 myButton.MoveWindow(&rect); } ``` 在这个例子中,`OnSize` 方法会在窗口大小变化时自动调用,您可以在其中加入对窗口内部布局或元素的调整逻辑。而 `AdjustLayout` 方法则演示了如何根据新的窗口尺寸重新定位和调整一个假想的按钮。 ### 相关问题: 1. MFC 是否支持响应鼠标拖动调整窗口大小的功能? - MFC 支持通过添加特定的 WM_SIZE 和 WM_NCMOVE 消息处理器来响应鼠标拖动调整窗口大小。这涉及到监听和处理窗口边角或边缘的双击或拖动动作。 2. 如何在 MFC 中动态改变窗口标题栏的颜色? - 要动态改变窗口标题栏的颜色,通常需要自定义窗口类并覆盖 `Create` 方法,然后在创建过程中使用 `SetSysColor` 或类似函数来设置颜色。然而,MFC 默认不支持直接从代码中改变标题栏的颜色,因为这通常由底层操作系统的窗口管理器控制。 3. MFC 中的窗口大小限制是如何实现的? - MFC 提供了窗口的最大尺寸限制通过在其属性页中配置“最大尺寸”选项实现。当尝试将窗口大小设置超出这个限制时,系统会自动裁剪或放大缩放至限制范围内。这种方式主要是为了防止窗口过大导致用户界面不可见或难以控制的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值