IXpsOMGeometryFigure::GetSegmentData 메서드(xpsobjectmodel.h)

기하 도형의 세그먼트 데이터 요소를 가져옵니다.

구문

HRESULT GetSegmentData(
  [in, out] UINT32 *dataCount,
  [in, out] FLOAT  *segmentData
);

매개 변수

[in, out] dataCount

segmentData 매개 변수에서 참조하는 배열의 크기입니다.

메서드가 성공적으로 반환되면 dataCount 에는 segmentData에서 참조하는 배열에 반환된 요소 수가 포함됩니다.

메서드가 호출될 때 segmentDataNULL 로 설정된 경우 dataCount 를 0으로 설정해야 합니다.

nULL 포인터가 segmentData에 반환되면 dataCount에는 필요한 버퍼 크기가 요소 수로 포함됩니다.

[in, out] segmentData

dataCount에 지정된 것과 동일한 수의 요소를 포함하는 배열의 주소입니다. 호출자가 메서드가 dataCount에 필요한 버퍼 크기만 반환하도록 요구하는 경우 이 값을 NULL로 설정할 수 있습니다.

배열이 충분히 큰 경우 이 메서드는 세그먼트 데이터 요소를 배열에 복사하고 복사된 데이터 요소 수를 dataCount에 반환합니다. segmentDataNULL로 설정되거나 충분히 크지 않은 버퍼를 참조하는 경우 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 배열의 다음 6개 값은 해당 세그먼트의 특성을 설명합니다. 기하 도형의 각 선 세그먼트에 대해 등입니다.

다음 표에서는 각 세그먼트 유형에 대해 반환되는 특정 데이터 값 집합에 대해 설명합니다. 프로그램에서 이 데이터에 액세스하는 방법에 대한 예제는 다음 코드 예제를 참조하세요.

세그먼트 유형 필수 데이터 값
XPS_SEGMENT_TYPE_LINE XPS_SEGMENT_TYPE_LINE 그림 세그먼트의 예를 보여 주는 다이어그램 두 데이터 값:
세그먼트 선 끝점의 x 좌표입니다.
세그먼트 선 끝점의 y 좌표입니다.
XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE 그림 세그먼트의 다이어그램 5가지 데이터 값:
호 끝점의 x 좌표입니다.
호 끝점의 y 좌표입니다.
x축을 따라 타원 반경의 길이입니다.
y축을 따라 타원 반경의 길이입니다.
회전 각도입니다.
XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE 그림 세그먼트의 예를 보여 주는 다이어그램 5가지 데이터 값:
호 끝점의 x 좌표입니다.
호 끝점의 y 좌표입니다.
x축을 따라 타원 반경의 길이입니다.
y축을 따라 타원 반경의 길이입니다.
회전 각도입니다.
XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE 그림 세그먼트의 다이어그램 5가지 데이터 값:
호 끝점의 x 좌표입니다.
호 끝점의 y 좌표입니다.
x축을 따라 타원 반경의 길이입니다.
y축을 따라 타원 반경의 길이입니다.
회전 각도입니다.
XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE 그림 세그먼트의 예를 보여 주는 다이어그램 5가지 데이터 값:
호 끝점의 x 좌표입니다.
호 끝점의 y 좌표입니다.
x축을 따라 타원 반경의 길이입니다.
y축을 따라 타원 반경의 길이입니다.
회전 각도입니다.
XPS_SEGMENT_TYPE_BEZIER XPS_SEGMENT_TYPE_BEZIER 그림 세그먼트의 예를 보여 주는 다이어그램 6개의 데이터 값:
베지어 곡선의 첫 번째 제어점 x 좌표입니다.
베지어 곡선의 첫 번째 제어점의 y 좌표입니다.
베지어 곡선의 두 번째 제어점 x 좌표입니다.
베지어 곡선의 두 번째 제어점의 y 좌표입니다.
베지어 곡선 끝점의 x 좌표입니다.
베지어 곡선 끝점의 y 좌표입니다.
XPS_SEGMENT_TYPE_QUADRATIC_BEZIER XPS_SEGMENT_TYPE_QUADRATIC_BEZIER 그림 세그먼트의 예를 보여 주는 다이어그램 4개의 데이터 값:
쿼드 베지어 곡선의 제어점 x 좌표입니다.
쿼드 베지어 곡선의 제어점 y 좌표입니다.
쿼드 베지어 곡선 끝점의 x 좌표입니다.
쿼드 베지어 곡선 끝점의 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 7, Windows Vista SP2 및 Windows Vista용 플랫폼 업데이트 [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2008 R2, Windows Server 2008 SP2 및 Windows Server 2008용 플랫폼 업데이트 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 xpsobjectmodel.h

추가 정보

GetSegmentCount

GetSegmentDataCount

GetSegmentTypes

IXpsOMGeometryFigure

XML Paper Specification

XPS 문서 오류