Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何捕获listctrl单元格中复选框的单击事件?_C++_Mfc_Listcontrol - Fatal编程技术网

C++ 如何捕获listctrl单元格中复选框的单击事件?

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

参考上面的答案,我列出了一个带有复选框的列表

现在我的上级要求我首先禁用OK按钮,在至少检查一行时启用它


我查了一下,当一个复选框在一个列表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的链接:

链接到的问题说明如何响应项目状态更改。链接到的问题说明如何响应项目状态更改。