Comment puis-je analyser un CREATEPENINDIRECT record métafichier d'un tableau d'octets?
Question
Je besoin d'un peu d'aide pour définir le type suivant de Windows GDI en C #. J'ai les données sous la forme d'un byte[]
en C #, et je dois maréchal en quelque sorte ou jeté comme suit dans C #. S'il vous plaît voir mon autre question , comme je l'ai obtenu la réponse à la polyligne. Ceci est le type:
NOM
META_CREATEPENINDIRECT
API CALL NEAREST
#include <windows.h>
HPEN32 CreatePenIndirect(const LOGPEN32 *pen);
typedef struct tagLOGPEN
{
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN;
DESCRIPTION
U16 Value 0 lopnStyle 1 lopnWidth 2, 3 lopnColor
lopnColor est la couleur du stylo, lopnWidth est la largeur de la plume, si la largeur de la plume est> 1 mais le lopnStyle n'est pas solide, alors lopnStyle est ignoré et mis à l'état solide de toute façon.
lopnStyle peut être l'un des
PS_SOLID
,PS_DASH
,PS_DOT
,PS_DASHDOT
,PS_DASHDOTDOT
,PS_NULL
,PS_INSIDEFRAME
,PS_USERSTYLE
,PS_ALTERNATE
. Vérifiez la source de ce qu'ils signifient réellement.Theres également un ensemble de drapeaux et des masques qui peuvent être trouvés dans lopnStyle et qui a mis fin et rejoindre les styles de lignes tracées avec un stylo, ils sont
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
, vérifier à nouveau la source de ces figurer sur.
Mise à jour: C'est aussi proche que je peux obtenir à ce jour:
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);
}
La solution
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 = ...
};
(non testé)