IXpsOMGeometryFigure::GetSegmentData メソッド (xpsobjectmodel.h)
ジオメトリ図形のセグメント データ ポイントを取得します。
構文
HRESULT GetSegmentData(
[in, out] UINT32 *dataCount,
[in, out] FLOAT *segmentData
);
パラメーター
[in, out] dataCount
segmentData パラメーターによって参照される配列のサイズ。
メソッドが正常に返された場合、 dataCount には 、segmentData によって参照される配列で返される要素の数が含まれます。
メソッドの呼び出し時に segmentData が NULL に設定されている場合は、 dataCount を 0 に設定する必要があります。
segmentData で NULL ポインターが返された場合、dataCount には要素の数として必要なバッファー サイズが含まれます。
[in, out] segmentData
dataCount で指定されたのと同じ数の要素を持つ配列のアドレス。 呼び出し元が dataCount で必要なバッファー サイズのみを返す必要がある場合は、この値を NULL に設定できます。
配列が十分な大きさの場合、このメソッドはセグメント データ ポイントを配列にコピーし、コピーされたデータ ポイントの数を dataCount で返します。 segmentData が NULL に設定されているか、十分な大きさではないバッファーを参照している場合、NULL ポインターが返され、データはコピーされず、dataCount には要素の数として指定された必要なバッファー サイズが含まれます。
戻り値
このメソッドは HRESULT を返します。 使用可能な値には、次の表に含まれる値が含まれますが、これらに限定されません。 この表に記載されていない XPS ドキュメント API の戻り値については、「 XPS ドキュメント エラー」を参照してください。
リターン コード | 説明 |
---|---|
|
メソッドが成功しました。 |
|
dataCount は NULL です。 |
|
segmentData が NULL であるか、セグメント データを受信するのに十分な大きさではないバッファーを参照します。 dataCount には、必要な数の要素が含まれています。 |
注釈
このメソッドを呼び出す前にセグメント データ配列の必要なサイズを確認するには、 GetSegmentDataCount を呼び出します。
ジオメトリ セグメントは、始点、セグメントタイプ、およびセグメントタイプによって値が決定される追加パラメータによって記述されます。 最初のセグメントの始点の座標はジオメトリ図形のプロパティであり、 SetStartPoint を呼び出すことによって設定されます。 後続の各セグメントの始点は、前のセグメントの終点です。
segmentData パラメーターで返される配列の値は、segmentTypes パラメーターの GetSegmentTypes メソッドによって返される配列のXPS_SEGMENT_TYPE値に対応します。 セグメント データ値を正しく読み取るために、ジオメトリ図の各セグメントの種類を把握しておく必要があります。 たとえば、最初の線分のセグメントの種類の値が XPS_SEGMENT_TYPE_LINEの場合、 segmentData 配列の最初の 2 つのデータ値は、そのセグメントの終点の x 座標と y 座標になります。次のセグメントのセグメントの種類の値が XPS_SEGMENT_TYPE_BEZIER の場合、 segmentData 配列内の次の 6 つの値はそのセグメントの特性を表します。ジオメトリ図の各線分に対して などです。
次の表では、各セグメントの種類に対して返される特定のデータ値のセットについて説明します。 プログラムでこのデータにアクセスする方法の例については、次のコード例を参照してください。
セグメントの種類 | 必要なデータ値 |
---|---|
XPS_SEGMENT_TYPE_LINE |
2 つのデータ値:
|
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE |
5 つのデータ値:
|
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE |
5 つのデータ値:
|
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE |
5 つのデータ値:
|
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE |
5 つのデータ値:
|
XPS_SEGMENT_TYPE_BEZIER |
6 つのデータ値:
|
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER |
4 つのデータ値:
|
次のコード例では、ジオメトリ図の各セグメント タイプのさまざまなデータ ポイントにアクセスします。
// 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;
要件
サポートされている最小のクライアント | Windows 7、Windows Vista SP2 と Windows Vista 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 R2、Windows Server 2008 SP2 および Windows Server 2008 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | xpsobjectmodel.h |