IXpsOMGeometryFigure::GetSegmentData-Methode (xpsobjectmodel.h)
Ruft die Segmentdatenpunkte für die Geometriefigur ab.
Syntax
HRESULT GetSegmentData(
[in, out] UINT32 *dataCount,
[in, out] FLOAT *segmentData
);
Parameter
[in, out] dataCount
Die Größe des Arrays, auf das vom segmentData-Parameter verwiesen wird.
Wenn die Methode erfolgreich zurückgibt, enthält dataCount die Anzahl der Elemente, die in dem Array zurückgegeben werden, auf das von segmentData verwiesen wird.
Wenn segmentData auf NULL festgelegt ist, wenn die Methode aufgerufen wird, muss dataCount auf 0 festgelegt werden.
Wenn ein NULL-Zeiger in segmentData zurückgegeben wird, enthält dataCount die erforderliche Puffergröße als Anzahl von Elementen.
[in, out] segmentData
Die Adresse eines Arrays, das die gleiche Anzahl von Elementen wie in dataCount angegeben hat. Dieser Wert kann auf NULL festgelegt werden, wenn der Aufrufer erfordert, dass die Methode nur die erforderliche Puffergröße in dataCount zurückgibt.
Wenn das Array groß genug ist, kopiert diese Methode die Segmentdatenpunkte in das Array und gibt in dataCount die Anzahl der kopierten Datenpunkte zurück. Wenn segmentData auf NULL festgelegt ist oder auf einen Puffer verweist, der nicht groß genug ist, wird ein NULL-Zeiger zurückgegeben, es werden keine Daten kopiert, und dataCount enthält die erforderliche Puffergröße, die als Anzahl von Elementen angegeben ist.
Rückgabewert
Die Methode gibt ein HRESULT zurück. Mögliche Werte sind unter anderem diejenigen in der folgenden Tabelle. Informationen zu Rückgabewerten der XPS-Dokument-API, die in dieser Tabelle nicht aufgeführt sind, finden Sie unter XPS-Dokumentfehler.
Rückgabecode | Beschreibung |
---|---|
|
Die Methode wurde erfolgreich ausgeführt. |
|
dataCount ist NULL. |
|
segmentData ist NULL oder verweist auf einen Puffer, der nicht groß genug ist, um die Segmentdaten zu empfangen. dataCount enthält die erforderliche Anzahl von Elementen. |
Hinweise
Rufen Sie GetSegmentDataCount auf, um die erforderliche Größe des Segmentdatenarrays vor dem Aufrufen dieser Methode zu bestimmen.
Ein Geometriesegment wird durch den Startpunkt, den Segmenttyp und zusätzliche Parameter beschrieben, deren Werte durch den Segmenttyp bestimmt werden. Die Koordinaten für den Startpunkt des ersten Segments sind eine Eigenschaft der Geometriefigur und werden durch Aufrufen von SetStartPoint festgelegt. Der Startpunkt jedes nachfolgenden Segments ist der Endpunkt des vorherigen Segments.
Die Werte im Array, das im segmentData-Parameter zurückgegeben wird, entsprechen den XPS_SEGMENT_TYPE Werten im Array, die von der GetSegmentTypes-Methode im segmentTypes-Parameter zurückgegeben werden. Um die Segmentdatenwerte richtig zu lesen, müssen Sie den Typ der einzelnen Segmente in der Geometriefigur kennen. Wenn das erste Zeilensegment beispielsweise den Segmenttypwert XPS_SEGMENT_TYPE_LINE aufweist, sind die ersten beiden Datenwerte im segmentData-Array die x- und y-Koordinaten des Endpunkts dieses Segments. Wenn das nächste Segment den Segmenttypwert XPS_SEGMENT_TYPE_BEZIER hat, beschreiben die nächsten sechs Werte im segmentData-Array die Merkmale dieses Segments. usw. für jedes Liniensegment in der Geometriefigur.
Die folgende Tabelle beschreibt den spezifischen Satz von Datenwerten, die für jeden Segmenttyp zurückgegeben werden. Ein Beispiel für den Zugriff auf diese Daten in einem Programm finden Sie im folgenden Codebeispiel.
Segmenttyp | Erforderliche Datenwerte |
---|---|
XPS_SEGMENT_TYPE_LINE |
Zwei Datenwerte:
|
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE |
Fünf Datenwerte:
|
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE |
Fünf Datenwerte:
|
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE |
Fünf Datenwerte:
|
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE |
Fünf Datenwerte:
|
XPS_SEGMENT_TYPE_BEZIER |
Sechs Datenwerte:
|
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER |
Vier Datenwerte:
|
Im folgenden Codebeispiel wird auf die verschiedenen Datenpunkte der einzelnen Segmenttypen in einer Geometriefigur zugegriffen.
// 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;
Anforderungen
Unterstützte Mindestversion (Client) | Windows 7, Windows Vista mit SP2 und Plattformupdate für Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2008 R2, Windows Server 2008 mit SP2 und Plattformupdate für Windows Server 2008 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | xpsobjectmodel.h |