为啥我的列表框没有调整大小? (动态调整对话框组件的大小)

Posted

技术标签:

【中文标题】为啥我的列表框没有调整大小? (动态调整对话框组件的大小)【英文标题】:Why is my listbox not resizing? (Dynamically resizing dialog components)为什么我的列表框没有调整大小? (动态调整对话框组件的大小) 【发布时间】:2018-04-14 16:34:21 【问题描述】:

我的应用是 Win32;我正在使用 VS 2015。我有一个包含列表框的对话框。我将列表框设置为动态调整大小,但在调整对话框大小时它不会改变。

这里是列表框的属性:

列表框是所有者绘制的:

这是对话框的默认大小:

这是我在资源研讨会对话框编辑器中以测试模式拉伸时对话框的样子。注意里面的列表框也像希望的那样展开了:

但是,当它实际运行时,拉伸对话框并不会增加列表框的大小:

为什么这不起作用?我必须调用一些额外的巫术才能让它真正起作用吗?这仅适用于MFC吗? CWnd::ExecuteDlgInit 的 Win32 等效项是什么?

注意:我已经看过https://msdn.microsoft.com/en-us/library/mt270148.aspx和http://mariusbancila.ro/blog/2015/07/27/dynamic-dialog-layout-for-mfc-in-visual-c-2015/,但我没有找到答案。

【问题讨论】:

它只适用于 MFC。在纯 Win32 中,您必须自己完成所有操作。 真的吗?叹息......我知道如何从头开始,我只是希望摆脱乏味。感谢您的反馈。 Win32 有很多第三方调整大小/布局类,我相信我已经使用了一段时间的this one from codeproject 的修改版本。主要是我将MoveWindow() 替换为DeferWindowPos() 以减少闪烁(确保还为您的对话框设置WS_CLIPCHILDREN)。 【参考方案1】:

这仅在 MFC 中有效吗?

确实,这仅在使用 MFC 时有效。

CWnd::ExecuteDlgInit 的 Win32 等价物是什么?

MFC 是建立在 Windows API 之上的库。 Windows API 中的窗口系统不提供任何类型的布局管理。如果您想查看等效的 Windows API,它实际上就是在 MFC 中实现的。

那么,为什么图形资源编辑器支持这个呢?因为那是生成布局信息的地方。它最终被放置在一个AFX_DIALOG_LAYOUT 类型的自定义资源中,MFC 将它拾起以发挥它的魔力。如果您没有使用 MFC,则该资源将被忽​​略。

这并不是说 - 从理论上讲 - 您将无法实现自己的解决方案来读取生成的资源。只要您能找到 MFC 使用的自定义资源的文档即可。我没有,但查看 MFC 源代码后发现,它非常简单(一个版本 WORD,后跟一对 WORDs 用于水平和垂直移动和大小设置)。

【讨论】:

【参考方案2】:

Windows 模板库也支持此功能! https://sourceforge.net/p/wtl/git/ci/master/tree/Include/atlframe.h

如果您查看 CDynamicDialogLayout 类,您可以了解它是如何工作的,如果您使用 WTL,您甚至可以自己使用该功能。

【讨论】:

【参考方案3】:

作为记录,我也在寻找解决方案,当我调整对话框上的控件大小时,所有动态调整大小都停止工作,尽管它在测试模式下工作正常。

要修复它,在您发布的第二个链接中有一个关于添加功能的部分: void CMFCDynLayoutDemoDlg::SetupDynamicLayout()

在哪里重新设置动态布局管理器

一旦我这样做了,它就开始在我的实时版本中工作。

这篇文章中也有非常相似的答案:

Recalculate dynamic layout properties

【讨论】:

这个答案不适用,因为 OP 没有使用 MFC。

以上是关于为啥我的列表框没有调整大小? (动态调整对话框组件的大小)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Scrolltrigger 在调整窗口大小时不更新我的动态 x 值?

为啥我的动态数组可以在不调整大小的情况下工作? [复制]

调整大小时隐藏的组合框

VS2019 mfc combo box 调整下拉框高度(实测可行)及初始化

如果 Layout 连接到父级,为啥动态调整大小不起作用?

向对话框添加垂直抓手