我可以直接问这个问题,也可以描述性地引用我的资料(thisthisthisthis),但我将带您了解我正在尝试做的事情。

让我们从一个主窗口开始。它有自己的窗口类,其hbrBackground设置为COLOR_BTNFACE + 1。现在开始

EnableThemeDialogTexture(hwnd, ETDT_ENABLE | ETDT_USETABTEXTURE)


因此我们将要添加的标签控件将以视觉样式绘制。 (尝试使用带有标准Luna主题的Windows XP以获得最佳效果。)现在,我们添加一个选项卡控件和两个选项卡。

在第一个选项卡上,我们创建一个新窗口类的实例(我们称之为container)。该窗口类将包含各种控件。我可以将hbrBackground设置为COLOR_BTNFACE + 1,但是它将覆盖选项卡背景。所以我希望这个新的子窗口是透明的。所以我要做的是


将类hbrBackground设置为GetStockObject(HOLLOW_BRUSH)
container的扩展样式设置为WS_EX_TRANSPARENT
设置类WM_ERASEBKGND处理程序以执行SetBkMode((HDC) wParam, TRANSPARENT); return 0;来设置设备上下文并让Windows绘制透明背景。


到目前为止一切顺利,对吗?我不确定我是否真的正确地完成了所有操作,而且我希望它也不会闪烁,但这似乎没有发生:当我调整窗口大小(至少在酒中)时,我会闪烁或绘制垃圾(即使在子控件中也是如此!)。 VM中的Windows XP仅显示闪烁。我尝试调整一些设置,但无济于事。

但是,等等,现在我想拥有另一个控件,该控件仅绘制一些位图数据。在下一个选项卡上,创建另一个container,然后将其作为第三个窗口类areaarea仅在左上100x100区域中绘制并具有滚动条;其余的窗口区域应该是透明的。

现在,我对area拥有的是:


窗口类hbrBackground设置为NULL,样式CS_HREDRAWCS_VREDRAW设置
扩展窗口样式为0
WM_ERASEBKGND只需做return 1;
WM_PAINT在绘制之前用COLOR_BTNFACE + 1填充整个更新矩形,并渲染所有更新


这是无闪烁的,但显然不是透明的。现在,我真的不确定该怎么做,因为我希望area是透明的,以使其显示选项卡控件背景。再次,我尝试调整设置,使它们更接近于上面我用container尝试过的设置,但是当我尝试时,我得到的是闪烁或无效剩余。

那么,如何使这两种自定义控件类型(容器和绘图区域)既无闪烁又透明?

我目前必须至少以Windows XP为目标,但是如果仅使用Vista +可以使解决方案更容易,我很乐意将该解决方案放在一边,以防万一我放弃XP支持(不幸的是Stack Overflow不允许我派发该软件)银牌...)。

谢谢!

最佳答案

若要以“无闪烁”的方式绘制窗口,则需要将窗口绘制为位图,然后将位图复制到目标设备上下文。在Windows XP上,您将需要创建位图,调整绘图DC的原点,然后绘制窗口。在Vista和更高版本上,您可以使用BeginBufferedPaint及其关联的例程为您进行缓冲。

缓冲绘画工作后,您可以使用WM_PRINTCLIENT将窗口的父窗口绘画到绘制DC中,然后再进行任何实际的绘制。不幸的是,并非所有的窗口都支持WM_PRINTCLIENT。

您可以考虑使用DrawThemeParentBackground,而不是直接使用WM_PRINTCLIENT。

将这两种方法结合在一起,将获得透明无闪烁的图形。

关于c - 这是我如何在Windows中使自定义控件透明和无闪烁吗?还是我将这些步骤之一弄错了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25149641/

10-13 05:31