gpt4 book ai didi

c - 这就是我在 Windows 中使自定义控件透明且无闪烁的方法吗?或者我的这些步骤之一是错误的?

转载 作者:行者123 更新时间:2023-11-30 15:31:03 25 4
gpt4 key购买 nike

我可以首先直接提出问题,也可以通过描述性地引用我的资料来源( thisthisthisthis )来开始,但我将引导您完成我想要做的事情而是这样做。

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

EnableThemeDialogTexture(hwnd, ETDT_ENABLE | ETDT_USETABTEXTURE)

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

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

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

到目前为止一切都很好,对吧?我不确定我是否真的正确地完成了所有这一切,并且我希望这也不会闪烁,但这似乎不会发生:当我调整窗口大小(至少在 Wine 中)时,我得到要么闪烁或垃圾绘制(即使在子控件中,不知何故!)。虚拟机中的 Windows XP 只是显示闪烁。我尝试调整一些设置但无济于事。

但是等等,现在我想要另一个控件,一个只绘制一些位图数据的控件。在下一个选项卡上,创建另一个容器,然后将第三个窗口类area作为该容器的子级。 area 仅在左上角的 100x100 区域中绘制,并且有滚动条;窗口区域的其余部分应该是透明的。

现在,我的区域是:

  1. 窗口类hbrBackground设置为NULL,样式CS_HREDRAWCS_VREDRAW设置
  2. 扩展窗口样式为0
  3. WM_ERASEBKGND 只是执行 return 1;
  4. WM_PAINT 在绘制之前用 COLOR_BTNFACE + 1 填充整个更新矩形,并渲染所有内容

这是无闪烁的,但显然不透明。现在我真的不知道该怎么做,因为我希望区域是透明的,以显示选项卡控件背景。再次,我尝试调整设置,使它们更接近我上面使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com