MFC:从控件本身的代码限制子控件的大小

Posted

技术标签:

【中文标题】MFC:从控件本身的代码限制子控件的大小【英文标题】:MFC: limit the size of child control from the code of control itself 【发布时间】:2019-02-28 16:57:54 【问题描述】:

说,我有一个 CListCtrl 派生控件。我希望它始终是正方形的(即它的宽度和高度应该始终彼此相等)。

控件驻留在对话框中(基于 CDialog),一旦对话框调整大小,它就会调整大小(使用 SetWindowPos() 调整控件大小)。我想要实现的是使控件无法正确调整大小:无论传递给 SetWindowPos 的内容如何,​​控件都必须始终具有相等的水平和垂直尺寸。

当然,我可以控制传递给 SetWindowPos 的值。问题是:是否可以在该控件本身的代码中控制 CListCtrl 派生控件的大小?

【问题讨论】:

在 MFC 中,转到资源编辑器,右键单击控件。属性部分将显示“动态布局”。将“尺寸类型”设置为“两者”。这将在调整主对话框大小时按比例调整子控件的大小。 为什么不简单地调用SetWindowPos() 并首先使用适当的值? @Barmak Shemirani:它不会起作用,控件最初可能是方形的,但在调整大小的过程中它会变成矩形(无论是否成比例),因为显示器屏幕不是方形的. @Jabberwocky:我希望控件能够防止自己不正方形,这就是任务本身。我已经特别提到我可以预处理 SetWindowPos() 的值,毫无疑问,如果这样做可以做到这一点。 【参考方案1】:

如果您将控件子类化并让它处理WM_SIZING message,您可以以任何您喜欢的方式限制调整大小。只需修改随消息传递的RECT 结构。

【讨论】:

很好的提示,我可以通过 WM_WINDOWPOSCHANGING 处理实现我所需要的...由于某种原因,我的控件没有收到 WM_SIZING。为什么 WM_SIZING 可能无法控制? @Roman 感谢您的反馈。当窗口被边缘拖动时,您可能只会得到WM_SIZING。在您的情况下,它显然是由父对话框控制的? 控件的大小是通过从父对话框的 WM_SIZE 处理程序发生的显式 SetWindowPos() 调用来更改的。所以是的,控件的大小不会以“自然”的方式拖动边缘来改变。

以上是关于MFC:从控件本身的代码限制子控件的大小的主要内容,如果未能解决你的问题,请参考以下文章

Flutter控件——布局控件:约束限制子组件大小的组件

限制列表控件 MFC 中的条目数

让子控件宽度大小适合并限制其最大值

如何在 MFC 静态控件中增加字符限制

C# WinForm 自定义控件如何实现动态添加子控件

MFC中怎么让子窗体大小随着父窗口的大小变化而改变?