كيف يمكنني تحليل سجل Metafile CreatePenIndirect من مجموعة بايت؟
سؤال
أحتاج إلى القليل من المساعدة في تحديد نوع Windows GDI التالي في C#. لدي البيانات في شكل أ byte[]
في C#، وأحتاج إلى حشد بطريقة ما أو ألقيت به على النحو التالي في C#. لطفا أنظر سؤالي الآخر, ، كما حصلت على الإجابة على polyline. هذا هو النوع:
اسم
META_CREATEPENINDIRECT
أقرب مكالمة API
#include <windows.h>
HPEN32 CreatePenIndirect(const LOGPEN32 *pen);
typedef struct tagLOGPEN
{
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN;
وصف
U16 Value 0 lopnStyle 1 lopnWidth 2, 3 lopnColor
lopncolor هو لون القلم ، lopnwidth هو عرض القلم ، إذا كان عرض القلم> 1 ولكن lopnstyle ليس صلبًا ، ثم يتم تجاهل lopnstyle وتعيينها على أي حال.
يمكن أن يكون lopnstyle واحد من
PS_SOLID
,PS_DASH
,PS_DOT
,PS_DASHDOT
,PS_DASHDOTDOT
,PS_NULL
,PS_INSIDEFRAME
,PS_USERSTYLE
,PS_ALTERNATE
. تحقق من المصدر لأنها تعني بالفعل.هناك أيضًا مجموعة من الأعلام والأقنعة التي يمكن العثور عليها في Lopnstyle أيضًا التي وضعت النهاية والانضمام إلى أنماط الخطوط المرسومة بقلم ، فهي موجودة
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
, ، مرة أخرى تحقق من المصدر لمعرفة هذه خارج.
تحديث: هذا أقرب ما يمكن أن أحصل عليه حتى الآن:
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);
}
المحلول
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 = ...
};
(لم يخبر)