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 |
---|---|
|
Metode berhasil. |
|
dataCount ADALAH NULL. |
|
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 ![]() |
Dua nilai data:
|
![]() |
Lima nilai data:
|
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE ![]() |
Lima nilai data:
|
![]() |
Lima nilai data:
|
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE ![]() |
Lima nilai data:
|
XPS_SEGMENT_TYPE_BEZIER ![]() |
Enam nilai data:
|
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER ![]() |
Empat nilai data:
|
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk