Visual Studio MFC CListCtrl复选框 - 空格键

时间:2012-05-25 20:43:10

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

我正在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 个答案:

答案 0 :(得分:1)

你是对的。处理多个选择检查状态后,在代码中设置后,允许列表控制句柄检查状态切换。 你必须修改你的代码。 我只是假设您正在处理LVN_KEYDOWN消息。 ( toggleSelect global?为什么?

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