Como faço para analisar um recorde de metafile CreatePenIndirect de uma matriz de bytes?
Pergunta
Preciso de uma pequena ajuda para definir o seguinte tipo de GDI do Windows em C#. Eu tenho os dados na forma de um byte[]
em C#, e eu preciso de alguma forma marechal ou lançá -lo como o seguinte em C#. Por favor, veja minha outra pergunta, quando recebi a resposta para a poliina. Este é o tipo:
NOME
META_CREATEPENINDIRECT
Chamada da API mais próxima
#include <windows.h>
HPEN32 CreatePenIndirect(const LOGPEN32 *pen);
typedef struct tagLOGPEN
{
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN;
DESCRIÇÃO
U16 Value 0 lopnStyle 1 lopnWidth 2, 3 lopnColor
Lopncolor é a cor da caneta, Lopnwidth é a largura da caneta, se a largura da caneta for> 1, mas o lopnstyle não é sólido, então o lopnstyle é ignorado e definido como sólido de qualquer maneira.
Lopnstyle pode ser um dos
PS_SOLID
,PS_DASH
,PS_DOT
,PS_DASHDOT
,PS_DASHDOTDOT
,PS_NULL
,PS_INSIDEFRAME
,PS_USERSTYLE
,PS_ALTERNATE
. Confira a fonte para isso eles realmente significam.Há também um conjunto de bandeiras e máscaras que podem ser encontradas no lopnstyle também que estabelecem o fim e juntam estilos de linhas desenhadas com uma caneta, elas são
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
, verifique novamente a fonte para descobrir isso.
ATUALIZAÇÃO: Isso é o mais próximo possível:
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);
}
Solução
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 = ...
};
(Não testado)