c++ - Visual Studio MFC CListCtrl 复选框 - 空格键

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

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

最佳答案

你是对的。处理多选检查状态后,您可以在代码中设置后允许列表控件处理检查状态切换。 你必须修改你的代码。 我只是假设您正在处理 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);
}

关于c++ - Visual Studio MFC CListCtrl 复选框 - 空格键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10761103/

相关文章:

c++ - 如何使用Boost::GIL垂直翻转图像

c++ - 是否有有关在 Visual Studio 2008 中进行 C++ 编程的教程?

c++ - 访问违规写入位置,在我的循环中

c++ - 在另一个进程地址空间,调用dll中的函数,如何

c++ - 你如何设置.exe文件的图标?

c++ - 用mingw和msys把VC++库转成mingw库?

c++ - 从命令行使用 Boost::Test 测试 DLL

c++ - Visual Studio C/C++ 结构字符问题

c++ - 需要修复我的 Variadic 宏

c++ - 如何通过mongocxx C++驱动上传MongoDB中的文件?