共用方式為


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 檔錯誤

傳回碼 描述
S_OK
此方法已成功。
E_POINTER
dataCountNull
ERROR_MORE_DATA
segmentDataNull ,或參考不足以接收區段資料的緩衝區。 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_LINE圖區段範例的圖表 兩個數據值:
線段終點的 X 座標。
線段終點的 Y 座標。
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE 圖表XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE圖區段。 五個數據值:
弧線終點的 X 座標。
弧線終點的 Y 座標。
沿著 X 軸的橢圓形半徑長度。
沿著 y 軸的橢圓形半徑長度。
旋轉角度。
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE 顯示XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE圖區段範例的圖表 五個數據值:
弧線終點的 X 座標。
弧線終點的 Y 座標。
沿著 X 軸的橢圓形半徑長度。
沿著 y 軸的橢圓形半徑長度。
旋轉角度。
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE 圖表XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE圖區段。 五個數據值:
弧線終點的 X 座標。
弧線終點的 Y 座標。
沿著 X 軸的橢圓形半徑長度。
沿著 y 軸的橢圓形半徑長度。
旋轉角度。
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE 顯示XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE圖區段範例的圖表 五個數據值:
弧線終點的 X 座標。
弧線終點的 Y 座標。
沿著 X 軸的橢圓形半徑長度。
沿著 y 軸的橢圓形半徑長度。
旋轉角度。
XPS_SEGMENT_TYPE_BEZIER 顯示圖表區段XPS_SEGMENT_TYPE_BEZIER範例的圖表 六個數據值:
Bezier 曲線第一個控制點的 X 座標。
Bezier 曲線第一個控制點的 Y 座標。
Bezier 曲線第二個控制點的 X 座標。
Bezier 曲線第二個控制點的 Y 座標。
Bezier 曲線終點的 X 座標。
Bezier 曲線終點的 Y 座標。
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER 顯示XPS_SEGMENT_TYPE_QUADRATIC_BEZIER圖區段範例的圖表 四個數據值:
四邊形 Bezier 曲線控制點的 X 座標。
四邊形 Bezier 曲線控制點的 Y 座標。
四邊形 Bezier 曲線終點的 X 座標。
四邊形 Bezier 曲線終點的 Y 座標。
 

下列程式碼範例會存取幾何圖中每個區段類型的不同資料點。

    // 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

另請參閱

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

XPS 檔錯誤