IXpsOMGeometryFigure::GetSegmentData 方法 (xpsobjectmodel.h)
取得幾何圖的區段資料點。
語法
HRESULT GetSegmentData(
[in, out] UINT32 *dataCount,
[in, out] FLOAT *segmentData
);
參數
[in, out] dataCount
segmentData參數所參考的陣列大小。
如果方法成功傳回, dataCount 將會包含 segmentData所參考之陣列中傳回的專案數目。
如果在呼叫 方法時 將 segmentData 設定為 Null , 則 dataCount 必須設定為零。
如果在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陣列中的前兩個數據值將會是該線段終點的 x 和 y 座標;如果下一個區段的區段類型值為XPS_SEGMENT_TYPE_BEZIER,segmentData陣列中的下六個值將會描述該區段的特性;幾何圖中每一條線段的等等。
下表描述針對每個區段類型所傳回的特定一組資料值。 如需如何在程式中存取此資料的範例,請參閱下列程式碼範例。
區段類型 | 必要的資料值 |
---|---|
XPS_SEGMENT_TYPE_LINE |
兩個數據值:
|
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE |
五個數據值:
|
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE |
五個數據值:
|
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE |
五個數據值:
|
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE |
五個數據值:
|
XPS_SEGMENT_TYPE_BEZIER |
六個數據值:
|
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER |
四個數據值:
|
下列程式碼範例會存取幾何圖中每個區段類型的不同資料點。
// 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 Vista 的 Windows 7、Windows Vista SP2 和平臺更新 [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2008 R2、Windows Server 2008 SP2 和 Platform Update for Windows Server 2008 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | xpsobjectmodel.h |