我在用TreeCtrl做一个树的时候发现了一个奇怪的问题,在鼠标点击时,事件总是不会立即响应,总是第二次事件发生后,第一次的点击事件运行结果才会出来。以下是我的鼠标点击事件代码:
void CVCTREEDlg::OnClickTreectrl(NMHDR* pNMHDR, LRESULT* pResult)
{
hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
m_TreeCtrl.GetItemImage(hSel, nImage, nSelectedImage);//得到结点图标索引值
nImage=(nImage==0)?1:0; //如果是1就设为0,是0则变成1
m_TreeCtrl.SetItemImage(hSel, nImage,nImage); //重新设置图标
*pResult = 0;
}
void CVCTREEDlg::OnClickTreectrl(NMHDR* pNMHDR, LRESULT* pResult)
{
hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
m_TreeCtrl.GetItemImage(hSel, nImage, nSelectedImage);//得到结点图标索引值
nImage=(nImage==0)?1:0; //如果是1就设为0,是0则变成1
m_TreeCtrl.SetItemImage(hSel, nImage,nImage); //重新设置图标
*pResult = 0;
}
解决方案 »
- CreateWindow放在类的成员函数里边创建子窗口怎么就不好使了? 急急急急急
- 大家帮忙看一下这道TCP/IP协议的题目
- 远程连接数据库的棘手问题!
- 调用DoModal()函数后,文件对话框为什么没有显示?
- 请问WIN系统关机函数
- 如何获得windows的系统目录,以便插入treectrl里去? 就想"资源管理器"一样.
- 各位大侠,帮帮忙吧,快急死了..............
- ColderRain(莫走重辄路)请进
- 请问:GetDefaultPrinter有人用过么?怎么用?
- 给基于对话框的应用程序添加菜单?
- 关机时,系统是怎么关闭应用程序的?
- 请问:基于FormView的SDI如何才能知道最大化,最小化等消息?
void CVCTREEDlg::OnLButtonDown(..)
{
hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
m_TreeCtrl.GetItemImage(hSel, nImage, nSelectedImage);//得到结点图标索引值
nImage=(nImage==0)?1:0; //如果是1就设为0,是0则变成1
m_TreeCtrl.SetItemImage(hSel, nImage,nImage); //重新设置图标
*pResult = 0;
}
void CProjectTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
BOOL nSelect;
HTREEITEM hItem = HitTest(point, &nFlags);
if ((hItem != NULL) && (TVHT_ONITEM & nFlags))
{
nSelect=Select(hItem, TVGN_CARET);
}
CString ItemText;
ItemText=GetItemText(hItem);
if(nSelect == 1)
...//add your code here
}
2. 当你插入一个item时,是如何定义image和selectedimage的?我估计你的问题是把image和selectedimage搞混了.
CVCTREEApp *pApp=(CVCTREEApp *)AfxGetApp();//创建图象列表
Cil1.Create(16,16,ILC_COLOR,4,4);
Cil1.Add(pApp->LoadIcon(IDI_NONSELECTED));
Cil1.Add(pApp->LoadIcon(IDI_SELECTED));
Cil1.Add(pApp->LoadIcon(IDI_SOMESELECTED));m_TreeCtrl.SetImageList(&Cil1,TVSIL_NORMAL); //设置图象列表 //树控制
HTREEITEM hRoot,hCur;//树控制项目句柄
TV_INSERTSTRUCT TCItem;//插入数据项数据结构
TCItem.hParent=TVI_ROOT;//增加根项
TCItem.hInsertAfter=TVI_LAST;//在最后项之后
TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
TCItem.item.pszText="根结点";
TCItem.item.lParam=0;//序号
TCItem.item.iImage=0;//正常图标
TCItem.item.iSelectedImage=0;//选中时图标
hRoot=m_TreeCtrl.InsertItem(&TCItem);//返回根项句柄//设置SetItemImage
m_TreeCtrl.SetItemImage(hSel, nImage, nImage);
啊?不可能吧,我试了3台机器都不正常。你多点几次看看,尤其是在
鼠标在同一个地方点击第二次时无反应。。我的是win2000professor版+VC6.0中文版
问题:当在同一树结点上点击时,只有第一次点击事件有反应,后面的事件没有反应。
你就直接在那个OnLButtonDown里面处理就可以了!
Zark(金陵五月)已经解释的很清楚了,你如果用GetSelectedItem()想来取你要的这个ITEM的话,一定取到的是前一个选中的ITEM,所以你所说的慢一帕其实是在对之前的一个选中的ITEM进行处理,所以从第二次之后都是对的,所以你也只能通过HitTest()来满足你的要求了,OnSelChanged()消息,从函数名字上可以看出SELECT CHANGED,当点选的ITEM不变的时候,是不会进这个消息的。