使用 LVS_OWNERDATA 模式的 LVN_GETDISPINFO 消息中没有 LVIF_TEXT
Posted
技术标签:
【中文标题】使用 LVS_OWNERDATA 模式的 LVN_GETDISPINFO 消息中没有 LVIF_TEXT【英文标题】:No LVIF_TEXT in LVN_GETDISPINFO message using LVS_OWNERDATA mode 【发布时间】:2014-11-06 21:46:16 【问题描述】:我在 “虚拟模式” 中使用带有 LVS_REPORT
样式的 列表控件 (CListCtrl
) 在 MFC 中遇到了奇怪的行为 即LVS_OWNERDATA
样式。列表视图本身放置在无模式对话框中。
在对话框的OnInitDialog
方法中,我以两种不同的方式添加两列——“Column 1”和“Column 2”——使用 LVCOLUMN
和 ListView_InsertColumn
宏 (1) 和使用具有HDITEM
结构的CHeaderCtrl
类(2)。
当使用第一种方法 (1) 时,在LVN_GETDISPINFO
消息处理程序中(消息由对话框处理,简单的ON_NOTIFY
)我收到一个掩码(NMLVDISPINFO.item.mask
成员),其中设置了不同的位(LVIF_TEXT
、LVIF_IMAGE
、LVIF_STATE
、LVIF_INDENT
等),在NMLVDISPINFO.item
结构中填写适当的字段后,一切正常。
但是,当使用涉及CHeaderCtrl
类的第二种方法(2) 时,掩码中唯一设置的位是LVIF_INDENT
,我从未收到设置其他任何内容的掩码。
以下是我用来添加这些列的代码:
方法一(1):
LVCOLUMN col;
col.mask = LVCF_TEXT | LVCF_WIDTH;
col.pszText = _T("Column 1");
col.cx = 100;
ListView_InsertColumn(m_MyList, 0, &col); //m_MyList is of CListCtrl type
col.pszText = _T("Column 2");
ListView_InsertColumn(m_MyList, 1, &col);
以及方法二(2):
HDITEM hdItem;
hdItem.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH;
hdItem.fmt = HDF_STRING;
hdItem.cxy = 100;
hdItem.pszText = _T("Column 1");
hdItem.cchTextMax = _tcslen(hdItem.pszText);
m_MyList.GetHeaderCtrl()->InsertItem(0, &hdItem);
others_info.pszText = _T("Column 2");
others_info.cchTextMax = _tcslen(hdItem.pszText);
m_MyList.GetHeaderCtrl()->InsertItem(1, &hdItem);
什么可能导致这种行为?
【问题讨论】:
【参考方案1】:方法 2 错误地将 others_info 用于某些操作而不是其他操作。看起来第一个 InsertItem 使用的文本长度可能为 0。对 InsertItem 的第二次调用重用了自第一次调用以来未更改的相同 hdItem 结构。
【讨论】:
很好,但我需要道歉,others_info
打错了,我已经更正了代码。无论如何,感谢您的帮助。以上是关于使用 LVS_OWNERDATA 模式的 LVN_GETDISPINFO 消息中没有 LVIF_TEXT的主要内容,如果未能解决你的问题,请参考以下文章