一个关于MFC里Listbox control的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个关于MFC里Listbox control的问题相关的知识,希望对你有一定的参考价值。

如何在列表框中显示多个列,像下图这样

在资源编辑器中选择ListCtrl,设置属性为Report
在OnInitDialog中,调用SetExtendedStyle设置扩展风格为LVS_EX_GRIDLINES
DWORD dwStyle = m_list.GetExtendedStyle();
//dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
至于其他更多操作,找度娘即可,有很多介绍用法的博客,其实基本用法和ListBox的差不多。
参考技术A 就是设置一下 LIstCtrl 的属性.
应该是report 风格.
查msdn 最好直接了.
参考技术B 写一个类,继承listBox和listControl追问

能具体点吗,我是新手

MFC (C++):如何按设计设置 ListBox 的宽度?

【中文标题】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里Listbox control的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于MFC对话框里使用Tab Control及相关多页面切换问题

关于MFC:鼠标放在LISTBOX上,把上面显示的信息悬浮地显示出来。

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

VS2010里MFC中的ListBox为啥输出字符时,显示不出字体,只能看到有这一项?

关于MFC中Tree Control控件中的OnSelchanged消息是不是有bug?

MFC ListBox中关联的变量每秒更新,怎样才能过滤掉重复的数据,只显示有变化的数据?