どのように私はバイト配列のうち、CREATEPENINDIRECTメタファイルレコードを解析していますか?

StackOverflow https://stackoverflow.com/questions/1774291

  •  21-09-2019
  •  | 
  •  

質問

私は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_SOLIDPS_DASHPS_DOTPS_DASHDOTPS_DASHDOTDOTPS_NULLPS_INSIDEFRAMEPS_USERSTYLEPS_ALTERNATEの1つであることができます。彼らが実際に意味することをのためのソースをチェックしてください。

     

Theresのも同様に終わりを設定し、ペンで描かれたラインのスタイルに参加することlopnStyleで見つけることができるフラグとマスクのセット、彼らはPS_STYLE_MASKPS_ENDCAP_ROUNDPS_ENDCAP_SQUAREPS_ENDCAP_FLATPS_ENDCAP_MASKPS_JOIN_ROUNDPS_JOIN_BEVELPS_JOIN_MITERPS_JOIN_MASKPS_COSMETICPS_GEOMETRICPS_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 = ...
};

(未テスト)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top