VC++6.0 CListCtrl 控件添加 CheckBox 扩展功能:实现和代码示例
在 VC++6.0 中,可以通过添加一个自定义的子项来实现 CListCtrl 控件的 CheckBox 扩展功能。具体实现步骤如下:
- 定义一个结构体来保存 CheckBox 的状态信息:
struct CheckBoxInfo
{
bool isChecked;
};
- 在 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);
- 在 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;
}
- 在需要获取 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;
原文地址: https://www.cveoy.top/t/topic/nOS5 著作权归作者所有。请勿转载和采集!