您的位置:首页 > 其它

MFC 树形控件 实现选择分组下面成员全选

2012-10-28 23:05 543 查看
树形控件点击分组全选,取消一个,分组选择变暗
1.添加树形控件
给树形控件添加成员变量CTreeCtrl	m_TripleTree;
2.在头文件中添加变量
HTREEITEM m_hTreeItem;
3.再头文件中定义
CImageList m_imList;
4.在初始化中添加
BOOL CTreeDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here

HICON hIcon[3];                             //图标
m_imList.Create(16,16,0,3,3);               //
hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON1);  //加载图标
hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON2);
hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON3);

for(int n=0;n<3;n++)
m_imList.Add(hIcon
);
m_TripleTree.SetImageList(&m_imList,TVSIL_NORMAL);

TV_INSERTSTRUCT tvinsert;
tvinsert.hParent=NULL;
tvinsert.hInsertAfter=TVI_LAST;
tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
tvinsert.item.hItem=NULL;
tvinsert.item.state=0;
tvinsert.item.stateMask=0;
tvinsert.item.cchTextMax=6;
tvinsert.item.iSelectedImage=0;
tvinsert.item.cChildren=0;
tvinsert.item.lParam=0;

tvinsert.item.pszText="未分组";   // 树根
tvinsert.item.iImage=0;
HTREEITEM hCObject=m_TripleTree.InsertItem(&tvinsert);

//second level
tvinsert.hParent=hCObject;//hCObject
tvinsert.item.iImage=0;
tvinsert.item.pszText="张三";
m_TripleTree.InsertItem(&tvinsert);
//HTREEITEM hCCmdTarget=m_TripleTree.InsertItem(&tvinsert);
tvinsert.hParent=hCObject;//hCObject
tvinsert.item.iImage=0;
tvinsert.item.pszText="张三";
m_TripleTree.InsertItem(&tvinsert);
tvinsert.hParent=hCObject;//hCObject
tvinsert.item.iImage=0;
tvinsert.item.pszText="张三";
m_TripleTree.InsertItem(&tvinsert);

tvinsert.hParent=hCObject;//hCObject
tvinsert.item.pszText="朋友";
tvinsert.item.iImage=0;
m_TripleTree.InsertItem(&tvinsert);

tvinsert.hParent=hCObject;//hCObject
tvinsert.item.iImage=0;
tvinsert.item.pszText="好友";
m_TripleTree.InsertItem(&tvinsert);

tvinsert.item.pszText="同学";
tvinsert.item.iImage=0;
m_TripleTree.InsertItem(&tvinsert);
/////////////////////////////////////////////////////////////////////////////////////////
tvinsert.hParent=NULL;
tvinsert.item.pszText="未分组2";   // 树根
tvinsert.item.iImage=0;
HTREEITEM hCObject2=m_TripleTree.InsertItem(&tvinsert);

//second level
tvinsert.hParent=hCObject2;//hCObject
tvinsert.item.iImage=0;
tvinsert.item.pszText="张三";
m_TripleTree.InsertItem(&tvinsert);

tvinsert.hParent=hCObject2;//hCObject
tvinsert.item.iImage=0;
tvinsert.item.pszText="王五";
m_TripleTree.InsertItem(&tvinsert);
///////////////////////////

5.导入相应ICO图片(3个)
6.给树形控件添加单击事件,并添加如下代码:
如:
void CTreeDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
UINT uFlags=0;
HTREEITEM hPItem;
CPoint point = GetCurrentMessage()->pt;
ScreenToClient(&point);
point.Offset(-8,-16);
HTREEITEM hItem = m_TripleTree.HitTest(point, &uFlags);
if ( (uFlags&TVHT_ONITEM) )
{
hPItem = m_TripleTree.GetParentItem(hItem);
int m,n,m1,n1;
m_TripleTree.GetItemImage(hItem,m,n);
if(m!=1)
{
m_TripleTree.SetItemImage(hItem,1,1);
m_TripleTree.GetItemImage(hItem,m1,n1);
TravelChild(hItem, m1);
if(hPItem!=NULL)
TravelSiblingAndParent(hItem,m1);
}
else //if(m==1)
{
m_TripleTree.SetItemImage(hItem,0,0);
m_TripleTree.GetItemImage(hItem,m1,n1);
TravelChild(hItem, m1);
if(hPItem!=NULL)
TravelSiblingAndParent(hItem,m1);
}
//	MessageBox("xxxx");
}

*pResult = 0;
}
7.添加TravelChild(HTREEITEM hItem, int m)成员函数
如:

void CTreeDlg::TravelChild(HTREEITEM hItem, int m)
{
HTREEITEM hChildItem,hBrotherItem;
hChildItem=m_TripleTree.GetChildItem(hItem);

while(hChildItem!=NULL)
{
m_TripleTree.SetItemImage(hChildItem,m,m);
hChildItem=m_TripleTree.GetNextSiblingItem(hChildItem);
}

}
8.添加TravelSiblingAndParent(HTREEITEM hItem, int m)成员函数
如:
void CTreeDlg::TravelSiblingAndParent(HTREEITEM hItem, int m)
{
int m1,n1;
int mark=0;
HTREEITEM hNextSiblingItem,hPrevSiblingItem,hParentItem;
m1=m;

hNextSiblingItem=m_TripleTree.GetNextSiblingItem(hItem);//第一个
while(hNextSiblingItem!=NULL)
{
m_TripleTree.GetItemImage(hNextSiblingItem,m1,n1);
if(m1!=m)
{
mark=1;
break;
}
else
{
hNextSiblingItem=m_TripleTree.GetNextSiblingItem(hNextSiblingItem);
if(hNextSiblingItem!=NULL)
m_TripleTree.GetItemImage(hNextSiblingItem,m1,n1);
}
}

hPrevSiblingItem=m_TripleTree.GetPrevSiblingItem(hItem);//第一个

while(hPrevSiblingItem!=NULL)
{
m_TripleTree.GetItemImage(hPrevSiblingItem,m1,n1);
if(m1!=m)
{
mark=1;
break;
}
else
{
hPrevSiblingItem=m_TripleTree.GetPrevSiblingItem(hPrevSiblingItem);
if(hPrevSiblingItem!=NULL)
m_TripleTree.GetItemImage(hPrevSiblingItem,m1,n1);
}
}

if(m1!=m )  //有一个未被选中,j吧父节点去了
{

hParentItem=m_TripleTree.GetParentItem(hItem);
while(hParentItem!=NULL)
{
m_TripleTree.SetItemImage(hParentItem,2,2);//
hParentItem=m_TripleTree.GetParentItem(hParentItem);
}
}

if(m1==m&& mark==0)//权被选中
{
hParentItem=m_TripleTree.GetParentItem(hItem);
while(hParentItem!=NULL)
{
m_TripleTree.SetItemImage(hParentItem,m1,m1);
hParentItem=m_TripleTree.GetParentItem(hParentItem);
}

}

}
运行:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: