1

在 listctrl 上插入复选框列

我制作了一个带有复选框列的列表,咨询了上面的答案。

在此处输入图像描述

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

当复选框位于 listctrl 中时,我查找似乎有一种简单的方法可以捕获单击事件。

4

1 回答 1

3

添加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);
        }
    }
}

您可以添加GetDlgItem(IDOK)->EnableWindow(FALSE);OnInitDialog以便最初禁用“确定”按钮。

旁注,您的对话框正在使用旧样式外观。请参阅有关使用现代风格 UI 的链接: 升级后的 MFC 应用程序仍然看起来很旧

于 2020-06-15T04:02:18.657 回答