2

我正在从 TVirtualDrawTree 派生一个自定义控件,并且我正在覆盖该DoPaintBackground事件以绘制树视图的背景渐变效果。

我也重写了这个DoBeforeItemPaint函数,所以我可以自定义绘制树视图项。但是,我不能完全设法让项目以透明背景绘制。

查看 TVirtualDrawTree 的源代码,看起来好像该项目被复制到 TBitmap 图像然后复制到画布上,但是,我尝试编辑源代码并在位图本身上设置透明度选项,但它似乎仍然没有工作。

我还尝试在绘制之前清除画布Canvas.Brush.Style := bsClear并填充项目矩形,但没有任何乐趣。

4

1 回答 1

3

不要做透明,作弊!

绘制渐变听起来像是很多工作:将它绘制到一个临时位图上,这样您就不需要每次DoPaintBackgrdound()调用时都重新生成它。一旦你在位图中有了背景,你可以BitBlt在处理时将相关部分放入画布中,当你需要整个背景时DoBeforeItemPaint,你可以将位图映射到整个虚拟树。BitBlt

这样,您就不需要处理昂贵的透明度,但对于最终用户来说,看起来您的项目是使用透明度绘制的。这是一个双赢的局面。

于 2011-04-06T14:27:04.623 回答