c – 具有透明文本背景而不是默认白色的Treeview节点

我正在使用自定义绘制来尝试创建透明树视图(现在我正在测试启用视觉样式时).

我的CDDS_PREPAINT处理程序工作正常,树正确绘制了父级的背景位图.

我尝试添加CDDS_ITEMPREPAINT处理程序,我使用SetBkColor(((LPNMCUSTOMDRAW)lParam) – > hdc,TRANSPARENT);并返回CDRF_NEWFONT,但失败了.使用默认的白色背景绘制节点.

如何使项目的文本背景透明?

谢谢.

最好的祝福.

以下是说明性代码段:

switch( ((LPNMCUSTOMDRAW)lParam)->dwDrawStage  )
{
case CDDS_PREPAINT:
    {
        DrawThemeParentBackground(
            ((LPNMCUSTOMDRAW)lParam)->hdr.hwndFrom,
            ((LPNMCUSTOMDRAW)lParam)->hdc,
            &((LPNMCUSTOMDRAW)lParam)->rc );

        // since tree is in dialog box we need below statement
        SetWindowLongPtr( hDlg, DWLP_MSGRESULT, (LONG_PTR)CDRF_NOTIFYITEMDRAW );
        return TRUE;

    }
    break;
case CDDS_ITEMPREPAINT :  // how to properly handle this ???
    {   
        SetBkMode( ((LPNMCUSTOMDRAW)lParam)->hdc, TRANSPARENT );

        SetWindowLongPtr( hDlg, DWLP_MSGRESULT, (LONG_PTR)CDRF_NEWFONT );
        return TRUE;
    }
    break;
}
最佳答案
不幸的是,如果没有自己画出物品,这是不容易的,抱歉.

事实证明树视图控件传统上在内部使用ExtTextOut()函数来绘制项目标题.此函数采用显式标志参数,其中值ETO_OPAQUE表示“应使用当前背景颜色填充矩形”.

由于此选项作为额外标志传递,而不是通过查看当前GDI背景模式来确定,因此您无法在自定义绘制处理程序中使用SetBkMode()来解决此问题. DC的背景颜色属性也不支持alpha通道,因此不能只设置为透明.

由于Common Controls版本6.0和主题窗口装饰,这有点不同,但在这种情况下仍然没用:控件只调用带有TVP_TREEITEM部分的DrawThemeBackground(),其余部分根据使用的主题进行处理.我在Windows 8.1的默认Aero主题中看到有这样的条目:

ClassID  | PartID       | StateID      | Property        | Value
---------+--------------+--------------+-----------------+--------------
TreeView | TVP_TREEITEM | TREIS_NORMAL | FILLCOLOR:COLOR | 255, 255, 255

那么,有哪些替代方案?

始终可以选择为CDDS_ITEMPREPAINT事件返回CDRF_SKIPDEFAULT,并自行执行所有显示操作.但是你需要处理绘制线条,[]框,选择和聚焦矩形以及其他所有内容.

另一种选择可能是将存储在控件中的标题文本保留为空,然后将其添加到CDDS_ITEMPOSTPAINT中 – 即使用带有wParam = TRUE的TVM_GETITEMRECT获取文本矩形,并在控件已经绘制其他所有内容后绘制真实文本.但是这种方法也失败了,因为即使对于空文本,也会显示出一些微小的不透明矩形.您需要先擦除该工件,然后再继续绘制文本.提出一个适用于项目状态的所有组合的代码似乎很棘手.

转载注明原文:c – 具有透明文本背景而不是默认白色的Treeview节点 - 代码日志