自定义 CTreeCtrl - 如何修改文本/选择颜色

Posted

技术标签:

【中文标题】自定义 CTreeCtrl - 如何修改文本/选择颜色【英文标题】:Custom CTreeCtrl - How to modify text / selection color 【发布时间】:2012-06-23 22:02:15 【问题描述】:

首先,我会自定义 - 除其他外 - 文本颜色和选择颜色(文本背景)。 例如,文本颜色应为蓝色;文本背景的颜色应该是透明的。 所以,我重写了 OnPaint() 方法; 我调用 SetTextColor() 和 SetBkColor() 函数,但不幸的是我总是得到无效的颜色,或者我得到一个烦人的“无限循环闪光”效果。 在这里你可以看到他的完整实现。

void CustomTree::OnPaint() 

    CPaintDC dc(this);

    CDC memDC;
    memDC.CreateCompatibleDC(&dc);

    CRect rcClip, rcClient;
    dc.GetClipBox( &rcClip );
    GetClientRect(&rcClient);

    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
    memDC.SelectObject( &bitmap );

    CRgn rgn;
    rgn.CreateRectRgnIndirect( &rcClip );
    memDC.SelectClipRgn(&rgn);
    rgn.DeleteObject();

    /* WHAT IS the correct usage of SetText/Bk Color? */

    // ::SetTextColor(memDC, RGB(0, 0, 255));
    // ::SetBkColor(memDC, RGB(0, 0, 255));
    // COLORREF col = SetTextColor(RGB(0,0,255));
    // COLORREF co2 = memDC.SetTextColor(RGB(0,0,255));

    // First let the control do its default drawing.

    CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);

    // do some others stuffs...

    dc.BitBlt(rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &memDC, 
                rcClip.left, rcClip.top, SRCCOPY);

    memDC.DeleteDC();

哪里出错了?

谢谢

【问题讨论】:

【参考方案1】:

如果您想更改树视图的颜色和字体,您必须捕获并回复NM_CUSTOMDRAW。在调用默认值之前简单地设置属性是不够的。

【讨论】:

以上是关于自定义 CTreeCtrl - 如何修改文本/选择颜色的主要内容,如果未能解决你的问题,请参考以下文章

MFC树控件CTreeCtrl

如何防止 CTreeCtrl 的 OnCustomDraw 在我的画上画默认画

CTreeCtrl:如何清除所选项目的焦点

如何在 MFC 中处理 CTreeCtrl 的状态更改事件

如何在自定义单元格中同步选择文本视图的事件?

如何在自定义视图中实现文本选择阴影,如 UIWebView