Come effettuo il parsing di un record di metafile CREATEPENINDIRECT da un array di byte?
Domanda
Ho bisogno di un po 'di aiuto nel definire il seguente tipo di Windows GDI in C #. Ho i dati sotto forma di un byte[]
in C #, e ho bisogno di schierare o lanciare come il seguente in C # in qualche modo. Consulta mia altra domanda , come ho avuto la risposta alla polilinea. Questo è il tipo:
nome
META_CREATEPENINDIRECT
PIU 'VICINA API CALL
#include <windows.h>
HPEN32 CreatePenIndirect(const LOGPEN32 *pen);
typedef struct tagLOGPEN
{
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN;
DESCRIZIONE
U16 Value 0 lopnStyle 1 lopnWidth 2, 3 lopnColor
lopnColor è il colore della penna, lopnWidth è la larghezza della penna, se la larghezza della penna è> 1, ma la lopnStyle non è solido, allora lopnStyle viene ignorato ed impostato su solidi in ogni caso.
lopnStyle può essere uno dei
PS_SOLID
,PS_DASH
,PS_DOT
,PS_DASHDOT
,PS_DASHDOTDOT
,PS_NULL
,PS_INSIDEFRAME
,PS_USERSTYLE
,PS_ALTERNATE
. Controlla la fonte per che in realtà significano.C'è anche un set di bandiere e maschere che si possono trovare in lopnStyle oltre che impostare la fine e unirsi a stili di linee disegnate con una penna, sono
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
, nuovamente controllare la fonte di capire questi fuori.
Aggiornamento: Questo è il più vicino che posso ottenere finora:
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);
}
Soluzione
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 = ...
};
(testato)