雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

C++ CTreeview的checkbox使用方法

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點(diǎn)擊:

1. 消息事件

   (1)鼠標(biāo)點(diǎn)擊當(dāng)前ITEM的CHECKBOX:引發(fā)NM_CLICK事件并傳遞TVHT_ONITEMSTATEICON。
   (2)鼠標(biāo)點(diǎn)擊當(dāng)前ITEM的TEXT:引發(fā)NM_CLICK事件。
   (3)鼠標(biāo)點(diǎn)擊新ITEM的CHECKBOX:引發(fā)TVN_SELCHANGED事件、NM_CLICK事件并傳遞TVHT_ONITEMSTATEICON。
   (4)鼠標(biāo)點(diǎn)擊新ITEM的TEXT:引發(fā)NM_CLICK事件、TVN_SELCHANGED事件。

2. 消息事件總結(jié)

   點(diǎn)擊ITEM會引發(fā)NM_CLICK事件。若點(diǎn)擊CHECKBOX則傳遞TVHT_ONITEMSTATEICON。
   因此可不處理TVN_SELCHANGED事件而只處理NM_CLICK事件。

3. 消息處理注意事項(xiàng)

   (1)點(diǎn)擊CHECKBOX后會自動更新CheckBox的狀態(tài),因此在處理代碼中不需要使用SetCheck函數(shù)設(shè)置狀態(tài),而GetCheck函數(shù)返回也是其原始狀態(tài)。
   (2)點(diǎn)擊新CHECKBOX后不會自動將對應(yīng)的ITEM設(shè)置為選擇狀態(tài),需要使用SelectItem函數(shù)進(jìn)行設(shè)置。

4. 使用方法

   (1)若傳遞TVHT_ONITEMSTATEICON
          獲取選擇ITEM的狀態(tài)并取反
              若有子項(xiàng)則所有子項(xiàng)設(shè)置為一致
              若沒有子項(xiàng)則
                  若當(dāng)前狀態(tài)為TRUE則設(shè)置父項(xiàng)為TRUE;否則遍歷所有兄弟項(xiàng),若全為FALSE則設(shè)置父項(xiàng)為FALSE。
         若選擇了新ITEM則設(shè)置新ITEM為選擇項(xiàng)
   (2)若未傳遞TVHT_ONITEMSTATEICON
          設(shè)置更新ITEM狀態(tài),獲取選擇ITEM的狀態(tài)
              若有子項(xiàng)則所有子項(xiàng)設(shè)置為一致
              若沒有子項(xiàng)則
                  若當(dāng)前狀態(tài)為TRUE則設(shè)置父項(xiàng)為TRUE;否則遍歷所有兄弟項(xiàng),若全為FALSE則設(shè)置父項(xiàng)為FALSE。

5. 響應(yīng)NM_CLICK事件的函數(shù)代碼

void CTestTimerDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
  // TODO: Add your control notification handler code here
  CPoint point;
  UINT uFlag;                 //接收有關(guān)點(diǎn)擊測試的信息的整數(shù)
  HTREEITEM hTree;
  BOOL bCheck;
  GetCursorPos(&point);            //獲取屏幕鼠標(biāo)坐標(biāo)
  m_TreeCtrl.ScreenToClient(&point);      //轉(zhuǎn)化成客戶坐標(biāo)
  hTree = m_TreeCtrl.HitTest(point,&uFlag);  //返回與CtreeTtrl關(guān)聯(lián)的光標(biāo)的當(dāng)前位置和句柄
  if((TVHT_NOWHERE & uFlag))
  {
    return;
  }
  if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //點(diǎn)中復(fù)選框
  {
    m_TreeCtrl.SelectItem(hTree);
    CString temp = m_TreeCtrl.GetItemText(hTree) + "\r\n";
    TRACE(temp);
    bCheck = m_TreeCtrl.GetCheck(hTree);   //獲取當(dāng)前復(fù)選狀態(tài)
    SetChildCheck(hTree,!bCheck);       //設(shè)置子項(xiàng)復(fù)選狀態(tài)
    SetParentCheck(hTree, bCheck);       //設(shè)置父項(xiàng)復(fù)選狀態(tài)
  }
  *pResult = 0;
}

void CTestTimerDlg::SetChildCheck(HTREEITEM hTree,BOOL bCheck)
{
  m_TreeCtrl.Expand(hTree,TVE_EXPAND);
  hTree = m_TreeCtrl.GetChildItem(hTree); //獲取子項(xiàng)句柄
  while (hTree)
  {
    m_TreeCtrl.SetCheck(hTree, bCheck);   
    SetChildCheck(hTree,bCheck);      //遞歸調(diào)用
    hTree = m_TreeCtrl.GetNextSiblingItem(hTree);  //獲取兄弟的句柄
  }
}

void CTestTimerDlg::SetParentCheck(HTREEITEM hTree,BOOL bCheck)
{
  HTREEITEM hParent = m_TreeCtrl.GetParentItem(hTree);
  if (hParent)
  {
    HTREEITEM hChild = m_TreeCtrl.GetChildItem(hParent);
    while (hChild)
    {
      if (hChild == hTree)
      {
        hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
        continue;
      }
      BOOL bflag = m_TreeCtrl.GetCheck(hChild);
      if (bCheck == bflag)         //判斷是否還有兄弟項(xiàng)被選擇
      {
        return;
      }
      hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
    }
    m_TreeCtrl.SetCheck(hParent,!bCheck);
    SetParentCheck(hParent,bCheck);       //設(shè)置父項(xiàng)的狀態(tài)
  }

上一篇:C++中MFC Tab Control控件的使用詳解

欄    目:C語言

下一篇:C++實(shí)現(xiàn)的鏈表類實(shí)例

本文標(biāo)題:C++ CTreeview的checkbox使用方法

本文地址:http://m.jygsgssxh.com/a1/Cyuyan/3050.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有