在原生Win32 GDI中绘制略透明的蓝色矩形

9

如何在Native Win32 C++中绘制一个蓝色矩形,并设置透明度为0.5(即50%透明度)?

使用RGBA()等宏失败,我不确定如何指定画刷的 alpha 值。

SetDCPenColor(hdc, RGBA(255,255,0,127));
SetDCBrushColor(hdc, RGBA(255,255,0,127));
Rectangle(hdc, 0, 0, width, height);
2个回答

7

我非常确定你需要使用GDI+来完成这个操作,但是在GDI中应该有它:

//in rendering function
using namespace Gdiplus;
Graphics g (hdc);
SolidBrush brush (Color (127 /*A*/, 0 /*R*/, 0 /*G*/, 255 /*B*/));
g.FillRectangle (&brush, 0, 0, width, height);

在积极方面,GDI+虽然速度不太快,但具有更强大的功能和视觉效果,并且是面向对象的,这也意味着您无需担心所有那些 "SelectObject" 和 "DeleteObject" 调用。
请注意,在初始化/结束程序时,为了使用GDI+,需要进行一些额外步骤,并且所有内容都在"Gdiplus"命名空间中,并且需要使用"-lgdiplus"。
如果您真的需要GDI,则我所知道的唯一解决方案是AlphaBlend,这确实是比仅向设备上下文绘制形状更复杂的方法。开始使用GDI+总是好的,因为它仍在使用中,并且比GDI更容易使用。

我不认为GDI+比GDI更快,是吗?据我所知,GDI是硬件加速的,但GDI+并非如此。 - Seth Carnegie
@SethCarnegie,我没有深入研究过它,但我记得它更快。看起来你是对的。不过,GDI+仍然具有更多的功能,并且可以生成更好的图像。如果您真正担心速度(同时也关注质量),DirectX是一个非常好的选择。 - chris
是的,毫无疑问,GDI+可以生成更好的图像并具有更多的功能。+1。 - Seth Carnegie
毫无疑问,GDI+比GDI慢(至少在可以实现相同结果的情况下)。我进行了一些测量,这是绝对明显的。 - Nick


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接