Comment puis-je analyser un CREATEPENINDIRECT record métafichier d'un tableau d'octets?

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

  •  21-09-2019
  •  | 
  •  

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);
}
Était-ce utile?

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é)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top