どのように私はバイト配列のうち、CREATEPENINDIRECTメタファイルレコードを解析していますか?
質問
私はC#で次のWindows GDIのタイプを定義する際に少しの助けを必要としています。私はC#でbyte[]
の形式でデータを持っている、と私は何とかマーシャルにまたはC#で、次のようにキャストする必要があります。私はポリラインに答えを得たとして、私の他の質問を参照してください。これはタイプです。
NAME
META_CREATEPENINDIRECT
最寄りの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は、ペンの色で、ペンの幅は> 1であればlopnWidthは、ペンの幅であるが、lopnStyleが固体ではない、その後、lopnStyleは、固体とにかくに無視され、セットされます。
lopnStyleは
PS_SOLID
、PS_DASH
、PS_DOT
、PS_DASHDOT
、PS_DASHDOTDOT
、PS_NULL
、PS_INSIDEFRAME
、PS_USERSTYLE
、PS_ALTERNATE
の1つであることができます。彼らが実際に意味することをのためのソースをチェックしてください。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