MFC (C++):如何按设计设置 ListBox 的宽度?
Posted
技术标签:
【中文标题】MFC (C++):如何按设计设置 ListBox 的宽度?【英文标题】:MFC (C++): how to set the width of ListBox as designed? 【发布时间】:2020-02-05 19:23:02 【问题描述】:我正在关注此链接以动态设置 ListBox 的高度 (How to resize a Win32 listbox to fit its content?)。但是,同时我想保持宽度固定(即最初在 rc 中指定的值)。但我不知道如何检索值并设置宽度。
【问题讨论】:
其实你引用的帖子也提供了ListBox宽度计算的解决方案。您是否尝试过 void AutosizeListBox(HWND hWndLB) 函数的第二个实现?代码位于EDIT: Added a version that calculates horizontal size as well
下。
@Jackdaw,如果我理解正确,是否取决于字符数?我需要的是由设计确定的固定宽度。
AutosizeListBox(HWND hWndLB) 函数根据 ListBox 中的最大字符串计算宽度,以尊重 ListBox 使用的当前字体。考虑到当前字体,字符数并不那么重要,这就是行的长度。
那篇文章中有两个版本的函数。第一个仅更改控件的高度。第二个改变宽度和高度。
@JonathanPotter,第一个版本也改变了宽度。我尝试注释掉“rc.right += ...”这行,但是宽度还是变了,和设计不匹配。
【参考方案1】:
我想要实现的是根据项目数调整 ListBox 的高度,同时保持设计中指定的宽度固定。我非常关注这里的解决方案(How to resize a Win32 listbox to fit its content?)。它改变了高度,但也修改了宽度,这是不可接受的。
以下行通过考虑修复问题的滚动条宽度来调整宽度。
rc.right += (GetSystemMetrics(SM_CXEDGE) * 2);
+ if ((list.GetStyle() & WS_VSCROLL) != 0)
+ rc.right += GetSystemMetrics(SM_CXVSCROLL);
或者按照 cmets 中的建议,
- rc.right += (GetSystemMetrics(SM_CXEDGE) * 2);
rc.bottom += GetSystemMetrics(SM_CXEDGE) * 2;
+ RECT window_rc;
+ ::GetWindowRect(hWndLB, &window_rc);
// resize
- ::SetWindowPos(hWndLB, 0, 0, 0, rc.right, rc.bottom, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
+ ::SetWindowPos(hWndLB, 0, 0, 0, window_rc.right - window_rc.left, rc.bottom, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
【讨论】:
只需调用GetWindowRect
并保持调用SetWindowPos
的宽度。
@IInspectable,我用 GetWindowRect 替换了 GetClientRect,它不能正常工作。宽度要大得多。
宽度计算为right - left
。如果那是“大得多”,你可能搞砸了。
@IInspectable,是的,你是对的。它有效,我相应地修改了答案。感谢您的帮助!以上是关于MFC (C++):如何按设计设置 ListBox 的宽度?的主要内容,如果未能解决你的问题,请参考以下文章