【问题标题】:Visual Studio MFC CListCtrl Checkboxes - SpacebarVisual Studio MFC CListCtrl 复选框 - 空格键
【发布时间】: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);
    }
}

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

【问题讨论】:

    标签: c++ visual-studio-2008 visual-c++ mfc


    【解决方案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);
    }
    

    【讨论】:

    • 感谢您的详细回复,约翰。我没有考虑过覆盖按键事件。现在效果很好:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2019-06-02
    • 2011-06-26
    • 2020-01-20
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多