gpt4 book ai didi

winapi - 如何更改使用 DrawThemeTextEx 绘制的文本的发光颜色?

转载 作者:行者123 更新时间:2023-12-01 11:44:06 25 4
gpt4 key购买 nike

DrawThemeTextEx是绘制Windows Vista和7的Aero文字的API,即带有发光光环的文字。

使用 DrawThemeTextEx 更改绘图时使用的文本颜色,您设置了 DTTOPTScrText 字段结构并在 dwFlags 字段中指定 DTT_TEXTCOLOR,以指示 crText 字段包含有效值。但是文本后面的模糊发光效果总是画成白色。设置 shadow or border colours和相应的标志对发光颜色没有影响。 DTTOPTS 结构中没有明显的发光颜色设置。

Glowing text with a custom text color, but white glow color

在这里您可以看到自定义文本颜色(红色),但它仍在渲染,文本后面有白色模糊的光晕。比方说,我想要一种黑色发光,因为对于浅色文本,它会使文本更易于阅读。

如何改变这个白色光晕/发光的颜色?例如,是否有一个有效的 Dwm* API,或一个未记录的标志?

最佳答案

简短的回答是,您不能使用 DrawThemeTextEx API:它只允许您更改文本颜色,不能更改背景发光颜色。

长话短说,您可以通过以下方式达到同样的效果:

  • 用发光绘制文本;
  • 使用 alpha 作为颜色强度对生成的图像进行着色,以获得文本加上发光的单色图像;
  • 在没有发光效果的情况下在顶部绘制文本。

Black text with a red glow background

Example image showing the result of the technique

第二步,给图像着色,是需要解释的主要步骤。

将带有发光的黑色文本绘制到临时位图。然后,您将拥有一个具有白色和黑色的区域(白色是 Windows 呈现的唯一发光颜色)、不同的 alpha 以及在文本抗锯齿像素边缘的黑色和白色之间,这可能(由于使用的算法)是略带颜色,即不是纯灰色阴影。

Glowing text on a coloured background, zoomed in

Glowing text drawn over a coloured background, so you can see the white glow and the text antialiasing

有两种选择。第一种是使用颜色(“白度”与“黑度”)和色调将白色区域更改为背景颜色,将黑色区域更改为文本颜色。这会起作用,但可能会产生抗锯齿错误,尤其是彩色文本,与 Windows 渲染和抗锯齿的文本方式相比。一个更好的方法是意识到文本将被覆盖,并且抗锯齿,无论如何,背景发光:将所有东西(发光和文本)着色为一种颜色 - 无论是 100% alpha 文本都可以被视为 100% 白色发光在下面文本 - 然后简单地再次将文本抗锯齿绘制到背景上。

然后着色非常简单。像素将具有 alpha 值和 premultiplied alpha colour值 - 例如,(2, 2, 2, 2) 的 ABGR 是 2 的 alpha,而白色的 BGR 预乘以 alpha。忽略现有颜色,并根据像素的现有 alpha,将任何非零 alpha 像素设置为背景颜色的预乘 alpha 值。

使用 TQuadColor struct to represent four bytes of an alpha-aware 32-bit pixel ,遍历您的临时位图并使用现有的 alpha 作为强度设置颜色:

// PQuad is a pointer to the first pixel, a TQuadColor (see link, basically a packed struct of ABGR bytes)
for Loop := 0 to FWidth * FHeight - 1 do begin
if PQuad.Alpha <> 0 then begin
PQuad.SetFromColorMultAlpha(Color); // Sets the colour, and multiplies the alphas together
end;
Inc(PQuad);
end;

关键是PQuad.SetFromColorMultAlpha:

procedure TQuadColor.SetFromColorMultAlpha(const Color: TQuadColor);
var
MultAlpha : Byte;
begin
Red := Color.Red;
Green := Color.Green;
Blue := Color.Blue;
MultAlpha := Round(Integer(Alpha) * Integer(Color.Alpha) / 255.0);
SetAlpha(MultAlpha, MultAlpha / 255.0);
end;

这采用四色(即 alpha 和 RGB)并将两个 alpha 相乘以获得最终的 alpha。 这让您可以使用透明颜色着色。 SetAlpha 然后转换为预乘 alpha:

procedure TQuadColor.SetAlpha(const Transparency: Byte; const PreMult: Single);
begin
Alpha := Transparency;
Blue := Trunc(Blue * PreMult);
Green := Trunc(Green * PreMult);
Red := Trunc(Red * PreMult);
end;

结果是有色光晕:

Tinted glow

在顶部绘制文本(使用 same API 保持相同的文本渲染),不发光:

Tinted glow behind text

并且您有带有彩色非白色发光颜色的发光文本。

您可以在我的 MPL-licensed TTransparentCanvas project 找到完整的源代码在谷歌代码上。

关于winapi - 如何更改使用 DrawThemeTextEx 绘制的文本的发光颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17068482/

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