0

我正在 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);
    }
}

如果在突出显示单个项目时不适用于空格键的默认行为,这将是有效的(在选择单个项目时自动切换复选框)。这段代码的问题是总有一个复选框未切换。这是因为空格键的默认行为是切换选定的单个项目。反正有没有禁用默认值?

4

1 回答 1

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);
}
于 2012-05-26T10:12:24.127 回答