由於佈局自定義需要,我擴展了CTreeCtrl類。如何爲CTreeCtrl節點加載默認圖標
我絕對需要使用CDC :: DrawText的()功能dinamically(重新)寫單個節點的文本,WITHOUT調用SetItemText()函數一次以上(強制性必備) 。
然後,我寫了我自己實現的OnPaint()方法。 我實現了一個DrawItems()在CTreeCtrl中繪製節點的方法。
因爲我不想修改別的比單節點旁邊的單個標籤的話,我需要重新實現最原始的CTreeCtrl :: OnPaint()方法代碼。
我只有兩個疑惑:
- 我怎樣才能顯示默認的CTreeCtrl圖標?我不需要/不想要 自定義圖標。
- 如何恢復單個節點的默認選擇模式佈局?
簡單地說,當前選定的節點應該出現突出顯示。
的簡化,自動說明下面代碼一些件:
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。