gpt4 book ai didi

c++ - 如何在 GDI+ 中使用库存对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:26 26 4
gpt4 key购买 nike

我使用以下模式来录制增强的元文件供以后播放:

POINT pts[] = {
//.....
};

::SelectObject(hEnhDC, ::GetStockObject(LTGRAY_BRUSH));
::Polygon(hEnhDC, pts, _countof(pts));

现在我被迫使用 GDI+ 来提供抗锯齿功能,所以我正在尝试转换该代码示例:

Gdiplus::Point pts[] = {
//...
};

Gdiplus::Graphics grx(hEnhDC);
Gdiplus::Pen pen(Gdiplus::Color(255, GetRValue(clrPen), GetGValue(clrPen), GetBValue(clrPen)), PEN_THICKNESS);

grx.FillPolygon(&brush, pts, _countof(pts));
grx.DrawPolygon(&pen, pts, _countof(pts));

问题是如何将库存对象 HBRUSH::GetStockObject(LTGRAY_BRUSH) 转换为 GDI+ Brush 对象?


编辑:伙计们,谢谢你们的所有建议。我很抱歉没有提供更多细节。这个问题不是关于从库存画笔中获取 RGB 颜色三元组。我可以用 GetSysColor 做到这一切功能,或使用 LOGBRUSH,如下所示。

诀窍在于上面的第一句话。我正在录制可以在单独的计算机上播放的增强图元文件,因此我无法将颜色硬编码到其中。

让我解释一下。例如,第一个 GDI 示例(让我们将其简化为一个灰色填充的三角形):

POINT pts[] = {
{100, 100,},
{100, 120,},
{120, 100,},
};

::SelectObject(hEnhDC, ::GetStockObject(LTGRAY_BRUSH));
::Polygon(hEnhDC, pts, _countof(pts));

如果我然后调用 GetEnhMetaFileBits在该元文件上,我将获得以下数据:

enter image description here

如您所见EMR_SELECTOBJECT该记录的元文件中的对象指定 LTGRAY_BRUSH = 0x80000001 ,当 meta-file is played 时,它将被正确地替换为颜色。在目标系统上。

这就是我在这里尝试使用 GDI+ 实现的目标。出于某种原因,它似乎只支持其 Brush 中的硬编码颜色三元组。类(class)。这就是我问的原因。

否则,一种解决方案是解析增强元文件的原始数据。 (不过对于 GDI+,这是一个复杂得多的结构,还涉及解析 EMR_GDICOMMENT 对象。)然后在播放 GDI+ 元文件之前替换目标系统上所需的颜色。但它涉及编写大量代码,我在这个阶段试图避免...

最佳答案

恐怕你不能轻易转换。

一个简单的解决方法是 create GDI+同色实心笔刷。

参见 this spec对于 GDI 库存对象的颜色值,该特定画笔具有颜色 #C0C0C0

关于c++ - 如何在 GDI+ 中使用库存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57129837/

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