IXpsOMGeometryFigure
COM公式ドキュメント
IXpsOMGeometry インターフェースで指定されるパスまたはクリッピング領域の一部分を記述します。
解説(Remarks)
IXpsOMGeometryFigure は、XPS マークアップの PathFigure 要素に対応します。
次のコード例は、このインターフェースのインスタンスを作成する方法を示しています。
IXpsOMGeometryFigure *newInterface;
// startPoint contains the starting point
// of the geometry figure being created
XPS_POINT startPoint = {0,0};
// Note the implicit requirement that CoInitializeEx
// has previously been called from this thread.
hr = CoCreateInstance(
__uuidof(XpsOMObjectFactory),
NULL,
CLSCTX_INPROC_SERVER,
_uuidof(IXpsOMObjectFactory),
reinterpret_cast<LPVOID*>(&xpsFactory)
);
if (SUCCEEDED(hr))
{
hr = xpsFactory->CreateGeometryFigure (&startPoint, &newInterface);
if (SUCCEEDED(hr))
{
// use newInterface
newInterface->Release();
}
xpsFactory->Release();
}
else
{
// evaluate HRESULT error returned in hr
}
メソッド 15
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ジオメトリフィギュアを含む IXpsOMGeometry インターフェースへのポインターを取得します。
| owner | IXpsOMGeometry** | out | ジオメトリフィギュアを含む IXpsOMGeometry インターフェースへのポインターです。このインターフェースがジオメトリに割り当てられていない場合は、NULL ポインターが返されます。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| owner が NULL です。 |
ジオメトリフィギュアのセグメントデータポイントを取得します。
| dataCount | DWORD* | inout | segmentData パラメーターが参照する配列のサイズです。 メソッドが正常に返された場合、dataCount には segmentData が参照する配列に返された要素数が格納されます。 メソッドの呼び出し時に segmentData を NULL に設定する場合は、dataCount を 0 に設定する必要があります。 segmentData に NULL ポインターが返された場合、dataCount には必要なバッファーサイズが要素数として格納されます。 |
| segmentData | FLOAT* | inout | dataCount で指定した数と同じ要素数を持つ配列のアドレスです。必要なバッファーサイズのみを dataCount に返させたい場合は、この値を NULL に設定できます。 配列が十分な大きさである場合、このメソッドはセグメントデータポイントを配列にコピーし、コピーしたデータポイントの数を dataCount に返します。segmentData が NULL に設定されているか、十分な大きさでないバッファーを参照している場合は、NULL ポインターが返され、データはコピーされず、dataCount には必要なバッファーサイズが要素数として格納されます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。この表に記載されていない XPS ドキュメント API の戻り値については、XPS ドキュメントのエラー を参照してください。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| dataCount が NULL です。 | |
| segmentData が NULL であるか、セグメントデータを受け取るのに十分な大きさでないバッファーを参照しています。dataCount には必要な要素数が格納されます。 |
解説(Remarks)
このメソッドを呼び出す前にセグメントデータ配列の必要なサイズを確認するには、GetSegmentDataCount を呼び出します。
ジオメトリセグメントは、開始点、セグメントの種類、およびセグメントの種類によって値が決まる追加のパラメーターによって記述されます。最初のセグメントの開始点の座標はジオメトリフィギュアのプロパティであり、SetStartPoint を呼び出して設定します。以降の各セグメントの開始点は、直前のセグメントの終了点になります。
segmentData パラメーターに返される配列内の値は、GetSegmentTypes メソッドが segmentTypes パラメーターに返す配列内の 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;
フィギュア内のセグメントの種類を取得します。
| segmentCount | DWORD* | inout | segmentTypes(後述)が参照する配列のサイズです。このパラメーターを NULL にすることはできません。 メソッドが正常に返された場合、segmentCount には segmentTypes が参照する配列に返された要素数が格納されます。 メソッドの呼び出し時に segmentTypes が NULL の場合は、segmentCount を 0 に設定する必要があります。 segmentTypes に NULL ポインターが返された場合、segmentCount の値には必要なバッファーサイズが要素数として格納されます。 |
| segmentTypes | XPS_SEGMENT_TYPE* | inout | segmentCount で指定した数と同じ要素数を持つ XPS_SEGMENT_TYPE 値の配列です。必要なバッファーサイズのみを返させたい場合は、この値を NULL に設定します。 配列が十分な大きさである場合、このメソッドは XPS_SEGMENT_TYPE 値を配列にコピーし、コピーした値の数を segmentCount に返します。segmentTypes が NULL であるか、十分な大きさでないバッファーを参照している場合は、NULL ポインターが返され、データはコピーされず、segmentCount には必要なバッファーサイズが要素数として格納されます。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| segmentCount が NULL です。 | |
| segmentTypes が NULL であるか、XPS_SEGMENT_TYPE のデータを受け取るのに十分な大きさでないバッファーを参照しています。segmentCount には必要な要素数が格納されます。 |
解説(Remarks)
プログラムでこのメソッドを使用する方法の例については、GetSegmentData のコード例を参照してください。
フィギュアのセグメントのストローク定義を取得します。
| segmentCount | DWORD* | inout | segmentStrokes が参照する配列のサイズです。このパラメーターを NULL にすることはできません。 メソッドが正常に返された場合、segmentCount には segmentStrokes が参照する配列に返された要素数が格納されます。 メソッドの呼び出し時に segmentStrokes が NULL の場合は、segmentCount を 0 に設定する必要があります。 segmentStrokes に NULL ポインターが返された場合、segmentCount の値には必要なバッファーサイズが要素数として格納されます。 | ||||||
| segmentStrokes | BOOL* | inout | segmentCount で指定した数と同じ要素数を持つ配列です。このメソッドに必要なバッファーサイズのみを返させたい場合は、この値を NULL に設定します。 配列が十分な大きさである場合、このメソッドはセグメントストロークの値を配列にコピーし、コピーしたセグメントストロークの値の数を segmentCount に返します。segmentData が NULL であるか、十分な大きさでないバッファーを参照している場合は、NULL ポインターが返され、データはコピーされず、segmentCount には必要なバッファーサイズが要素数として格納されます。 次の表は、segmentStrokes が参照する配列の要素が取り得る値を示しています。
|
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| segmentCount が NULL です。 | |
| segmentStrokes が NULL であるか、セグメントストロークのデータを受け取るのに十分な大きさでないバッファーを参照しています。segmentCount には必要な要素数が格納されます。 |
フィギュア内のセグメントについて、セグメント情報とデータポイントを設定します。
| segmentCount | DWORD | in | セグメントの数です。 この値は、segmentTypes と segmentStrokes が参照する配列の要素数でもあります。 |
| segmentDataCount | DWORD | in | セグメントデータポイントの数です。 この値は、segmentData が参照する配列の要素数でもあります。 |
| segmentTypes | XPS_SEGMENT_TYPE* | in | XPS_SEGMENT_TYPE 変数の配列です。この配列の要素数は segmentCount の値で指定します。 |
| segmentData | FLOAT* | in | セグメントデータ値の配列です。この配列の要素数は segmentDataCount の値で指定します。 |
| segmentStrokes | BOOL* | in | セグメントストローク値の配列です。この配列の要素数は segmentCount の値で指定します。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。この表に記載されていない XPS ドキュメント API の戻り値については、XPS ドキュメントのエラー を参照してください。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
segmentTypes に認識できない種類の値が含まれています。
または、segmentData 配列のエントリ数が segmentTypes 配列のエントリ数より多くなっています。 |
|
| segmentTypes、segmentData、または segmentStrokes が NULL です。 | |
| segmentData に、無限大または非数 (NAN) の FLOAT 値が含まれています。 | |
| segmentData に渡された配列のエントリ数が、segmentTypes に渡された配列のエントリ数より少なくなっています。 | |
| segmentData に渡された配列のエントリに負の値が含まれていますが、非負の値でなければなりません。 |
解説(Remarks)
ジオメトリセグメントは、開始点、セグメントの種類、およびセグメントの種類によって値が決まる追加のパラメーターによって記述されます。最初のセグメントの開始点の座標はジオメトリフィギュアのプロパティであり、SetStartPoint を呼び出して設定します。以降の各セグメントの開始点は、直前のセグメントの終了点になります。
線分を定義するデータ値の個数は、セグメントの種類によって異なります。次の表は、セグメントの種類ごとに使用しなければならないデータ値の具体的な組み合わせを示しています。segmentData パラメーターに渡すセグメントデータ配列内の値は、segmentTypes パラメーターに渡す配列内の 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 つのデータ値:
|
フィギュア内のセグメントの種類を取得するには、GetSegmentTypes を呼び出します。
次のコード例は、SetSegments に必要なバッファーを作成して値を格納する方法の一例を示しています。
最初のコード例では、AddSegmentDataToArrays メソッドが 1 つのセグメントを記述するデータポイントを受け取り、SetSegments メソッドに必要な 3 種類のデータバッファーに格納します。AddSegmentDataToArrays に引数として渡すデータバッファーは、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;
}
次のコード例では、UpdateSegmentData が SetSegments メソッドに必要なデータバッファーを作成し、前のコード例の AddSegmentDataToArrays メソッドを呼び出してセグメントデータを格納します。バッファーへの格納が完了した後、SetSegments を呼び出してそのデータをジオメトリフィギュアに追加します。
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;
}
フィギュアの開始点を取得します。
| startPoint | XPS_POINT* | out | フィギュアの開始点の座標です。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| startPoint が NULL です。 |
解説(Remarks)
ドキュメントのマークアップにおいて、startPoint に返される値は PathFigure 要素の StartPoint 属性の値に対応します。
フィギュアの開始点を設定します。
| startPoint | XPS_POINT* | in | フィギュアの開始点の座標です。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。この表に記載されていない XPS ドキュメント API の戻り値については、XPS ドキュメントのエラー を参照してください。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| startPoint が NULL です。 | |
| startPoint に渡された XPS_POINT 構造体のいずれかのフィールドに、有効でない値が含まれています。 |
フィギュアが閉じているかどうかを示す値を取得します。
| isClosed | BOOL* | out | フィギュアが閉じているかどうかを示すブール値です。
|
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。この表に記載されていない XPS ドキュメント API の戻り値については、XPS ドキュメントのエラー を参照してください。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| isClosed が NULL です。 |
解説(Remarks)
この値は、ストロークを指定する Path 要素で PathFigure 属性が使用されている場合にのみ適用されます。
閉じたフィギュアでは、図形を閉じるためにフィギュアの開始点と終了点の間に線分が追加されます。
この値は、ドキュメントのマークアップにおける PathFigure 要素の IsClosed 要素の値に対応します。
フィギュアが閉じているかどうかを示す値を設定します。
| isClosed | BOOL | in | 設定する値です。
|
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
この値は、ストロークを指定する Path 要素で PathFigure 属性が使用されている場合にのみ適用されます。
閉じたフィギュアでは、図形を閉じるためにフィギュアの開始点と終了点の間に線分が追加されます。
この値は、ドキュメントのマークアップにおける PathFigure 要素の IsClosed 要素の値に対応します。
フィギュアが塗りつぶされるかどうかを示す値を取得します。
| isFilled | BOOL* | out | フィギュアが塗りつぶされるかどうかを示すブール値です。
|
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| isFilled が NULL です。 |
解説(Remarks)
この値は、ドキュメントのマークアップにおける PathFigure 要素の IsFilled 属性の値に対応します。
フィギュアが塗りつぶされるかどうかを示す値を設定します。
| isFilled | BOOL | in | 設定する値です。
|
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
ドキュメントのマークアップにおいて、isFilled に返される値は PathFigure 要素の IsFilled 属性の値に対応します。
フィギュア内のセグメントの数を取得します。
| segmentCount | DWORD* | out | フィギュア内のセグメントの数です。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| segmentCount が NULL です。 |
解説(Remarks)
プログラムでこのメソッドを使用する方法の例については、GetSegmentData のコード例を参照してください。
フィギュア内のセグメントデータポイントの数を取得します。
| segmentDataCount | DWORD* | out | セグメントデータポイントの数です。メソッドの呼び出し時に segmentDataCount を NULL にすることはできません。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| segmentDataCount が NULL です。 |
解説(Remarks)
セグメントデータポイントを取得するには、GetSegmentData を呼び出します。
プログラムでこのメソッドを使用する方法の例については、GetSegmentData のコード例を参照してください。
フィギュア内のセグメントがストロークされるかどうかを示す XPS_SEGMENT_STROKE_PATTERN 値を取得します。
| segmentStrokePattern | XPS_SEGMENT_STROKE_PATTERN* | out | フィギュア内のセグメントがストロークされるかどうかを示す XPS_SEGMENT_STROKE_PATTERN 値です。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| segmentStrokePattern が NULL です。 |
インターフェースのディープコピーを作成します。(IXpsOMGeometryFigure.Clone)
| geometryFigure | IXpsOMGeometryFigure** | out | コピーされたインターフェースへのポインターです。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
| 戻り値のコード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| この操作を実行するのに十分なメモリがありません。 | |
| geometryFigure が NULL です。 |
解説(Remarks)
コピーの所有者は NULL です。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IXpsOMGeometryFigure "{D410DC83-908C-443E-8947-B1795D3C165A}" #usecom global IXpsOMGeometryFigure IID_IXpsOMGeometryFigure "{}" #comfunc global IXpsOMGeometryFigure_GetOwner 3 sptr #comfunc global IXpsOMGeometryFigure_GetSegmentData 4 var,var #comfunc global IXpsOMGeometryFigure_GetSegmentTypes 5 var,var #comfunc global IXpsOMGeometryFigure_GetSegmentStrokes 6 var,var #comfunc global IXpsOMGeometryFigure_SetSegments 7 int,int,var,var,var #comfunc global IXpsOMGeometryFigure_GetStartPoint 8 var #comfunc global IXpsOMGeometryFigure_SetStartPoint 9 var #comfunc global IXpsOMGeometryFigure_GetIsClosed 10 var #comfunc global IXpsOMGeometryFigure_SetIsClosed 11 int #comfunc global IXpsOMGeometryFigure_GetIsFilled 12 var #comfunc global IXpsOMGeometryFigure_SetIsFilled 13 int #comfunc global IXpsOMGeometryFigure_GetSegmentCount 14 var #comfunc global IXpsOMGeometryFigure_GetSegmentDataCount 15 var #comfunc global IXpsOMGeometryFigure_GetSegmentStrokePattern 16 var #comfunc global IXpsOMGeometryFigure_Clone 17 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IXpsOMGeometryFigure "{D410DC83-908C-443E-8947-B1795D3C165A}" #usecom global IXpsOMGeometryFigure IID_IXpsOMGeometryFigure "{}" #comfunc global IXpsOMGeometryFigure_GetOwner 3 sptr #comfunc global IXpsOMGeometryFigure_GetSegmentData 4 sptr,sptr #comfunc global IXpsOMGeometryFigure_GetSegmentTypes 5 sptr,sptr #comfunc global IXpsOMGeometryFigure_GetSegmentStrokes 6 sptr,sptr #comfunc global IXpsOMGeometryFigure_SetSegments 7 int,int,sptr,sptr,sptr #comfunc global IXpsOMGeometryFigure_GetStartPoint 8 sptr #comfunc global IXpsOMGeometryFigure_SetStartPoint 9 sptr #comfunc global IXpsOMGeometryFigure_GetIsClosed 10 sptr #comfunc global IXpsOMGeometryFigure_SetIsClosed 11 int #comfunc global IXpsOMGeometryFigure_GetIsFilled 12 sptr #comfunc global IXpsOMGeometryFigure_SetIsFilled 13 int #comfunc global IXpsOMGeometryFigure_GetSegmentCount 14 sptr #comfunc global IXpsOMGeometryFigure_GetSegmentDataCount 15 sptr #comfunc global IXpsOMGeometryFigure_GetSegmentStrokePattern 16 sptr #comfunc global IXpsOMGeometryFigure_Clone 17 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。