gpt4 book ai didi

c# - 如何在调用 GDI 文本函数后修复 alpha 值?

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:42 24 4
gpt4 key购买 nike

我有一个使用 Aero 玻璃效果的应用程序,因此除了红色、绿色和蓝色值之外,每个像素都有一个 alpha 值。我有一个具有纯白色背景 (alpha = 255) 的自定义绘制控件。我想使用 GDI 文本函数在控件上绘制纯文本。但是,这些函数将 alpha 值设置为任意值,导致文本半透明地显示我的应用程序下方的任何窗口。

调用渲染文本后,我想遍历控件中的所有像素并将它们的 alpha 值设置回 255。最好的方法是什么?

我对 BitBltGetPixelSetPixel 函数没有任何好感。他们似乎没有注意到 alpha 值。

以下是我考虑过但拒绝的其他解决方案:

  • 绘制位图,然后将位图复制到设备:使用这种方法,文本呈现不使用显示器的特性(例如,ClearText)。如果您知道让 GDI 将文本呈现到位图的方法,完全就像它呈现到屏幕上一样,那也可以解决我的问题。
  • 使用 GDI+ 进行文本呈现:此应用程序最初使用 GDI+ 进行文本呈现(在我开始处理 Aero 支持之前)。由于在尝试使用 GDI+ 准确测量字符串时遇到困难,我转而使用 GDI。我宁愿不切换回去。
  • 设置 Aero 区域以避免出现问题的控件:我的应用程序窗口实际上是在不同进程中运行的不同应用程序的子窗口。我无法直接控制顶级窗口中的 Aero 设置。

该应用程序是使用 Windows 窗体用 C# 编写的,但我并没有使用 Interop 来调用 Win32 API 函数。

最佳答案

下面是我最终想出的解决方案。它有点丑陋,可能会被简化,但它确实有效。这个想法是基于原始 Graphics 对象(即屏幕)创建一个 BufferedGraphics 对象。在 BufferedGraphics 对象中,TextRenderer.DrawText() 将呈现文本,就像它正在绘制到屏幕上一样。然后我创建一个常规图形对象,将 Buffered Graphics 对象复制到常规图形对象,最后将常规图形对象绘制到屏幕上。

Rectangle inner = new Rectangle(Point.Empty, ContentRectangle.Size);
using (BufferedGraphics bg = BufferedGraphicsManager.Current.Allocate(e.Graphics, inner)) {
using (Bitmap bmp = new Bitmap(inner.Width, inner.Height, bg.Graphics)) {
using (Graphics bmpg = Graphics.FromImage(bmp)) {
bg.Graphics.Clear(BackColor);
do_my_drawing(bg.Graphics);
bg.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
bmpg.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;

bg.Render(bmpg);
e.Graphics.DrawImageUnscaledAndClipped(bmp, ContentRectangle);
}
}
}

可能没有必要设置所有的 CompositingMode 属性,但是一旦我开始使用它,我就没有费心测试所有的排列来找出需要哪些(如果有的话)。

关于c# - 如何在调用 GDI 文本函数后修复 alpha 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2691543/

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