具有LVS_EX_CHECKBOXES样式的CListCtrl

时间:2013-04-29 08:43:31

标签: visual-studio visual-c++ user-interface mfc listctrl

我正在使用具有LVS_EX_CHECKBOXES样式的CListCtrl。 我需要随时设置至少两个复选框。

我该怎么做?

1 个答案:

答案 0 :(得分:4)

首先,您需要捕获LVN_ITEMCHANGING通知,这通过从CListCtrl派生您自己的类(例如,称为CMyListCtrl)然后添加消息映射条目来轻松完成如下:

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
    ON_NOTIFY_REFLECT(LVN_ITEMCHANGING, &CMyListCtrl::OnLvnItemchanging)
END_MESSAGE_MAP()

然后,你像这样编写消息处理程序:

void CMyListCtrl::OnLvnItemchanging(NMHDR *pNMHDR, LRESULT *pResult)
{
    // an item has changed
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

    // by default, allow change
    *pResult = 0;

    // see if item was checked or unchecked
    if ((pNMLV->uNewState & 0x2000) == 0x2000)
    {
        // item was checked - do anything you like here
    }
    else if ((pNMLV->uNewState & 0x1000) == 0x1000)
    {
        // item was unchecked - see how many selections we have
        if (/* pseudocode */ number of selected items < 2)
        {
            // disallow change
            *pResult = 1;
        }
    }
}

条件是伪代码,因此您可以决定如何跟踪选择的数量 - 可以通过向上述方法添加代码来保持计数,或者在那里放置一个循环来获取每个项目的检查状态和做一个记录。

我认为这应该足以让你感动,所以如果你进一步陷入困境,请更新你的问题。