C++ 如何捕获listctrl单元格中复选框的单击事件?
参考上面的答案,我列出了一个带有复选框的列表 现在我的上级要求我首先禁用OK按钮,在至少检查一行时启用它C++ 如何捕获listctrl单元格中复选框的单击事件?,c++,mfc,listcontrol,C++,Mfc,Listcontrol,参考上面的答案,我列出了一个带有复选框的列表 现在我的上级要求我首先禁用OK按钮,在至少检查一行时启用它 我查了一下,当一个复选框在一个列表Ctrl中时,似乎有一种简单的方法来捕捉点击事件。将LVN\u ITEMCHANGED添加到消息映射中。当对列表项进行更改时,这将通知对话框: BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemChanged) ... EN
我查了一下,当一个复选框在一个列表Ctrl中时,似乎有一种简单的方法来捕捉点击事件。将
LVN\u 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);
}
}
}
void CMyDialog::OnItemChanged(NMHDR*pNMHDR,LRESULT*)
{
NMLISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
如果(pNMListView->uChanged&LVIF_状态)
{
如果(pNMListView->uNewState&LVIS_stateMimageMask&&pNMListView->iItem>=0)
{
BOOL checked_once=假;
对于(int i=0;i启用窗口(选中一次);
}
}
}
您可以添加GetDlgItem(IDOK)->EnableWindow(FALSE)在<代码>OnInitDialog
中进行代码>以便最初禁用“确定”按钮
旁注,您的对话框使用的是旧式外观。请参见有关使用现代样式UI的链接:
将
LVN\u 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);
}
}
}
void CMyDialog::OnItemChanged(NMHDR*pNMHDR,LRESULT*)
{
NMLISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
如果(pNMListView->uChanged&LVIF_状态)
{
如果(pNMListView->uNewState&LVIS_stateMimageMask&&pNMListView->iItem>=0)
{
BOOL checked_once=假;
对于(int i=0;i启用窗口(选中一次);
}
}
}
您可以添加GetDlgItem(IDOK)->EnableWindow(FALSE)在<代码>OnInitDialog
中进行代码>以便最初禁用“确定”按钮
旁注,您的对话框使用的是旧式外观。请参见有关使用现代样式UI的链接:
链接到的问题说明如何响应项目状态更改。链接到的问题说明如何响应项目状态更改。