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 的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

一个关于MFC里Listbox control的问题

关于VC++ MFC ListBox控件显示数据的问题

MFC LISTBOX使用

猎豹MFC--下拉框ComboBox 列表框ListBox

关于MFC里的listBox

我使用mfc里的listbox制作了一个列表,想将文件加入列表之后,单击左边的任何一个歌曲,