程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ CTreeview的checkbox應用辦法

C++ CTreeview的checkbox應用辦法

編輯:關於C++

C++ CTreeview的checkbox應用辦法。本站提示廣大學習愛好者:(C++ CTreeview的checkbox應用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ CTreeview的checkbox應用辦法正文


1. 新聞事宜

   (1)鼠標點擊以後ITEM的CHECKBOX:激發NM_CLICK事宜並傳遞TVHT_ONITEMSTATEICON。
   (2)鼠標點擊以後ITEM的TEXT:激發NM_CLICK事宜。
   (3)鼠標點擊新ITEM的CHECKBOX:激發TVN_SELCHANGED事宜、NM_CLICK事宜並傳遞TVHT_ONITEMSTATEICON。
   (4)鼠標點擊新ITEM的TEXT:激發NM_CLICK事宜、TVN_SELCHANGED事宜。

2. 新聞事宜總結

   點擊ITEM會激發NM_CLICK事宜。若點擊CHECKBOX則傳遞TVHT_ONITEMSTATEICON。
   是以可不處置TVN_SELCHANGED事宜而只處置NM_CLICK事宜。

3. 新聞處置留意事項

   (1)點擊CHECKBOX後會主動更新CheckBox的狀況,是以在處置代碼中不須要應用SetCheck函數設置狀況,而GetCheck函數前往也是其原始狀況。
   (2)點擊新CHECKBOX後不會主動將對應的ITEM設置為選擇狀況,須要應用SelectItem函數停止設置。

4. 應用辦法

   (1)若傳遞TVHT_ONITEMSTATEICON
          獲得選擇ITEM的狀況並取反
              如有子項則一切子項設置為分歧
              若沒有子項則
                  若以後狀況為TRUE則設置父項為TRUE;不然遍歷一切兄弟項,若全為FALSE則設置父項為FALSE。
         若選擇了新ITEM則設置新ITEM為選擇項
   (2)若未傳遞TVHT_ONITEMSTATEICON
          設置更新ITEM狀況,獲得選擇ITEM的狀況
              如有子項則一切子項設置為分歧
              若沒有子項則
                  若以後狀況為TRUE則設置父項為TRUE;不然遍歷一切兄弟項,若全為FALSE則設置父項為FALSE。

5. 呼應NM_CLICK事宜的函數代碼

void CTestTimerDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
  // TODO: Add your control notification handler code here
  CPoint point;
  UINT uFlag;                 //吸收有關點擊測試的信息的整數
  HTREEITEM hTree;
  BOOL bCheck;
  GetCursorPos(&point);            //獲得屏幕鼠標坐標
  m_TreeCtrl.ScreenToClient(&point);      //轉化成客戶坐標
  hTree = m_TreeCtrl.HitTest(point,&uFlag);  //前往與CtreeTtrl聯系關系的光標確當前地位和句柄
  if((TVHT_NOWHERE & uFlag))
  {
    return;
  }
  if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //點中復選框
  {
    m_TreeCtrl.SelectItem(hTree);
    CString temp = m_TreeCtrl.GetItemText(hTree) + "\r\n";
    TRACE(temp);
    bCheck = m_TreeCtrl.GetCheck(hTree);   //獲得以後復選狀況
    SetChildCheck(hTree,!bCheck);       //設置子項復選狀況
    SetParentCheck(hTree, bCheck);       //設置父項復選狀況
  }
  *pResult = 0;
}

void CTestTimerDlg::SetChildCheck(HTREEITEM hTree,BOOL bCheck)
{
  m_TreeCtrl.Expand(hTree,TVE_EXPAND);
  hTree = m_TreeCtrl.GetChildItem(hTree); //獲得子項句柄
  while (hTree)
  {
    m_TreeCtrl.SetCheck(hTree, bCheck);   
    SetChildCheck(hTree,bCheck);      //遞歸挪用
    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)         //斷定能否還有兄弟項被選擇
      {
        return;
      }
      hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
    }
    m_TreeCtrl.SetCheck(hParent,!bCheck);
    SetParentCheck(hParent,bCheck);       //設置父項的狀況
  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved