如何从字节数组中解析CREATEPENINDIRECT元文件记录?

时间:2009-11-21 02:17:08

标签: c# metafile

我需要一点帮助来定义C#中的以下Windows GDI类型。我在C#中以byte[]的形式获得数据,我需要以某种方式封送或在C#中将其转换为以下内容。请参阅my other question,因为我得到了Polyline的答案。这是类型:

NAME

META_CREATEPENINDIRECT

NEAREST API CALL

#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。 1但是lopnStyle不是实心的,那么lopnStyle会被忽略并设置为solid。

     

lopnStyle可以是PS_SOLIDPS_DASHPS_DOTPS_DASHDOTPS_DASHDOTDOTPS_NULLPS_INSIDEFRAME之一, PS_USERSTYLEPS_ALTERNATE。查看它们实际意义的来源。

     

Theres还有一组标志和面具,可以在lopnStyle中找到,用于设置用笔绘制的线条的结束和连接样式,它们是PS_STYLE_MASKPS_ENDCAP_ROUND,{{1 }},PS_ENDCAP_SQUAREPS_ENDCAP_FLATPS_ENDCAP_MASKPS_JOIN_ROUNDPS_JOIN_BEVELPS_JOIN_MITERPS_JOIN_MASKPS_COSMETICPS_GEOMETRIC,再次检查来源以确定这些。


更新:这是我到目前为止的最接近的结果:

PS_TYPE_MASK

1 个答案:

答案 0 :(得分: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 = ...
};

(未测试的)