如何解析CREATEPENINDIRECT图元文件记录了一个字节数组的?
题
我需要定义在C#以下的Windows GDI型一点帮助。我有在C#中byte[]
形式的数据,我需要以某种方式编组或将它转换为C#以下。请参阅我的其他问题的,因为我得到了答案折线。这是类型:
NAME
META_CREATEPENINDIRECT
NEAREST API调用
#include <windows.h>
HPEN32 CreatePenIndirect(const LOGPEN32 *pen);
typedef struct tagLOGPEN
{
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN;
描述
U16 Value 0 lopnStyle 1 lopnWidth 2, 3 lopnColor
lopnColor是笔的颜色,lopnWidth是笔的宽度,如果笔的宽度为> 1,但lopnStyle不固,然后lopnStyle被忽略,设置为固体反正。
lopnStyle可以
PS_SOLID
,PS_DASH
,PS_DOT
,PS_DASHDOT
,PS_DASHDOTDOT
,PS_NULL
,PS_INSIDEFRAME
,PS_USERSTYLE
,PS_ALTERNATE
之一。退房的,他们实际上指的是源。也Theres一组标志和掩模可以在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);
}
解决方案
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 = ...
};
(未测试的)
不隶属于 StackOverflow