Bagikan melalui


Metode IXpsOMGeometryFigure::GetSegmentData (xpsobjectmodel.h)

Mendapatkan titik data segmen untuk gambar geometri.

Sintaks

HRESULT GetSegmentData(
  [in, out] UINT32 *dataCount,
  [in, out] FLOAT  *segmentData
);

Parameter

[in, out] dataCount

Ukuran array yang dirujuk oleh parameter segmentData .

Jika metode berhasil dikembalikan, dataCount akan berisi jumlah elemen yang dikembalikan dalam array yang direferensikan oleh segmentData.

Jika segmentData diatur ke NULL saat metode dipanggil, dataCount harus diatur ke nol.

Jika penunjuk NULL dikembalikan di segmentData, dataCount akan berisi ukuran buffer yang diperlukan sebagai jumlah elemen.

[in, out] segmentData

Alamat array yang memiliki jumlah elemen yang sama seperti yang ditentukan dalam dataCount. Nilai ini dapat diatur ke NULL jika pemanggil mengharuskan metode hanya mengembalikan ukuran buffer yang diperlukan dalam dataCount.

Jika array cukup besar, metode ini menyalin titik data segmen ke dalam array dan mengembalikan, di dataCount, jumlah titik data yang disalin. Jika segmentData diatur ke NULL atau mereferensikan buffer yang tidak cukup besar, penunjuk NULL akan dikembalikan, tidak ada data yang akan disalin, dan dataCount akan berisi ukuran buffer yang diperlukan yang ditentukan sebagai jumlah elemen.

Nilai kembali

Metode mengembalikan HRESULT. Nilai yang mungkin termasuk, tetapi tidak terbatas pada, yang ada dalam tabel berikut. Untuk informasi tentang nilai pengembalian API dokumen XPS yang tidak tercantum dalam tabel ini, lihat Kesalahan Dokumen XPS.

Menampilkan kode Deskripsi
S_OK
Metode berhasil.
E_POINTER
dataCount ADALAH NULL.
ERROR_MORE_DATA
segmentData adalah NULL atau mereferensikan buffer yang tidak cukup besar untuk menerima data segmen. dataCount berisi jumlah elemen yang diperlukan.

Keterangan

Untuk menentukan ukuran array data segmen yang diperlukan sebelum memanggil metode ini, panggil GetSegmentDataCount.

Segmen geometri dijelaskan oleh titik awal, jenis segmen, dan parameter tambahan yang nilainya ditentukan oleh jenis segmen. Koordinat untuk titik awal segmen pertama adalah properti dari gambar geometri dan diatur dengan memanggil SetStartPoint. Titik awal dari setiap segmen berikutnya adalah titik akhir dari segmen sebelumnya.

Nilai dalam array yang dikembalikan dalam parameter segmentData akan sesuai dengan nilai XPS_SEGMENT_TYPE dalam array yang dikembalikan oleh metode GetSegmentTypes dalam parameter segmentTypes . Untuk membaca nilai data segmen dengan benar, Anda harus mengetahui jenis setiap segmen dalam gambar geometri. Misalnya, jika segmen baris pertama memiliki nilai jenis segmen XPS_SEGMENT_TYPE_LINE, dua nilai data pertama dalam array segmentData akan menjadi koordinat x dan y dari titik akhir segmen tersebut; jika segmen berikutnya memiliki nilai jenis segmen XPS_SEGMENT_TYPE_BEZIER, enam nilai berikutnya dalam array segmentData akan menjelaskan karakteristik segmen tersebut; dan sebagainya untuk setiap segmen garis dalam gambar geometri.

Tabel berikut ini menjelaskan kumpulan nilai data tertentu yang dikembalikan untuk setiap jenis segmen. Untuk contoh cara mengakses data ini dalam program, lihat contoh kode berikut.

Jenis segmen Nilai data yang diperlukan
XPS_SEGMENT_TYPE_LINE Diagram yang memperlihatkan contoh segmen gambar XPS_SEGMENT_TYPE_LINE Dua nilai data:
koordinat x titik akhir garis segmen.
koordinat y dari titik akhir garis segmen.
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE Diagram segmen gambar XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE. Lima nilai data:
koordinat x titik akhir busur.
koordinat y titik akhir busur.
Panjang radius elips di sepanjang sumbu x.
Panjang radius elips di sepanjang sumbu y.
Sudut rotasi.
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Diagram yang memperlihatkan contoh segmen gambar XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE Lima nilai data:
koordinat x titik akhir busur.
koordinat y titik akhir busur.
Panjang radius elips di sepanjang sumbu x.
Panjang radius elips di sepanjang sumbu y.
Sudut rotasi.
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE Diagram segmen gambar XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE. Lima nilai data:
koordinat x titik akhir busur.
koordinat y titik akhir busur.
Panjang radius elips di sepanjang sumbu x.
Panjang radius elips di sepanjang sumbu y.
Sudut rotasi.
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Diagram yang memperlihatkan contoh segmen gambar XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE Lima nilai data:
koordinat x titik akhir busur.
koordinat y titik akhir busur.
Panjang radius elips di sepanjang sumbu x.
Panjang radius elips di sepanjang sumbu y.
Sudut rotasi.
XPS_SEGMENT_TYPE_BEZIER Diagram yang memperlihatkan contoh segmen gambar XPS_SEGMENT_TYPE_BEZIER Enam nilai data:
koordinat x dari titik kontrol pertama kurva Bezier.
koordinat y dari titik kontrol pertama kurva Bezier.
koordinat x dari titik kontrol kedua kurva Bezier.
koordinat y dari titik kontrol kedua kurva Bezier.
koordinat x titik akhir kurva Bezier.
Koordinat y dari titik akhir kurva Bezier.
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Diagram yang memperlihatkan contoh segmen gambar XPS_SEGMENT_TYPE_QUADRATIC_BEZIER Empat nilai data:
koordinat x dari titik kontrol kurva Quad Bezier.
Koordinat y dari titik kontrol kurva Quad Bezier.
koordinat x dari titik akhir kurva Quad Bezier.
Koordinat y dari titik akhir kurva Quad Bezier.
 

Contoh kode berikut mengakses titik data yang berbeda dari setiap jenis segmen dalam gambar geometri.

    // currentFigure is the pointer to an IXpsOMGeometryFigure
    // that contains the segment data to examine

    HRESULT             hr = S_OK;
    UINT32              numSegments = 0;
    UINT32              numSegmentDataPoints = 0;
    XPS_SEGMENT_TYPE    *segmentTypes = NULL;
    FLOAT               *segmentDataPoints = NULL;
    BOOL                *segmentStrokes = NULL;

    // get number of segments in this figure
    hr = currentFigure->GetSegmentCount (&numSegments);

    if (SUCCEEDED(hr))
    {
        // allocate array for segment data types
        segmentTypes = new (std::nothrow) XPS_SEGMENT_TYPE[numSegments];
        if (segmentTypes == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // allocate array for segment strokes
        segmentStrokes = new (std::nothrow) BOOL[numSegments];
        if (segmentStrokes == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // get array of segment data types
        hr = currentFigure->GetSegmentTypes (&numSegments, segmentTypes);
    }

    if (SUCCEEDED(hr))
    {
        // get size of segment data array
        hr = currentFigure->GetSegmentDataCount (&numSegmentDataPoints);
    }

    if (SUCCEEDED(hr))
    {
        // get array to hold segment data points
        segmentDataPoints = new (std::nothrow) FLOAT[numSegmentDataPoints];
        if (segmentDataPoints == NULL) { hr = E_OUTOFMEMORY; }
    }

    if (SUCCEEDED(hr))
    {
        // get segment data points
        hr = currentFigure->GetSegmentData (
            &numSegmentDataPoints, segmentDataPoints);
    }

    if (SUCCEEDED(hr))
    {
        // process segment data
        UINT32           thisSegment = 0;
        XPS_SEGMENT_TYPE *thisSegmentType = segmentTypes;
        XPS_SEGMENT_TYPE *lastSegmentType = NULL;
        FLOAT            *thisSegmentDataPoint = segmentDataPoints;
        FLOAT            *lastSegmentsDataPoint = NULL;

        // points to element just after valid array
        // valid pointers are < this value and  >= &segmentTypes[0]
        lastSegmentType = &segmentTypes[numSegments]; 
        // points to element just after valid array
        // valid pointers are < this value and >= &segmentDataPoints[0]
        lastSegmentsDataPoint = &segmentDataPoints[numSegmentDataPoints];

        // look at each segment that was returned
        while (thisSegment < numSegments)
        {
            if ((thisSegmentType >= lastSegmentType) || 
                (thisSegmentDataPoint >= lastSegmentsDataPoint))
            {
                // the array data is not correct.
                hr = E_UNEXPECTED;
                break; // out of loop
            } 
            else
            {
                // process the data based on the segment type
                switch (*thisSegmentType) 
                {
                    case    XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE:
                    case    XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE:
                    case    XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE:
                    case    XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE:
                        {
                        // 5 data points
                        FLOAT    arcEndPoint_x = *thisSegmentDataPoint++;
                        FLOAT    arcEndPoint_y = *thisSegmentDataPoint++;
                        FLOAT    radius_x = *thisSegmentDataPoint++;
                        FLOAT    radius_y = *thisSegmentDataPoint++;
                        FLOAT    angle = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_BEZIER:
                        {
                        // 6 data points
                        FLOAT    controlPoint1_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint1_y = *thisSegmentDataPoint++;
                        FLOAT    controlPoint2_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint2_y = *thisSegmentDataPoint++;
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_LINE:
                        {
                        // 2 data points
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    case    XPS_SEGMENT_TYPE_QUADRATIC_BEZIER:
                        {
                        // 4 data points
                        FLOAT    controlPoint_x = *thisSegmentDataPoint++;
                        FLOAT    controlPoint_y = *thisSegmentDataPoint++;
                        FLOAT    endPoint_x = *thisSegmentDataPoint++;
                        FLOAT    endPoint_y = *thisSegmentDataPoint++;
                        // do something with these points
                        }
                        break;
                    default:
                        // unrecognized segment type
                        break;
                }
                // 
                thisSegment++;
                thisSegmentType++;
            }
        }
    }

    delete[] segmentTypes; segmentTypes = NULL;
    delete[] segmentStrokes; segmentStrokes = NULL;
    delete[] segmentDataPoints; segmentDataPoints = NULL;

Persyaratan

   
Klien minimum yang didukung Windows 7, Windows Vista dengan SP2 dan Pembaruan Platform untuk Windows Vista [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2008 R2, Windows Server 2008 dengan SP2 dan Pembaruan Platform untuk Windows Server 2008 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header xpsobjectmodel.h

Lihat juga

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

Spesifikasi Kertas XML

Kesalahan Dokumen XPS