Mfc 如何加载CTreeCtrl节点的默认图标
由于布局定制的需要,我扩展了CTreeCtrl类 我绝对需要使用CDC::DrawText()函数以友好方式(重新)写入单个节点的文本,而无需多次调用SetItemText()函数(必需) 然后,我编写了自己的OnPaint()方法的实现。 我还实现了一个DrawItems()方法,该方法在CTreeCtrl中绘制节点 由于我只想修改单个节点旁边的单个标签,因此我需要重新实现大部分原始CTreeCtrl::OnPaint()代码 我只有两个疑问:Mfc 如何加载CTreeCtrl节点的默认图标,mfc,load,icons,paint,treecontrol,Mfc,Load,Icons,Paint,Treecontrol,由于布局定制的需要,我扩展了CTreeCtrl类 我绝对需要使用CDC::DrawText()函数以友好方式(重新)写入单个节点的文本,而无需多次调用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()实现的源代码。
感谢您的任何建议/帮助。:-)
谢谢
它。你不需要在油漆上超载。如果将树项目文本设置为LPSTR_TEXTCALLBACK,则CtreeCtrl将在每次显示该项目时触发消息TVN_GETDISPINFO以检索新文本。Regeister消息处理程序,如果在父窗口中,则使用ON_NOTIFY;如果正在子类化CTreeCtrl,则使用ON_NOTIFY_REFLECT。此消息处理程序可以指定所需的文本,但允许treeCtrl继续正常绘制 如果你走父母的Cwnd路线,你需要
if(item->mask & TVIF_TEXT )
{
item->pszText " YOUR CODE HERE";
}
*pResult = 0;
}