0

在 C# 中定义以下 Windows GDI 类型时,我需要一点帮助。我byte[]在 C# 中有 a 形式的数据,我需要以某种方式在 C# 中将其编组或强制转换为以下形式。请参阅我的另一个问题,因为我得到了折线的答案。这是类型:

姓名

META_CREATEPENINDIRECT

最近的 API 调用

#include <windows.h>
HPEN32 CreatePenIndirect(const LOGPEN32 *pen);

typedef struct tagLOGPEN
{
    UINT        lopnStyle;
    POINT       lopnWidth;
    COLORREF    lopnColor;
} LOGPEN;

描述

U16 值
0 洛普风格
1 低宽
2, 3 lopnColor

lopnColor 是笔的颜色, lopnWidth 是笔的宽度,如果笔的宽度 > 1 但 lopnStyle 不是solid,那么 lopnStyle 被忽略并设置为solid。

lopnStyle 可以是PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL, PS_INSIDEFRAME, PS_USERSTYLE,之一PS_ALTERNATE。查看他们实际意思的来源。

还有一组标志和掩码可以在 lopnStyle 中找到,以及设置用笔绘制的线条的结束和连接样式,它们是PS_STYLE_MASK, PS_ENDCAP_ROUND, PS_ENDCAP_SQUARE, PS_ENDCAP_FLAT, PS_ENDCAP_MASK, PS_JOIN_ROUND, PS_JOIN_BEVEL, PS_JOIN_MITER, PS_JOIN_MASK, PS_COSMETIC, PS_GEOMETRIC, PS_TYPE_MASK, 再次查看源代码弄清楚这些。


更新:这是迄今为止我能做到的最接近:

fixed (byte* b = dataArray)
{
    byte* ptr = (byte*)b;
    // Get style
    l_nStyle = (ushort)*(ptr);
    ++ptr;
    // Get width
    l_nWidth = (ushort)*(++ptr);
    ++ptr;
    // skip one ushort
    ++ptr; ++ptr;
    // Get RGB colors
    l_nColorR = (ushort)*(++ptr);
    l_nColorG = (ushort)*(++ptr);
    l_nColorB = (ushort)*(++ptr);
}
4

1 回答 1

0
byte[] buffer;
int style = BitConverter.ToUInt16(buffer, 0);
int width = BitConverter.ToUInt16(buffer, 2);
var color = Color.FromArgb(buffer[4], buffer[5], buffer[6]);
var pen   = new Pen(color, width)
{
    DashStyle = ..., // set style
    StartCap = ...,
    EndCap = ...
};

(未经测试)

于 2009-11-21T03:53:01.540 回答