gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:03:40 26 4
gpt4 key购买 nike

我正在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com