IXpsOMGeometryFigure::GetSegmentData 메서드(xpsobjectmodel.h)
기하 도형의 세그먼트 데이터 요소를 가져옵니다.
구문
HRESULT GetSegmentData(
[in, out] UINT32 *dataCount,
[in, out] FLOAT *segmentData
);
매개 변수
[in, out] dataCount
segmentData 매개 변수에서 참조하는 배열의 크기입니다.
메서드가 성공적으로 반환되면 dataCount 에는 segmentData에서 참조하는 배열에 반환된 요소 수가 포함됩니다.
메서드가 호출될 때 segmentData 가 NULL 로 설정된 경우 dataCount 를 0으로 설정해야 합니다.
nULL 포인터가 segmentData에 반환되면 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 배열의 다음 6개 값은 해당 세그먼트의 특성을 설명합니다. 기하 도형의 각 선 세그먼트에 대해 등입니다.
다음 표에서는 각 세그먼트 유형에 대해 반환되는 특정 데이터 값 집합에 대해 설명합니다. 프로그램에서 이 데이터에 액세스하는 방법에 대한 예제는 다음 코드 예제를 참조하세요.
세그먼트 유형 | 필수 데이터 값 |
---|---|
XPS_SEGMENT_TYPE_LINE ![]() |
두 데이터 값:
|
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 |