Winapi MFC(C+;+;):如何按设计设置列表框的宽度?

Winapi MFC(C+;+;):如何按设计设置列表框的宽度?,winapi,mfc,listbox,Winapi,Mfc,Listbox,我按照此链接动态设置ListBox的高度()。但是,同时我希望保持宽度固定(即最初在rc中指定的值)。但我不知道如何检索值和设置宽度 我想要实现的是根据项目的数量调整列表框的高度,同时保持设计中规定的固定宽度。我基本上遵循了这里的解决方案()。它会更改高度,但也会修改宽度,这是不可接受的 以下几行通过考虑解决问题的滚动条宽度来调整宽度 rc.right += (GetSystemMetrics(SM_CXEDGE) * 2); + if ((list.GetStyle() &

我按照此链接动态设置ListBox的高度()。但是,同时我希望保持宽度固定(即最初在rc中指定的值)。但我不知道如何检索值和设置宽度

我想要实现的是根据项目的数量调整列表框的高度,同时保持设计中规定的固定宽度。我基本上遵循了这里的解决方案()。它会更改高度,但也会修改宽度,这是不可接受的

以下几行通过考虑解决问题的滚动条宽度来调整宽度

    rc.right += (GetSystemMetrics(SM_CXEDGE) * 2);
+   if ((list.GetStyle() & WS_VSCROLL) != 0)
+       rc.right += GetSystemMetrics(SM_CXVSCROLL);
或者,正如评论中所建议的

-   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);


实际上,您引用的帖子也为列表框宽度的计算提供了解决方案。您是否尝试了void AutosizeListBox(HWND hWndLB)函数的第二个实现?代码位于
编辑:添加了一个计算水平大小的版本
@Jackdaw,如果我理解正确,它是否取决于字符数?我需要的是由设计确定的固定宽度。AutosizeListBox(HWND hWndLB)函数根据列表框中的最大字符串计算宽度,以符合列表框使用的当前字体。字符数不是很重要,这是行的长度,给定当前字体。该帖子中有两个版本的函数。第一个仅更改控件的高度。第二个版本更改宽度和高度。@JonathanPotter,第一个版本也更改宽度。我试图注释掉“rc.right+=…”这一行,但宽度仍在变化,与设计不匹配。只需调用
GetWindowRect
,并在调用
SetWindowPos
@IInspectable时保持宽度,我将GetClientRect替换为GetWindowRect,它就不能正常工作。宽度要大得多。宽度计算为
右-左
。如果是“大得多”,那么你很可能在数学上搞砸了。@i不可测,是的,你是对的。它起作用了,我相应地修改了答案。谢谢你的帮助!