Vra

Ek het 'n bietjie hulp nodig om die volgende Windows GDI-tipe in C# te definieer.Ek het die data in die vorm van 'n byte[] in C#, en ek moet dit op een of ander manier as die volgende in C# opstel of gooi.

Dit is die tipe:

http://java.freehep.org/vectorgraphics/apidocs/org/freehep/graphicsio/emf/gdi/PolyPolygon16.html

http://msdn.microsoft.com/en-us/library/cc230665%28PROT.10%29.aspx

Wysig:Ek kon so ver kom, naby, maar nie heeltemal nie:

                    UInt32 rectLeft = BitConverter.ToUInt32(dataArray, 0);
                UInt32 rectTop = BitConverter.ToUInt32(dataArray, 4);
                UInt32 rectRight = BitConverter.ToUInt32(dataArray, 8);
                UInt32 rectBottom = BitConverter.ToUInt32(dataArray, 12);
                UInt32 rectNumberOfPolygons = BitConverter.ToUInt32(dataArray, 16);
                // Number of points in each polygon
                int l_nIndex = 20;
                UInt32[] lengths = new UInt32[rectNumberOfPolygons];
                for (int i = 0; i < lengths.Length; i++)
                {
                    lengths[i] = BitConverter.ToUInt32(dataArray, l_nIndex);
                    l_nIndex += 4;
                }
                // Extract points
                foreach (int l_nPolygonLength in lengths)
                {
                    List<Point> l_lstPoints = new List<Point>();
                    for (int i = 0; i < l_nIndex + l_nPolygonLength; i++)
                    {
                        UInt16 pointX = BitConverter.ToUInt16(dataArray, l_nIndex);
                        UInt16 pointY = BitConverter.ToUInt16(dataArray, l_nIndex + 2);
                        l_lstPoints.Add(new Point((int)pointX, (int)pointY));
                        l_nIndex += 4;
                    }
                }
Was dit nuttig?

Oplossing

RectL Voorwerp:

public static Rectangle ReadRectangle32(this BinaryReader reader)
{
    // Left (4 bytes)
    int left = reader.ReadInt32();

    // Top (4 bytes)
    int top = reader.ReadInt32();

    // Right (4 bytes)
    int right = reader.ReadInt32();

    // Bottom (4 bytes)
    int bottom = reader.ReadInt32();

    return Rectangle.FromLTRB(left, top, right, bottom);
}

PointS Voorwerp:

public static Point ReadPoint16(this BinaryReader reader)
{
    // x (2 bytes)
    int x = reader.ReadUInt16();

    // y (2 bytes)
    int y = reader.ReadUInt16();

    return new Point(x, y);
}

EMR_POLYPOLYGON16 Rekord (sonder tipe en grootte):

public static PolyPolygon ReadPolyPolygon16(this BinaryReader reader)
{
    // Bounds (16 bytes)
    Rectangle bounds = reader.ReadRectangle32();

    // NumberOfPolygons (4 bytes)
    int numberOfPolygons = reader.ReadInt32();

    // Count (4 bytes)
    int count = reader.ReadInt32();

    // PolygonPointCount (variable):
    //      A NumberOfPolygons length array of 32-bit unsigned integers
    var polygonPointCount = new int[numberOfPolygons];
    for (int i = 0; i < polygonPointCount.Length; i++)
    {
        polygonPointCount[i] = reader.ReadInt32();
    }

    // aPoints (variable):
    //      A Count length array of WMF PointS objects
    var points = new Point[count];
    for (int i = 0; i < points.Length; i++)
    {
        points[i] = reader.ReadPoint16();
    }

    return new PolyPolygon(bounds, numberOfPolygons, polygonPointCount, points);
}

Gebruik:

byte[] buffer;
using (var stream = new MemoryStream(buffer))
using (var reader = new BinaryReader(stream))
{
    var polypolygon = reader.ReadPolyPolygon16();
}

(Ongetoets)

Ander wenke

Dit blyk die metode-handtekening van Windows GDI-funksie te wees (nie 'n tipe nie).Die tweede argument is 'n wyser na 'n verskeidenheid punte wat jy wil laat teken.Derde argument is 'n wyser na 'n reeks heelgetalle wat spesifiseer hoeveel punte daar in elke veelhoek is, en die laaste argument is die aantal veelhoeke.

Ek kon nie 'n Windows GDI-funksie presies met die naam PolyPolygon16 vind toe ek op Google gesoek het nie, maar ek het gevind hierdie.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top