我们目前正在通过GDI +转移旧应用程序,而不是直接使用GDI。由于我们正在逐步翻译系统,有时我们需要从Gdiplus :: Graphics对象中获取HDC,以便允许尚未翻译的代码使用GDI直接绘制到它。
绘图很好,除了我们似乎在使用GDI直接绘制到DC的图像上失去了抗锯齿。如果在从Graphics对象抓取DC后,我们在整个区域上绘制一个填充的矩形,然后继续绘图,它就会很好。如果我们直接进行绘图,所有内容都会在没有抗锯齿的情况下进入。
void Draw(Gdiplus::Graphics& renderContext)
{
auto hdc = renderContext.GetHDC();
auto dc = HDC::FromHandle(nativeDC);
//Required to antialias drawing below
dc->FillSolidRect(GetClientRect(), RGB(255, 255, 255));
/* Do Drawing */
dc ->Detach();
renderContext.ReleaseHDC(hdc );
}
更确切地说,似乎抗锯齿alpha变平了,这就解释了为什么在绘制之前在GDI中填充矩形会移除伪影。 如果你在一个Bitmap上使用antialias进行绘制,然后尝试在另一个Bitmap上进行alphablend,它会产生类似的效果 - 顶部的alpha信息变平,然后在ColorMatrix中指定新的alpha值适用于整个图像。
如果有人能够提供一些有关从图形对象中获取/释放HDC时到底发生了什么的信息,以及为什么使用GDI直接删除alpha,我将不胜感激。
答案 0 :(得分:1)
支持HDC的位图是described here的副本,而不是原始位图。
在位图支持的GDI +图形对象上使用GDI
为支持的Graphics对象调用Graphics :: GetHDC()时 通过位图而不是屏幕,创建了一个内存HDC和一个新的 创建HBITMAP并将其选择到内存HDC中。这个新的记忆 位图未使用原始位图的图像进行初始化,而是使用原始位图的图像进行初始化 带有标记模式,允许GDI +跟踪变化 位图。通过使用对内存位图所做的任何更改 GDI代码的变化在哨兵模式的变化中变得明显。什么时候 调用Graphics :: ReleaseHDC(),将这些更改复制回 原始位图...此外,这种方法的性能成本是因为 GDI +必须将更改复制回原始位图。
显然,当您使用GDI绘制HDC时,您将无法获得任何抗锯齿功能。 GDI并不支持它。这就是GDI +的用途。