문제

저는 C++에서 GDI+를 사용하고 있습니다.(이 문제는 C#에도 존재할 수 있습니다.)

Graphics::MeasureString() 또는 Graphics::DrawString()을 호출할 때마다 문자열의 왼쪽과 오른쪽에 공백이 채워지는 것을 확인했습니다.

예를 들어 Courier 글꼴(기울임꼴 아님!)을 사용하고 "P"를 측정하면 90이 나오지만 "PP"는 150이 됩니다.저는 고정 폭 글꼴이 "PP" 너비의 정확히 두 배를 제공할 것으로 기대합니다.

내 질문은 다음과 같습니다이것이 의도되었거나 문서화된 동작입니까? 이를 비활성화하려면 어떻게 해야 합니까?

RectF Rect(0,0,32767,32767);
RectF Bounds1, Bounds2;
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1);
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2);
margin = Bounds1.Width * 2 - Bounds2.Width;
도움이 되었습니까?

해결책

의도적으로 설계된 방법으로, 이 방법은 실제 글리프를 사용하여 너비를 측정하지 않으므로 돌출부의 경우 약간의 패딩을 추가합니다.

MSDN 더 많은 정확성이 필요한 경우 다른 방법을 사용할 것을 제안합니다.

레이아웃에서 인접한 문자열에 적합한 측정항목을 얻으려면(예: 서식 있는 텍스트를 구현할 때) 측정문자 범위 방법 또는 다음 중 하나 MeasureString 소요되는 메소드 문자열 형식, 그리고 통과 일반 인쇄상의.또한, 텍스트렌더링힌트 위해 제도법 ~이다 앤티앨리어스.

다른 팁

의도적으로 설계된 것은 사실이지만 허용되는 답변의 링크는 실제로 완벽하지 않습니다.문제는 실제로 사용하려는 것이 픽셀(ints)일 때 모든 메서드에서 부동 소수점을 사용한다는 것입니다.

그만큼 TextRenderer 클래스 이 목적을 위한 것이며 실제 크기로 작동합니다.이것 좀 봐 msdn에서 링크 이것을 사용하는 연습을 위해.

추가 StringFormat.GenericTypographic 문제를 해결할 것입니다:

graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic);

동일한 속성을 적용합니다. DrawString.

이 KB 기사에 따르면 힌트에 연결될 수도 있는 것 같습니다. GDIPlus와 GDI로 그릴 때 텍스트가 다르게 나타나는 이유

TextRenderer는 글꼴 크기를 가져오는 데 유용했습니다.그러나 그리기 루프에서 TextRenderer.DrawText를 사용하는 것은 graphic.DrawString()에 비해 엄청나게 느렸습니다.

문자열의 너비가 문제이므로 TextRenderer.MeasureText와 Graphics.DrawString을 조합하여 사용하는 것이 훨씬 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top