1.带checkbox的treectrl控件,点击复选框的操作(选中时,使其子节点全选中。未选中时,使其子节点和所有父节点全未选中)
void CSpectrumDlg::OnClickTree1(NMHDR *pNMHDR, LRESULT *pResult){// TODO: 在此添加控件通知处理程序代码CTreeCtrl* pTreeCtrl = (CTreeCtrl*)this->GetDlgItem(IDC_TREE1);UINT nFlag;CPoint pt;GetCursorPos(&pt); //获得屏幕光标坐标pTreeCtrl->ScreenToClient(&pt);//转换到树HTREEITEM
hitem = pTreeCtrl->HitTest(pt,&nFlag);//碰撞检测if(hitem && (nFlag & TVHT_ONITEMSTATEICON)){//点击的是checkbox框BOOL isCheck = pTreeCtrl->GetCheck(hitem);//获得item的check属性isCheck = !isCheck;//设置此节点的checkbox状态。//pTreeCtrl->SetCheck(hitem,1);//此句加上就错了,应为默认的程序对单机复选框已经有了相关的//事件处理方式(取反),先执行此取反操作后,然后系统又调用系统默认的方法又一次取反了!!//设置子节点的图标resetChildItem(pTreeCtrl,hitem,isCheck);
//设置父节点的图标(使某个原来全选中的一个子节点未选中,则其父节点也要变成为选中)if(!isCheck){HTREEITEM parent = pTreeCtrl->GetParentItem(hitem);while(parent){pTreeCtrl->SetCheck(parent,isCheck);parent = pTreeCtrl->GetParentItem(parent);}}}*pResult = 0;}void CSpectrumDlg::resetChildItem( CTreeCtrl*
pTreeCtrl, HTREEITEM hitem, BOOL isCheck ){ HTREEITEM child = pTreeCtrl->GetChildItem(hitem); while(child){ pTreeCtrl->SetCheck(child,isCheck); resetChildItem(pTreeCtrl,child,isCheck); child = pTreeCtrl->GetNextSiblingItem(child);
}}
:nFlag可用的变量其中flags测试结果可以是如下值:TVHT_ABOVE 在客户区域上面TVHT_BELOW 在客户区域下面TVHT_NOWHERE 在客户区域中并在最后一项下面TVHT_ONITEM 在与树项关联的位图或标签内TVHT_ONITEMBUTTON 在与树项关联的按钮上TVHT_ONITEMICON 在与树项关联的位图上TVHT_ONITEMINDENT 在与树项关联的联线上TVHT_ONITEMLABEL 在与树项关联的标签上TVHT_ONITEMRIGHT 在树项的右侧区域中TVHT_ONITEMSTATEICON
在用户定义的状态图标上TVHT_TOLEFT 在客户区域的左侧
TVHT_TORIGHT 在客户区域的右侧
2.CToolTipCtrl的使用
1.initial中添加
EnableToolTips(TRUE);
2.改写消息函数
BOOL CXXX::PreTranslateMessage(MSG* pMsg)
{
// TODO: ÔÚ´ËÌí¼ÓרÓôúÂëºÍ/»òµ÷ÓûùÀà
if(!m_TooltipCtrl){
m_TooltipCtrl.Create(this);
m_TooltipCtrl.SetMaxTipWidth(10);
}
m_TooltipCtrl.RelayEvent(pMsg);
return CScrollView::PreTranslateMessage(pMsg);
}
3.使用
m_TooltipCtrl.Activate(TRUE);
m_TooltipCtrl.AddTool(this,str);
m_TooltipCtrl.Update();