2012-06-20 21 views
0

由於佈局自定義需要,我擴展了CTreeCtrl類。如何爲CTreeCtrl節點加載默認圖標

絕對需要使用CDC :: DrawText的()功能dinamically(重新)寫單個節點的文本,WITHOUT調用SetItemText()函數一次以上(強制性必備) 。

然後,我寫了我自己實現的OnPaint()方法。 我實現了一個DrawItems()在CTreeCtrl中繪製節點的方法。

因爲我不想修改別的比單節點旁邊的單個標籤的話,我需要重新實現最原始的CTreeCtrl :: OnPaint()方法代碼。

我只有兩個疑惑:

  1. 我怎樣才能顯示默認的CTreeCtrl圖標?我不需要/不想要 自定義圖標。
  2. 如何恢復單個節點的默認選擇模式佈局?

簡單地說,當前選定的節點應該出現突出顯示

的簡化,自動說明下面代碼一些件:

void MyDlg::OnPaint() 
{ 
    CPaintDC dc(this); 
    CDC dc_ff; 
    CBitmap bm_ff; 
    CBitmap *bm_old; 
    CFont *font; 
    CFont *old_font; 
    CFont fontDC; 
    int old_mode; 
    GetClientRect(&m_Rect); 

    dc_ff.CreateCompatibleDC(&dc); 
    bm_ff.CreateCompatibleBitmap(&dc, m_Rect.Width(), m_Rect.Height()); 
    dc_ff.SelectObject(&bm_ff); 
    font = GetFont(); 
    old_font = dc_ff.SelectObject(font); 

    // Could/Should be called here? 
    CWnd::DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0); 

    old_mode = dc_ff.SetBkMode(TRANSPARENT); 

    dc_ff.FillSolidRect(m_Rect, dc_ff.GetBkColor()); 

    DrawItems(&dc_ff); // DrawItems() member function draws single nodes of CTreeCtrl 

    dc.BitBlt(m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height(), &dc_ff, 0, 0, SRCCOPY); 

    dc_ff.SelectObject(old_font); 
    dc_ff.SetBkMode(old_mode); 
    dc_ff.SelectObject(bm_old); 
} 

void MyDlg::DrawItems(CDC *pDC) 
{ 
    // draw items 
    HTREEITEM show_item, parent; 
    CRect rc_item; 
    CString name; 
    DWORD tree_style; 
    int count = 0; 
    int state; 
    bool selected; 
    bool has_children; 

    show_item = GetFirstVisibleItem(); 
    if (show_item == NULL) 
     return; 
    color = pDC->GetTextColor(); 
    tree_style = ::GetWindowLong(m_hWnd, GWL_STYLE); 

    do 
    { 
     state = GetItemState(show_item, TVIF_STATE); 
     parent = GetParentItem(show_item); 
     has_children = ItemHasChildren(show_item) || parent == NULL; 
     selected = (state & TVIS_SELECTED) && ((this == GetFocus()) || 
       (tree_style & TVS_SHOWSELALWAYS)); 

     if (GetItemRect(show_item, rc_item, TRUE)) 
     { 
      if (has_children || selected) 
      { 
       if (selected) 
       { 
        // HERE i need to 
       } 
       else 

       // do some stuff... 

       if (has_children) 
       { 
        HICON icon; 
        // HERE I need to load CTreeCtrl nodes _DEFAULT_icon 
        icon = LoadIcon(NULL, IDI_ASTERISK); 
        if (icon != NULL) 
         DrawIconEx(pDC->m_hDC, rc_item.left - 18, rc_item.top, icon, 16, 16,0,0, DI_NORMAL); 
       } 
      } 
      if (!has_children) 
      { 
       HICON icon; 
       *// HERE I need to load CTreeCtrl nodes _DEFAULT_icon* 
       icon = LoadIcon(NULL, IDI_ASTERISK); 
       if (icon != NULL) 
        DrawIconEx(pDC->m_hDC, rc_item.left - 18, rc_item.top, icon, 16, 16,0,0, DI_NORMAL); 
      } 
      name = GetItemText(show_item); 
      // ... 
      if (selected) 
      { 
       pDC->DrawText("Temp", rc_item, DT_LEFT); 
      } 
      else 
      { 
       pDC->DrawText("Temp", rc_item, DT_LEFT); 
      } 
      //if (state & TVIS_BOLD) 
      // pDC->SelectObject(font); 
     } 
    } while ((show_item = GetNextVisibleItem(show_item)) != NULL); 
} 

我所需要的,是一種幾乎標準 CTreeCtrl的:: OnPaint()方法執行的源代碼。 任何建議/幫助表示讚賞。 :-)

謝謝

IT。

回答

0

你不需要重載onPaint。如果將樹項目文本設置爲LPSTR_TEXTCALLBACK,則CtreeCtrl將在每次顯示該項目時觸發消息TVN_GETDISPINFO以檢索新文本。如果您在父窗口中,則使用ON_NOTIFY重新處理消息處理程序;如果您正在繼承CTreeCtrl,則使用ON_NOTIFY_REFLECT重新處理消息處理程序。此消息處理程序可以分配所需的文本,但允許treeCtrl繼續正常繪製。

TVN_GETDISPINFO Documentation

如果你去父CWND路線,你幾乎需要

  1. 所以你需要在cpp文件分配消息處理

    BEGIN_MESSAGE_MAP(MyCWnd,CWnd的)

    ON_NOTIFY(TVN_GETDISPINFO,tree_ctl_id,CustomTreeControl :: OnGetdispinfo) END_MESSAGE_MAP()

  2. 函數原型在頭

    AFX_MSG空隙OnGetdispinfo(NMHDR * pNMHDR,LRESULT * pResult);

  3. 這在你的類定義的結束

    DECLARE_MESSAGE_MAP()

  4. 和實際函數來處理請求

    無效ColumnTreeControl :: OnGetdispinfo(NMHDR * pNMHDR,LRESULT * pResult ) NMTVDISPINFO * pDispInfo =(NMTVDISPINFO )pNMHDR; TVITEM item = & pDispInfo-> item;

    if(item->mask & TVIF_TEXT) 
    { 
         item->pszText " YOUR CODE HERE"; 
    } 
    *pResult = 0; 
    

    }

相關問題