【发布时间】:2011-02-11 02:27:57
【问题描述】:
我有一个使用 Aero 玻璃效果的应用程序,因此除了红色、绿色和蓝色值之外,每个像素都有一个 alpha 值。我有一个具有纯白色背景(alpha = 255)的自定义绘制控件。我想使用 GDI 文本函数在控件上绘制纯文本。但是,这些函数将 alpha 值设置为任意值,导致文本半透明地显示我的应用程序下方的任何窗口。
调用渲染文本后,我想遍历控件中的所有像素并将它们的 alpha 值设置回 255。最好的方法是什么?
BitBlt、GetPixel 和 SetPixel 函数我没有任何运气。他们似乎没有注意到 alpha 值。
以下是我考虑过但拒绝的其他解决方案:
- 绘制到位图,然后将位图复制到设备:使用这种方法,文本渲染不会利用监视器的特性(例如 ClearText)。如果您知道一种让 GDI 将文本渲染到位图的方法完全就像它会渲染到屏幕上一样,那也可以解决我的问题。
- 使用 GDI+ 进行文本渲染:此应用程序最初使用 GDI+ 进行文本渲染(在我开始从事 Aero 支持工作之前)。由于在尝试使用 GDI+ 准确测量字符串时遇到困难,我转而使用 GDI。我宁愿不转回去。
- 设置 Aero 区域以避免有问题的控件:我的应用程序窗口实际上是在不同进程中运行的不同应用程序的子窗口。我无法直接控制顶级窗口中的 Aero 设置。
该应用程序是使用 Windows 窗体用 C# 编写的,尽管我没有使用 Interop 调用 Win32 API 函数。
【问题讨论】: