如何捕获 listctrl 单元格中复选框的单击事件?
How to catch the click event of checkbox which is in a listctrl cell?
我根据上面的答案制作了一个带有复选框列的列表。
现在我的上司让我先禁用确定按钮,至少有一行被选中时才启用它。
我查了一下,似乎有一种简单的方法可以在 listctrl 中有一个复选框时捕获点击事件。
将 LVN_ITEMCHANGED
添加到消息映射。这将在对列表项进行更改时通知对话框:
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemChanged)
...
END_MESSAGE_MAP()
接下来,处理消息并在每次选中或取消选中列表项时进行响应。然后你必须遍历列表框中的所有项目并使用 CListCtrl::GetCheck
。示例:
void CMyDialog::OnItemChanged(NMHDR* pNMHDR, LRESULT*)
{
NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->uChanged & LVIF_STATE)
{
if(pNMListView->uNewState & LVIS_STATEIMAGEMASK && pNMListView->iItem >= 0)
{
BOOL checked_once = FALSE;
for(int i = 0; i < m_list.GetItemCount(); i++)
if(m_list.GetCheck(i))
checked_once = TRUE;
GetDlgItem(IDOK)->EnableWindow(checked_once);
}
}
}
您可以在 OnInitDialog
中添加 GetDlgItem(IDOK)->EnableWindow(FALSE);
,这样 OK 按钮最初是禁用的。
旁注,您的对话框使用的是旧式外观。关于使用现代风格 UI,请参阅此 link:
我根据上面的答案制作了一个带有复选框列的列表。
现在我的上司让我先禁用确定按钮,至少有一行被选中时才启用它。
我查了一下,似乎有一种简单的方法可以在 listctrl 中有一个复选框时捕获点击事件。
将 LVN_ITEMCHANGED
添加到消息映射。这将在对列表项进行更改时通知对话框:
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemChanged)
...
END_MESSAGE_MAP()
接下来,处理消息并在每次选中或取消选中列表项时进行响应。然后你必须遍历列表框中的所有项目并使用 CListCtrl::GetCheck
。示例:
void CMyDialog::OnItemChanged(NMHDR* pNMHDR, LRESULT*)
{
NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->uChanged & LVIF_STATE)
{
if(pNMListView->uNewState & LVIS_STATEIMAGEMASK && pNMListView->iItem >= 0)
{
BOOL checked_once = FALSE;
for(int i = 0; i < m_list.GetItemCount(); i++)
if(m_list.GetCheck(i))
checked_once = TRUE;
GetDlgItem(IDOK)->EnableWindow(checked_once);
}
}
}
您可以在 OnInitDialog
中添加 GetDlgItem(IDOK)->EnableWindow(FALSE);
,这样 OK 按钮最初是禁用的。
旁注,您的对话框使用的是旧式外观。关于使用现代风格 UI,请参阅此 link: