处理 listcontrol 列标题复选框单击问题?

Posted

技术标签:

【中文标题】处理 listcontrol 列标题复选框单击问题?【英文标题】:Issue with handling listcontrol column header checkbox click? 【发布时间】:2014-09-08 14:24:55 【问题描述】:

我目前正在处理属性表,其中我的第二页包含一个列表控件。我已将复选框添加到列标题并使用 LVS_EX_CHECKBOX 样式设置列表控件。所以,现在第一个列及其标题由复选框组成.

当我一一检查与项目对应的复选框时,当我检查列表的最后一个项目复选框时,标题复选框也被选中。到此为止没问题。现在我取消选择所有复选框并现在尝试单击标题复选框以设置所有项目复选框的检查状态。不幸的是,我无法选中列表项复选框。只有该标题复选框被选中和取消选中。

在页面类中按如下方式在listheader中添加checkbox。

BOOL OnInitDialog()

DWORD dwStyle = ::GetWindowLong(header, GWL_STYLE);
dwStyle |= HDS_CHECKBOXES;
::SetWindowLong(header, GWL_STYLE, dwStyle);

m_listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle() |
                            LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);


我尝试处理以下事件以获取列标题复选框单击

HDN_ITEMCLICK

HDN_ITEMSTATEICONCLICK

//这是在 LVN_ITEMCHANGED 事件处理程序中实现的(当逐个检查列表项复选框并在列表中进行最终检查时,我正在设置标题复选框)。

void CMFPSearchListView::OnListViewItemchanged(NMHDR *pNMHDR, LRESULT *pResult)

LVCOLUMN pColumn = 0;
pColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
m_listCtrl.GetColumn(0, &pColumn);
if(blAllChecked)
    pColumn.fmt |= HDF_CHECKED;
else
    pColumn.fmt &= ~HDF_CHECKED;


//m_listCtrl.InsertColumn(1, &pColumn);
m_listCtrl.SetColumn(0, &pColumn);
*pResult=0;    

如果我没有触发正确的事件,谁能告诉我。 任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

这是您需要处理的HDN_ITEMSTATEICONCLICK消息。

ON_NOTIFY(HDN_ITEMSTATEICONCLICK, 0, &CMFPSearchListView::OnHdnItemStateIconClickListctrl)

处理程序代码:

void CMFPSearchListView::OnHdnItemStateIconClickListctrl(NMHDR *pNMHDR, LRESULT *pResult)

    LPNMHEADER pNMHeader = (LPNMHEADER)pNMHDR;

    // first determine whether the click was a checkbox change
    if (pNMHeader->pitem->mask & HDI_FORMAT && pNMHeader->pitem->fmt & HDF_CHECKBOX)
    
        // now determine whether it was checked or unchecked
        BOOL bUnChecked = pNMHeader->pitem->fmt & HDF_CHECKED;

        // apply check state to each list item
        for (int nItem = 0; nItem < m_listCtrl.GetItemCount(); nItem++)
            m_listCtrl.SetCheck(nItem, !bUnChecked);
    

    *pResult = 0; 

【讨论】:

感谢您的回复。当我按照您的建议进行操作时,当我选中标题复选框时,所有项目都被选中,但列表中的整个项目都进入选择模式(蓝色选择到列表中的所有项目)。当我们选择标题复选框时,我们如何避免选择只有项目应该被选中?在这个选择没有到来之前。在我按照你的建议做了之后,这是因为任何样式设置要完成吗? 其实listcontrol设置为如下样式。 m_listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle() |LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);我应该更改列表控件样式吗? 所有被选中的项目都是默认的 CListCtrl 行为,当返回 pResult = 0; 我们不能避免这种选择吗? 解决了这个问题。只需设置 pResult = 1;让我摆脱了那个选择。感谢您的宝贵建议和帮助:)

以上是关于处理 listcontrol 列标题复选框单击问题?的主要内容,如果未能解决你的问题,请参考以下文章

处理 CListCtrl 鼠标点击的问题

VC++如何在多列中添加复选框

win32如何触发一个窗口中listcontrol控件的单击事件?

如何使 JTable 列包含复选框?

猎豹MFC--列表控件ListControl

如何从 ListControl(ListView) 中检索数据?