我正在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);
}
}
当单个项目突出显示时(如果选中单个项目时自动切换复选框),如果不是我认为是空格键的默认行为,则可以使用此功能。此代码的问题在于始终存在一个未切换的复选框。这是因为空格键的默认行为切换了所选的单个项目。无论如何都要禁用默认值?
答案 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);
}