CTreeCtrl中的checkbox的获取~

最近在用树形控件写程序,应项目要求,添加了checkbox属性,但是,问题来了,很难获取到checkbox的属性。查阅了网上的代码,发现很多不能直接用,于是自己研究了下~~

添加树形控件的事件处理 NM_CLICK

  添加代码如下:

  void CRSViewerDlg::OnClickTreeFiles(NMHDR *pNMHDR, LRESULT *pResult)
{
 // TODO: 在此添加控件通知处理程序代码
 CPoint pt;
 UINT flag;
 HTREEITEM hCurrentItem;
 GetCursorPos(&pt);
 ScreenToClient(&pt);
 pt.Offset(-16,-16);
 //坐标纠正,还不清楚为什么,好像是菜单栏导致的坐标误差
 hCurrentItem = m_treeFileList.HitTest(pt,&flag);
 //TVHT_ABOVE:Above   the   client   area. 
 //TVHT_BELOW:Below   the   client   area. 
 //TVHT_NOWHERE:In   the   client   area,   but   below   the   last   item. 
 //TVHT_ONITEM:On   the   bitmap   or   label   associated   with   an   item. 
 //TVHT_ONITEMBUTTON:On   the   button   associated   with   an   item. 
 //TVHT_ONITEMICON:On   the   bitmap   associated   with   an   item. 
 //TVHT_ONITEMINDENT:In   the   indentation   associated   with   an   item. 
 //TVHT_ONITEMLABEL:On   the   label   (string)   associated   with   an   item. 
 //TVHT_ONITEMRIGHT:In   the   area   to   the   right   of   an   item. 
 //TVHT_ONITEMSTATEICON:On   the   state   icon   for   a   tree-view   item   that   is   in   a   user-defined   state. 
 //TVHT_TOLEFT:To   the   left   of   the   client   area. 
 //TVHT_TORIGHT:To   the   right   of   the   client   area.
 if ((NULL!=hCurrentItem)&&(flag==TVHT_CHECKBOX))//注意这边的TVHT_CHECKBOX,定义为64

 {
  // 检查CheckBox的状态,返回的是在点击之前的状态
  // 意思就是得出来是TRUE,那么待会就会是FALSE
  // 得出来是FALSE,那么待会就会是TRUE
  // 你在下面进行你自己的处理就可以了 
   if (m_treeFileList.GetCheck(hCurrentItem))
  {
    HTREEITEM tempChildFirst=m_treeFileList.GetChildItem(hCurrentItem);
    if (tempChildFirst!=NULL)
    {
    m_treeFileList.SetCheck(tempChildFirst,FALSE);
    HTREEITEM temp=m_treeFileList.GetNextItem(tempChildFirst,TVGN_NEXT);
    while (temp!=NULL)
    {
     m_treeFileList.SetCheck(temp,FALSE);
     temp=m_treeFileList.GetNextItem(temp,TVGN_NEXT);
    }
    }
   
   
  }
  else
  {
   HTREEITEM tempChildFirst=m_treeFileList.GetChildItem(hCurrentItem);
   if (tempChildFirst!=NULL)
   {
    m_treeFileList.SetCheck(tempChildFirst);
    HTREEITEM temp=m_treeFileList.GetNextItem(tempChildFirst,TVGN_NEXT);
    while (temp!=NULL)
    {
     m_treeFileList.SetCheck(temp);
     temp=m_treeFileList.GetNextItem(temp,TVGN_NEXT);
    }
   }
  }
 }   

 *pResult = 0;
}

上面的代码实现了勾上父项的checkbox子项的checkbox也能跟着变化的效果,当然,每个人的项目不同,自行修改。注意到上面pt的坐标纠正吗。。不知道为什么,好像是菜单栏的影响(或者就是checkbox本身的影响),导致了转换后的坐标出现误差,没办法区分checkbox和字符串,所以这边转换了下。在VCBase中看到的一段代码是(-8,-16),我这边发现貌似有问题,读者自己debug下吧~

上面的flag==TVHT_CHECKBOX,这边的TVHT_CHECKBOX是我自己跟出来的,然后自己定义的。。

 

CTreeCtrl中的checkbox的获取~_第1张图片

 

结束语:希望本文对其他人有帮助~~

你可能感兴趣的:(String,null,button)