C++ 如何用SendMessage向树状控件CTreeCtrl 发送展开和选中消息

我想用SendMessage模拟鼠标展开和选中树状控件结点的消息事件,这两个的消息相应函数需要传参,我应该怎么用SendMessage向控件发送消息呢,求解决办法。采纳了... 我想用SendMessage模拟鼠标展开和选中树状控件结点的消息事件,这两个的消息相应函数需要传参,我应该怎么用SendMessage向控件发送消息呢,求解决办法。采纳了追加分。 展开
 我来答
帐号已注销
2011-05-20 · TA获得超过9900个赞
知道大有可为答主
回答量:4076
采纳率:0%
帮助的人:3583万
展开全部
应先发送 TVM_GETNEXTITEM 消息获取每个项目的句柄,而且要根据其是否含有子项来决定是否展开这个项目,发送 TVM_EXPAND 消息展开每个含有子项的项目。
现假定 TreeView 控件的句柄为 hWnd:
hRootItem = (HTREEITEM)SendMessage(hWnd, TVM_GETNEXTITEM, TVGN_ROOT, NULL);
将得到根项目的句柄 hRootItem。然后使用:
hChildItem = (HTREEITEM)SendMessage(hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hRootItem);
得到第一个子项的句柄。若该子项存在,则可以发送消息展开父项:
SendMessage(hWnd, TVM_EXPAND, TVE_EXPAND, (LPARAM)hRootItem);
使用下面的语句将获取与跟节点同级的下一个节点句柄 hTreeItem:
hTreeItem = (HTREEITEM)SendMessage(hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hRootItem);

说起来这个判断还是很麻烦的,每一项都必须判断有无子项。如果没有子项,则获取下一个同级项目再判断;如果有子项,则展开该项,并使用同样的方法该项下面的第一个子项开始判断有无子项,与前面判断父项的方法相同。这个具体的逻辑过程还是比较麻烦的。
du瓶邪
2015-08-01 · TA获得超过2.4万个赞
知道大有可为答主
回答量:1.7万
采纳率:100%
帮助的人:2903万
展开全部
创建时的例子:
HTREEITEM hRoot,hCur;
hRoot=pTreeCtrl.InsertItem(&TCItem);//创建父节点,返回根项句柄
for(int i=0;i<4;i++)
{
TCItem.hParent=hRoot;
TCItem.item.pszText=CJ[i];
TCItem.item.lParam=(i+1);//子项序号
TCItem.item.iImage=i+13;
TCItem.item.iSelectedImage=i+13;
hCur=pTreeCtrl.InsertItem(&TCItem); //创建子节点
pTreeCtrl.SelectItem(hCur);//选定
}
pTreeCtrl.Expand(hRoot,TVE_EXPAND);//展开根结点

如果是在以有的树中指定节点
HTREEITEM hRoot=pTreeCtrl.GetRootItem();
int nCount=pTreeCtrl.GetCount();
int nNum=0;
while(nNum<nCount)
{
hRoot=pTreeCtrl.GetNextItem(hRoot,TVGN_NEXT);
nNum++;
}
是遍历父节点,找到相应的项后pTreeCtrl.SelectItem(hRoot);//选定父节点

如果选定的项是子节点

HTREEITEM hRoot=pTreeCtrl.GetRootItem();
int nCount=pTreeCtrl.GetCount();
int nNum=0;
while(nNum<nCount)
{
hRoot=pTreeCtrl.GetNextItem(NULL,TVGN_NEXTVISIBLE);
nNum++;
}

如果找不到说明该项没有展开,展开后再找!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式