0

次の Windows GDI 型を C# で定義する際に少し助けが必要です。C#で a の形式のデータがありbyte[]、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 lopnWidth
2、3 lopnColor

lopnColor はペンの色、lopnWidth はペンの幅です。ペンの幅が 1 より大きいが、lopnStyle がソリッドでない場合、lopnStyle は無視され、とにかくソリッドに設定されます。

lopnStyleは、、、、、、、、、PS_SOLIDのいずれかPS_DASHです。PS_DOT_ PS_DASHDOT_ それらが実際に意味することについては、ソースを確認してください。PS_DASHDOTDOTPS_NULLPS_INSIDEFRAMEPS_USERSTYLEPS_ALTERNATE

また、lopnStyle には、ペンで描かれた線の終了スタイルと結合スタイルを設定するPS_STYLE_MASKフラグとマスクのセットもあります。これらを把握します。PS_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);
}
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 に答える