Bagikan melalui


Metode IXpsOMGeometryFigure::SetSegments (xpsobjectmodel.h)

Mengatur informasi segmen dan titik data untuk segmen dalam gambar.

Sintaks

HRESULT SetSegments(
  [in] UINT32                 segmentCount,
  [in] UINT32                 segmentDataCount,
  [in] const XPS_SEGMENT_TYPE *segmentTypes,
  [in] const FLOAT            *segmentData,
  [in] const BOOL             *segmentStrokes
);

Parameter

[in] segmentCount

Jumlah segmen.

Nilai ini juga merupakan jumlah elemen dalam array yang dirujuk oleh segmentTypes dan segmentStrokes.

[in] segmentDataCount

Jumlah titik data segmen.

Nilai ini juga merupakan jumlah elemen dalam array yang dirujuk oleh segmentData.

[in] segmentTypes

Array variabel XPS_SEGMENT_TYPE . Nilai segmentCount menentukan jumlah elemen dalam array ini.

[in] segmentData

Array nilai data segmen. Nilai segmentDataCount menentukan jumlah elemen dalam array ini.

[in] segmentStrokes

Array nilai goresan segmen. Nilai segmentCount menentukan jumlah elemen dalam array ini.

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_INVALIDARG
segmentTypes berisi nilai jenis yang tidak dikenal.

Atau, jumlah entri dalam array segmenTData lebih besar dari jumlah entri dalam array segmentTypes .

E_POINTER
segmentTypes, segmentData, atau segmentStrokes adalah NULL.
XPS_E_INVALID_FLOAT
segmentData berisi nilai FLOAT yang tidak terbatas atau bukan angka (NAN).
XPS_E_MISSING_SEGMENT_DATA
Array yang diteruskan dalam segmentData memiliki lebih sedikit entri daripada array yang diteruskan dalam segmentTypes.
XPS_E_NEGATIVE_FLOAT
Entri dalam array yang diteruskan di segmentData berisi nilai negatif, tetapi harus berisi nilai non-negatif.

Keterangan

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 setiap segmen berikutnya adalah titik akhir dari segmen sebelumnya.

Jumlah nilai data yang menentukan segmen garis bergantung pada jenis segmen. Tabel berikut ini menjelaskan kumpulan nilai data tertentu yang diperlukan yang harus digunakan untuk setiap jenis segmen. Nilai dalam array data segmen yang diteruskan dalam parameter segmentData harus sesuai dengan nilai XPS_SEGMENT_TYPE dalam array yang diteruskan dalam parameter segmentTypes . Misalnya, jika segmen baris pertama memiliki nilai jenis segmen XPS_SEGMENT_TYPE_LINE, dua nilai data pertama dalam array segmenData 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 segmenData akan menjelaskan karakteristik segmen tersebut; dan sebagainya untuk setiap segmen garis dalam gambar geometri.

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 dari 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 dari 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 dari 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 dari 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 titik akhir kurva Quad Bezier.
koordinat y dari titik akhir kurva Quad Bezier.
 

Untuk mendapatkan jenis segmen dalam gambar, panggil GetSegmentTypes.

Contoh kode berikut menunjukkan salah satu cara untuk membuat dan mengisi buffer yang diperlukan oleh SetSegments.

Dalam contoh kode pertama, metode AddSegmentDataToArrays mengambil titik data yang menjelaskan satu segmen dan menyimpannya di tiga buffer data berbeda yang diperlukan oleh metode SetSegments . Buffer data yang diteruskan sebagai argumen ke AddSegmentDataToArrays dikelola oleh metode panggilan seperti yang ditunjukkan dalam contoh kode yang mengikuti AddSegmentDataToArrays.

HRESULT
AddSegmentDataToArrays(
    XPS_SEGMENT_TYPE        segmentType,
    BOOL                    segmentStroke,
    FLOAT                   *segmentPoints,
    UINT32                  *segmentsAvailable,
    UINT32                  *segmentPointsAvailable,
    XPS_SEGMENT_TYPE        **segmentTypeBuffer,
    BOOL                    **segmentStrokeBuffer,
    FLOAT                   **segmentPointBuffer
)
/*
Description:

Populates the buffers required by IXpsOMGeometryFigure::SetSegmentData
using data and buffers provided by the calling method.

Parameters:

segmentType
    IN: XPS_SEGMENT_TYPE value that specifies the segment type for
        the current segment.

segmentStroke
    IN: BOOL value that specifies whether the current segment 
        is stroked.

*segmentPoints
    IN: pointer to an array of FLOAT values that specify the 
        segment's data points. The number of values in the array
        depend on the value of the segmentType parameter.

*segmentsAvailable
    IN: the number of values that remain unused in the
        segmentTypeBuffer and the segmentStrokeBuffer.
        This value must be >= 1 when calling the method.
    OUT:  the number of values that remain unused in the
        segmentTypeBuffer and the segmentStrokeBuffer after
        segmentType and segmentStroke have been added. If the 
        method was successful, the returned value is one less 
        than the value passed in to the method.

*segmentPointsAvailable
    IN: the number of values that remain unused in the
        segmentPointBuffer.    This value must be greater-than or equal
        to the number of points required by the segmentType value.
    OUT:  the number of values that remain unused in the
        segmentPointBuffer after the segmentPoints have been added.
        The returned value depends on the segmentType value.

**segmentTypeBuffer
    IN: the first free element in the buffer that receives the segment
        type values.
    OUT: the first free element in the buffer that receives the segment
        type values. If the method is successful, this will be the element
        after the element pointed to by this value before the method 
        was called.

**segmentStrokeBuffer
    IN: the first free element in the buffer that receives the segment
        stroke values.
    OUT: the first free element in the buffer that receives the segment
        stroke values. If the method is successful, this will be the element
        after the element pointed to by this value before the method 
        was called.

**segmentPointBuffer
    IN: the first free element in the buffer that receives the segment
        point values.
    OUT: the first free element in the buffer that receives the segment
        point values. If the method is successful, the element referenced
        by this value will depend on the segment type.

Remarks.
1) the buffers and values passed into this method are managed by
    the calling method.

2) if the value returned in segmentsAvailable is 0, segmentTypeBuffer
    and segmentStrokeBuffer point to invalid memory.

3) if the value returned in segmentPointsAvailable is 0, segmentPointBuffer
    point to invalid memory.

*/
{
    HRESULT hr = S_OK;

    // test to see if there is sufficient space in the 
    // segmentTypeBuffer and the segmentStrokeBuffer before
    // proceeding
    if (*segmentsAvailable == 0)
    {
        hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
    }

    if (SUCCEEDED(hr))
    {
        // process the data based on the segment type
        switch (segmentType) 
        {
            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:
                if (*segmentPointsAvailable >= 5) 
                {
                    // 5 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc end point (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc radius (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc radius (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<arc angle
                    *segmentPointsAvailable -= 5;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_BEZIER:
                if (*segmentPointsAvailable >= 6) 
                {
                    // 6 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 1 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 1 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 6;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_LINE:
                if (*segmentPointsAvailable >= 2) 
                {
                    // 2 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 2;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            case    XPS_SEGMENT_TYPE_QUADRATIC_BEZIER:
                if (*segmentPointsAvailable >= 4) 
                {
                    // 4 data points
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<control point 2 (y)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (x)
                    *(*segmentPointBuffer)++ = *segmentPoints++; //<end point (y)
                    *segmentPointsAvailable -= 4;
                }
                else
                {
                    hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
                }
                break;
            default:
                // unrecognized segment type
                hr = E_UNEXPECTED;
                break;
        }

    }

    if (SUCCEEDED(hr))
    {
        // Copy segment type and segment stroke values
        // to array and decrement number of array values
        // that remain unused.
        //
        // The space available for these operations was
        // tested at the beginning of the method.
        *(*segmentTypeBuffer)++ = segmentType;
        *(*segmentStrokeBuffer)++ = segmentStroke;
        *segmentsAvailable--;
    } 

    return hr;
}

Dalam contoh kode ini, UpdateSegmentData membuat buffer data yang diperlukan oleh metode SetSegments dan memanggil metode AddSegmentDataToArrays dari contoh kode sebelumnya untuk mengisinya dengan data segmen. Setelah buffer diisi, SetSegments dipanggil untuk menambahkan data ini ke gambar geometri.

Catatan Data segmen aktual tidak ditampilkan dalam contoh kode ini.

 
HRESULT
UpdateSegmentData (
    IXpsOMGeometryFigure    *geometryFigure,
    UINT32                  segmentCount,
    UINT32                  segmentDataCount
)
/*
    Note that this method is not complete and only includes
    the code necessary to show how the SetSegments call is used.

    In this sample, the geometryFigure, segmentCount, and
    segmentDataCount values are assumed to have been initialized
    outside of this example.
*/
{
    HRESULT             hr = S_OK;
    XPS_SEGMENT_TYPE    segmentType = (XPS_SEGMENT_TYPE)0;
    BOOL                segmentStroke = FALSE;
    FLOAT               segmentPoints = 0;
    UINT32              segmentsAvailable = 0;
    UINT32              segmentPointsAvailable = 0;
    // these buffers are sized and allocated based on 
    //    the segment data to store.
    XPS_SEGMENT_TYPE    *segmentTypeBuffer = NULL;
    BOOL                *segmentStrokeBuffer = NULL;
    FLOAT               *segmentPointBuffer = NULL;

    XPS_SEGMENT_TYPE    *nextSegmentTypeValue = NULL;
    BOOL                *nextSegmentStrokeValue = NULL;
    FLOAT               *nextSegmentPointValue = NULL;

    // segment data is created outside of this example

    // allocate buffers as required using information 
    // from segment data. This can be dynamic or static
    // depending on how the segment information is managed.
    // This example assumes that the segment information 
    // does not change during this method.

    // initialize "next" pointers to point to the first
    // element in each array.
    nextSegmentTypeValue = segmentTypeBuffer;
    nextSegmentStrokeValue = segmentStrokeBuffer;
    nextSegmentPointValue = segmentPointBuffer;

    // for each segment in the figure, add the 
    // segment data to the buffers

        hr = AddSegmentDataToArrays(
                segmentType,
                segmentStroke,
                &segmentPoints,
                &segmentsAvailable,
                &segmentPointsAvailable,
                &nextSegmentTypeValue,
                &nextSegmentStrokeValue,
                &nextSegmentPointValue);
        
    if (SUCCEEDED(hr))
    {
        // set segment data
        hr = geometryFigure->SetSegments (
            segmentCount,
            segmentDataCount,
            segmentTypeBuffer,
            segmentPointBuffer,
            segmentStrokeBuffer);
    }
    // clean up buffers

    return hr;
}

Persyaratan

Persyaratan Nilai
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

GetSegmentTypes

IXpsOMGeometryFigure

Spesifikasi Kertas XML

Kesalahan Dokumen XPS

XPS_SEGMENT_TYPE