ctreectrl自绘的有关问题
ctreectrl自绘的问题
我按照网上的例子重写了OnPaint方法,测试后发现这段代码只改变了字体,没有改变颜色,但是把
memdc.TextOut( rect.left+2, rect.top+1, sItem );
memdc.SelectObject( pfontdc );
这两句代码(66行和67行)调换一下位置,就可以实现改变字体和颜色。我想问下这是为什么?
------解决思路----------------------
fontdc 是不是有问题?
------解决思路----------------------
memdc.SelectObject( pfontdc );
这句在
memdc.TextOut( rect.left+2, rect.top+1, sItem );
前时,字体已经是 原 字体了。
也就是
fontdc
没起作用
------解决思路----------------------
先载入HFONT,然后再绘制文字。
我按照网上的例子重写了OnPaint方法,测试后发现这段代码只改变了字体,没有改变颜色,但是把
memdc.TextOut( rect.left+2, rect.top+1, sItem );
memdc.SelectObject( pfontdc );
这两句代码(66行和67行)调换一下位置,就可以实现改变字体和颜色。我想问下这是为什么?
void CMyTreeCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CTreeCtrl::OnPaint()
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CRect rcclip,rcclient;
dc.GetClipBox(&rcclip);
GetClientRect(&rcclient);
CBitmap bitMap;
bitMap.CreateCompatibleBitmap(&dc,rcclient.Width(),rcclient.Height());
CBitmap *pOldBitmap = memdc.SelectObject(&bitMap);
CRgn rgn;
rgn.CreateRectRgnIndirect(&rcclip);
memdc.SelectClipRgn(&rgn);
rgn.DeleteObject();
CWnd::DefWindowProc(WM_PAINT,(WPARAM)memdc.m_hDC,0);
HTREEITEM hItem = GetFirstVisibleItem();
int n = GetVisibleCount()+1;
while (hItem && n - 1)
{
CRect rect;
UINT setflag = TVIS_DROPHILITED|TVIS_SELECTED;
Color_Font cf;
if ( !(GetItemState( hItem, setflag ) & setflag )
&& m_mapColorFont.Lookup( hItem, cf ))
{
CFont *pfontdc;
CFont fontdc;
LOGFONT logfont;
if( cf.logfont.lfFaceName[0] != '\0' )
{
logfont = cf.logfont;
}
else
{
// no font specified, so use window font
CFont *pfont = GetFont();
pfont->GetLogFont( &logfont );
}
if( GetItemBold( hItem ) )
logfont.lfWeight = 700;
fontdc.CreateFontIndirect( &logfont );
pfontdc = memdc.SelectObject( &fontdc );
if( cf.color != (COLORREF)-1 )
memdc.SetTextColor( cf.color );
CString sItem = GetItemText( hItem );
GetItemRect( hItem, &rect, true );
memdc.SetBkColor( GetSysColor( COLOR_WINDOW ) );
memdc.TextOut( rect.left+2, rect.top+1, sItem );
memdc.SelectObject( pfontdc );
}
hItem = GetNextVisibleItem( hItem );
}
dc.BitBlt( rcclip.left, rcclip.top, rcclip.Width(), rcclip.Height(), &memdc, rcclip.left, rcclip.top, SRCCOPY );
}
------解决思路----------------------
fontdc 是不是有问题?
------解决思路----------------------
memdc.SelectObject( pfontdc );
这句在
memdc.TextOut( rect.left+2, rect.top+1, sItem );
前时,字体已经是 原 字体了。
也就是
fontdc
没起作用
------解决思路----------------------
先载入HFONT,然后再绘制文字。