国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
如何設置CTreeCtrl樹形控件Item項的顏色和字體
userphoto

2009.03.11

關注
 

 

 

Step 1: Add member variable to track font and color

Since the control has no support for item font or color, we have to track this information within our program. We use a CMap object to associate these properties with the tree items. The map will contain information for only those items that we explicitly change. We define a nested structure that is used with the CMap object, to hold the color and the font information.
 

protected:struct Color_Font{COLORREF color;LOGFONT  logfont;};CMap< void*, void*, Color_Font, Color_Font& > m_mapColorFont ;

Step 2: Add helper functions to get/set font and color

Define the helper functions to get or set the item font or color. To set the font, we actually pass the logfont rather than a font handle. Also note that we have defined a pair of functions to get and set the bold attribute. There are two reasons for providing a separate function for the bold attribute although we can use the font function. The first reason is that the tree view control directly supports setting an item to bold. Secondly, using the built in support also maintains the proper setting for the horizontal scrollbar.
 

void CTreeCtrlX::SetItemFont(HTREEITEM hItem, LOGFONT& logfont){Color_Font cf;if( !m_mapColorFont.Lookup( hItem, cf ) )cf.color = (COLORREF)-1;cf.logfont = logfont;m_mapColorFont[hItem] = cf;}void CTreeCtrlX::SetItemBold(HTREEITEM hItem, BOOL bBold){SetItemState( hItem, bBold ? TVIS_BOLD: 0, TVIS_BOLD );}void CTreeCtrlX::SetItemColor(HTREEITEM hItem, COLORREF color){Color_Font cf;if( !m_mapColorFont.Lookup( hItem, cf ) )cf.logfont.lfFaceName[0] = '\0';cf.color = color;m_mapColorFont[hItem] = cf;}BOOL CTreeCtrlX::GetItemFont(HTREEITEM hItem, LOGFONT * plogfont){Color_Font cf;if( !m_mapColorFont.Lookup( hItem, cf ) )return FALSE;if( cf.logfont.lfFaceName[0] == '\0' ) return FALSE;*plogfont = cf.logfont;return TRUE;}BOOL CTreeCtrlX::GetItemBold(HTREEITEM hItem){return GetItemState( hItem, TVIS_BOLD ) & TVIS_BOLD;}COLORREF CTreeCtrlX::GetItemColor(HTREEITEM hItem){// Returns (COLORREF)-1 if color was not setColor_Font cf;if( !m_mapColorFont.Lookup( hItem, cf ) )return (COLORREF)-1;return cf.color;}

Step 3: Add WM_PAINT handler

In this function we first let the control update a memory device context. We then redraw the visible labels using the user defined attributes. We let the control handle the highlighting of items, so before we update a label we make sure that it is not selected or drophilited. Also, if the items font or color attributes were not changed, we don't need to redraw it. Once all the updates are ready in the memory device context, we blit it to the actual device context.

In the first implementation, I let the control directly draw on the screen and then redrew the items that had a different font or color. This caused a visible flicker as the items got updated a second time. To overcome this we use a memory device context for all the updates and finally we copy this to the main device context. After creating a compatible DC, we add a compatible bitmap to the memory DC and set the clip region to be the same as the paint DC.

After the default window procedure for the control has updated the device context, we scan through all the visible items and update the items that have a user defined color or font.

void CTreeCtrlX::OnPaint(){CPaintDC dc(this);// Create a memory DC compatible with the paint DCCDC memDC;memDC.CreateCompatibleDC( &dc );CRect rcClip, rcClient;dc.GetClipBox( &rcClip );GetClientRect(&rcClient);// Select a compatible bitmap into the memory DCCBitmap bitmap;bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );memDC.SelectObject( &bitmap );// Set clip region to be same as that in paint DCCRgn rgn;rgn.CreateRectRgnIndirect( &rcClip );memDC.SelectClipRgn(&rgn);rgn.DeleteObject();// First let the control do its default drawing.CWnd::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );HTREEITEM hItem = GetFirstVisibleItem();int n = GetVisibleCount()+1;while( hItem && n--){CRect rect;// Do not meddle with selected items or drop highlighted itemsUINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;Color_Font cf;if ( !(GetItemState( hItem, selflag ) & selflag )&& 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 fontCFont *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 );}

Step 4: Go ahead and change the item font or color

Here are some examples.
 

	// Change the item color to redSetItemColor( hItem, RGB(255,0,0));// Change the item to italicized font and underlinedLOGFONT logfont;CFont *pFont = GetFont();pFont->GetLogFont( &logfont );logfont.lfItalic = TRUE;logfont.lfUnderline = TRUE;SetItemFont(hti, logfont );
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
在樹型控件中移動鼠標產生字體及顏色的變化
關于TListView控件,ondrawitem修改字體顏色導致gdi泄漏的解決辦法
VS2010/MFC編程入門之十八(對話框:字體對話框)
[AHK]系統字體選擇的調用代碼
aardio
設置TextOut字體顯示大小
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服