在 VC++6.0 中,可以通过添加一个自定义的子项来实现 CListCtrl 控件的 CheckBox 扩展功能。具体实现步骤如下:

  1. 定义一个结构体来保存 CheckBox 的状态信息:
struct CheckBoxInfo
{
    bool isChecked;
};
  1. 在 CListCtrl 控件中添加一个自定义的子项,用于显示 CheckBox:
int nIndex = m_listCtrl.InsertItem(nCount, _T(""));
m_listCtrl.SetItemData(nIndex, (DWORD_PTR)new CheckBoxInfo());
m_listCtrl.SetItemState(nIndex, INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK);
  1. 在 CListCtrl 控件的 WM_NOTIFY 消息处理函数中处理 CheckBox 的点击事件:
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (pNMListView->uNewState & LVIS_STATEIMAGEMASK)
{
    int nChecked = ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) >> 12) - 1;
    CheckBoxInfo* pInfo = (CheckBoxInfo*)m_listCtrl.GetItemData(pNMListView->iItem);
    pInfo->isChecked = nChecked;
}
  1. 在需要获取 CheckBox 状态的地方,可以通过以下代码获取:
CheckBoxInfo* pInfo = (CheckBoxInfo*)m_listCtrl.GetItemData(nIndex);
bool isChecked = pInfo->isChecked;

完整的代码示例:

// 定义 CheckBox 状态信息结构体
struct CheckBoxInfo
{
    bool isChecked;
};

// 在 CListCtrl 控件中添加自定义子项
int nIndex = m_listCtrl.InsertItem(nCount, _T(""));
m_listCtrl.SetItemData(nIndex, (DWORD_PTR)new CheckBoxInfo());
m_listCtrl.SetItemState(nIndex, INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK);

// 处理 CheckBox 点击事件
void CMyDlg::OnNotify(NMHDR* pNMHDR, LRESULT* pResult)
{
    switch (pNMHDR->code)
    {
    case LVN_ITEMCHANGED:
    {
        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
        if (pNMListView->uNewState & LVIS_STATEIMAGEMASK)
        {
            int nChecked = ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) >> 12) - 1;
            CheckBoxInfo* pInfo = (CheckBoxInfo*)m_listCtrl.GetItemData(pNMListView->iItem);
            pInfo->isChecked = nChecked;
        }
    }
    break;
    }

    *pResult = 0;
}

// 获取 CheckBox 状态
int nIndex = GetSelectedItemIndex();
CheckBoxInfo* pInfo = (CheckBoxInfo*)m_listCtrl.GetItemData(nIndex);
bool isChecked = pInfo->isChecked;
VC++6.0 CListCtrl 控件添加 CheckBox 扩展功能:实现和代码示例

原文地址: https://www.cveoy.top/t/topic/nOS5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录