Visual Studio MFC CListCtrl 复选框 - 空格键

Posted

技术标签:

【中文标题】Visual Studio MFC CListCtrl 复选框 - 空格键【英文标题】:Visual Studio MFC CListCtrl Checkboxes - Spacebar 【发布时间】:2012-05-25 20:43:10 【问题描述】:

我正在 Visual Studio 2008 中开发 MFC 应用程序。我有一个带有复选框的 CListCtrl 对象。 我想知道是否有一种简单的方法可以让空格键切换所有突出显示的项目。现在,在空格键按下事件中,我正在这样做:

void toggleSelect()

    POSITION pos = m_cListCtrl.GetFirstSelectedItemPosition();
    while(pos)
    
        int index = m_cListCtrl.GetNextSelectedItem(pos);
        BOOL check = m_cListCtrl.GetCheck(index);
        m_cListCtrl.SetCheck(index, !check);
    

如果不是我认为在突出显示单个项目时空格键的默认行为(选中单个项目时复选框会自动切换),这将起作用。这段代码的问题是总有一个复选框未切换。这是因为空格键的默认行为是切换选定的单个项目。无论如何要禁用默认值?

【问题讨论】:

【参考方案1】:

你是对的。处理多选检查状态后,您可以在代码中设置列表控件句柄检查状态切换后进行切换。 你必须修改你的代码。 我只是假设您正在处理 LVN_KEYDOWN 消息。 (toggleSelect 是全局的吗?为什么?

void CYourDlgClass::OnLvnKeydownList1(NMHDR *pNMHDR, LRESULT *pResult)

    LPNMLVKEYDOWN pLVKeyDown = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);

    if(VK_SPACE == pLVKeyDown->wVKey && m_cListCtrl.GetSelectedCount() > 1)
    
            toggleSelect();
            *pResult = 1;
            return;
    

    // TODO: Add your control notification handler code here
    *pResult = 0;


void CYourDlgClass::toggleSelect() 
 
    POSITION pos = m_cListCtrl.GetFirstSelectedItemPosition(); 
    while(pos) 
     
            int index = m_cListCtrl.GetNextSelectedItem(pos); 
            BOOL check = m_cListCtrl.GetCheck(index); 
            m_cListCtrl.SetCheck(index, !check); 
     
 

将 *pResult 设置为 0 表示消息已被处理,不需要进一步处理。 我建议从 CListCtrl 派生类并以类似方式处理 WM_KEYDOWN:

void CMultiCheckListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

    if(VK_SPACE == nChar && GetSelectedCount() > 1)
    
            POSITION pos = GetFirstSelectedItemPosition(); 
            while(pos) 
             
                    int index = GetNextSelectedItem(pos); 
                    BOOL check = GetCheck(index); 
                    SetCheck(index, !check); 
             
            return;
    

    CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);

【讨论】:

感谢您的详细回复,约翰。我没有考虑过覆盖按键事件。现在效果很好:)

以上是关于Visual Studio MFC CListCtrl 复选框 - 空格键的主要内容,如果未能解决你的问题,请参考以下文章

CMake构建Visual Studio中MFC项目的MFC配置问题

如何在 Visual Studio 2017 中创建 Visual c++ MFC 控制台项目

多字节 MFC 库未检测到 Visual Studio

Visual Studio 2008. MFC 事件向导损坏

为啥我的 Visual Studio 2013 项目需要 mfc100.dll?

Visual Studio 2019报错:缺少mfc120.dll