VC++中改变CTreeCtrl子项Item的字体和颜色
来源:互联网 发布:c语言游戏源代码网站 编辑:程序博客网 时间:2024/04/28 19:14
通过定义一个继承CTreeCtrl的类来实现改变子项字体和颜色:
//首先定义一个字体、颜色的结构体:protected:struct Color_Font{COLORREF color;LOGFONT logfont;}; //使用CMap来保存各个Item对应的字体、颜色信息CMap< void*, void*, Color_Font, Color_Font& > m_mapColorFont ;//添加设置字体、颜色、粗体的函数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;}//添加WM_PAINT 信息监控,重载OnPaint()函数来实现绘制afx_msg void CMyTreeCtrl::OnPaint(){//获取当前绘制对象的DCCPaintDC dc(this);// 使用将要绘制的对象的DC创建一个memory DC//memory device context的概念:是在内存中创建一个结构来反映一个显示(屏幕区域、窗口、//打印机等)的表面。可以用来先在内存中准备好要显示的图像,从而实现双缓存,提高刷新//速度减少刷新时产生的闪烁。CDC memDC;//从当前DC创建内存对象memDC.CreateCompatibleDC( &dc );//定义CRect对象,用来确定区域CRect rcClip, rcClient;//获取当前对象的边界区域dc.GetClipBox( &rcClip );//获取当前对象的用户区域GetClientRect(&rcClient);// Select a compatible bitmap into the memory DC//创建一个bmp文件,作为memDC的内容//该文件的大小与用于区域相同CBitmap bitmap;bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );memDC.SelectObject( &bitmap );// Set clip region to be same as that in paint DC//通过对象的边界区域创建CRgn对象CRgn 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 items//不对选中的节点和实行拖放功能的节点进行操作UINT 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{// 用户没有定义,使用系统字体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 );}
0 0
- VC++中改变CTreeCtrl子项Item的字体和颜色
- 在VC++中改变CTreeCtrl子项Item字体和颜色
- 在VC++中改变CTreeCtrl子项Item字体和颜色
- 在VC++中改变树状控件子项Item字体和颜色
- 动态改变Listview的item背景颜色和item中字体的颜色
- Android的ListView子Item选中改变TextView字体颜色
- 浅谈vc里控件的字体和颜色的改变
- 改变listCtrl或 CTreeCtrl中的字体颜色
- 改变ListBox中项的字体颜色。
- 改变ListBox中项的字体颜色。
- 改变ListBox中项的字体颜色。
- 改变treeview中节点的背景颜色和字体颜色
- ListView 中 背景颜色 和字体颜色的改变
- CRichEditView改变字体的颜色和字体
- UIPickerView控件中自定义 及 改变当前选中的Item的字体颜色
- VC改变空间背景颜色字体颜色和大小
- ListView Item 选中时 改变 TextView 的字体颜色
- 改变vs2005中代码字体的大小和颜色
- Spring配置和简单属性
- SQL执行自动备份
- 网页图片自适应手机宽度
- Android 自带图标库 android.R.drawable
- Android requires compiler compliance level 5.0 or 6.0. Found '1.3' instead.
- VC++中改变CTreeCtrl子项Item的字体和颜色
- 使用hadoop实现关联商品统计
- Eclipse在调试程中出现java.lang.NoClassDefFoundError的解决方案
- web栏目置顶
- 程序实践系列(六)运算符重载 "+" 和"-"
- PHP中CURL方法curl_setopt()函数的一些参数
- 用栈对二叉树进行中序遍历
- 幽默的代码
- nginx中查看关于php的配置和php-fpm的重启等操作