XEIM 企业即时通讯软件里面,有一个模块用于管理用户的联系人,其中,涉及到联系人的全选与反选,标准控件 CTreeCtrl 里没有这个功能,这里介绍一个简单的算法实现此功能,此功能用于最新版的
飞鸽传书即时通讯软件。代码如下:void InverseAll();
BOOL CheckForChange();
void UncheckAll();// 1. 反选
void _DLG_New_Schedule::InverseAll()
{
BOOL bCheck;
map<string, HTREEITEM>::iterator iGroup;
map<string, HTREEITEM>::iterator _END;
_END = m_mapGroup.end();for (iGroup = m_mapGroup.begin();
iGroup != _END; iGroup ++)
{
bCheck = TRUE;
HTREEITEM hChild = m_tcMembers.GetChildItem(iGroup->second); string str = m_tcMembers.GetItemText(hChild);
// 如果打勾了
if (m_tcMembers.GetCheck(hChild))
{
bCheck = FALSE;
m_tcMembers.SetCheck(hChild, FALSE);
}
else
{
m_tcMembers.SetCheck(hChild);
} while(hChild = m_tcMembers.GetNextSiblingItem(hChild))
{
str = m_tcMembers.GetItemText(hChild);
// 如果打勾了
if (m_tcMembers.GetCheck(hChild))
{
bCheck = FALSE;
m_tcMembers.SetCheck(hChild, FALSE);
}
else
{
m_tcMembers.SetCheck(hChild);
}
} if (bCheck == FALSE)
{
// AfxMessageBox(m_treeUserList.GetItemText(iGroup->second));
}
m_tcMembers.SetCheck(iGroup->second, bCheck);
}
}// 1. 全选所有选项
void _DLG_New_Schedule::OnCheckAll()
{
if (((CButton*)GetDlgItem(IDC_CHECK_ALL))->GetCheck())
{
UncheckAll();
InverseAll();
}
else
{
UncheckAll();
}
}void _DLG_New_Schedule::OnCheckInverse()
{
if (((CButton*)GetDlgItem(IDC_CHECK_INVERSE))->GetCheck())
{
InverseAll();
}
else
{
InverseAll();
}
}
void _DLG_New_Schedule::UncheckAll()
{
map<string, HTREEITEM>::iterator iGroup;
for (iGroup = m_mapGroup.begin();
iGroup != m_mapGroup.end(); iGroup ++)
{
if (m_tcMembers.GetCheck(iGroup->second))
{
m_tcMembers.SetCheck(iGroup->second, FALSE);
} HTREEITEM hChild = m_tcMembers.GetChildItem(iGroup->second); string str = m_tcMembers.GetItemText(hChild);
// 如果打勾了
if (m_tcMembers.GetCheck(hChild))
{
m_tcMembers.SetCheck(hChild, FALSE);
} while(hChild = m_tcMembers.GetNextSiblingItem(hChild))
{
str = m_tcMembers.GetItemText(hChild);
// 如果打勾了
if (m_tcMembers.GetCheck(hChild))
{
m_tcMembers.SetCheck(hChild, FALSE);
}
}
}
}这些是我匆忙之中,匆匆写下来的代码,或许有许多不洽淡,希望各位有多多指教才是我的目的。