2010-04-08 3 views
6

텍스트 렌더링을하는 C# 응용 프로그램을 가지고 있는데, 간단한 wysiwyg 텍스트 편집기와 비슷합니다.TextRenderer.DrawText는 XP와 Vista에서 Arial을 다르게 렌더링합니다.

TextRenderer.DrawText를 사용하여 텍스트를 화면에 렌더링하고 GetTextExtentPoint32를 사용하여 텍스트를 측정하므로 같은 줄에 다른 글꼴 스타일/크기를 배치 할 수 있습니다.

Vista에서는 모두 정상적으로 작동합니다. 그러나 XP에서는 Arial이 다르게 렌더링됩니다. 'o'와 'b'와 같은 특정 문자는 Vista에서보다 폭이 넓습니다. GetTextExtentPoint32는 Vista에서와 같이 문자열을 측정하는 것으로 보이지만 더 작은 너비로 나타납니다. 최종 결과는 선행 텍스트가 화면에 실제로 표시되는 것보다 더 작게 측정되기 때문에 매 순간마다 텍스트가 연속되는 텍스트와 겹칠 것입니다.

또한 내 텍스트 렌더링 코드는 텍스트를 정확하게 표현합니다 (간단한 형식 지정 및 영어 만 해당). 즉 텍스트 렌더링은 Vista와 XP간에 일관성이있는 것 같습니다. 다른 문자의 크기가 어떻게 변했는지 알았습니다.

누구에게 무슨 일이 일어나고 있는지 아이디어가 있습니까?

요약하면 TextRenderer.DrawText와 GetTextExtentPoint32는 XP에서 Arial과 일치하지 않습니다. DrawText는 Vista에서보다 크고 작은 특정 문자를 그리는 것으로 보이지만 GetTextExtentPoint32는 Vista에서 텍스트를 측정하는 것처럼 보입니다. (즉, XP와 Vista 모두에서 텍스트 렌더링과 일치하는 것처럼 보입니다.) 희망은 그 말이 맞습니다.

참고 : 불행히도 TextRenderer.MeasureString이 내 요구 사항을 충족 할만큼 빠르지 않거나 정확하지 않습니다. 나는 그것을 사용하려고 시도하고 그것을 찢어 버려야했다.

+0

+1 나는 당신이 상대하고있는 것을 알고 있기 때문에! 그리고 고정 폭 글꼴 만 처리해야했습니다. – leppie

+0

DPI 또는 Cleartype이 아닌 것이 확실합니까? –

답변

0

저는 C# 사람은 아니지만 .NET 렌더링이 GDI + 위에 구축되어 있다고 생각합니다. 나는 또한 GDI +가 unhinted scaling을 사용하는 자체 폰트 렌더링을한다고 확신한다.

GetTextExtentPoint32 다른 한편으로는 GDI의 일부입니다. GDI는 글꼴 크기에 따라 문자의 너비에 영향을 줄 수있는 크기 조정 참고를 사용합니다. 일반적으로 작은 크기의 GDI 텍스트는 약간의 게터처럼 보이지만 선형으로 확장되지는 않습니다.

픽셀 완벽한 결과를 얻으려면 모델 하나를 일관되게 사용해야합니다.

비스타에서보다 XP에서 더 명확하게 할 수있는 다른 요소가있을 수 있지만 근본적인 문제가 둘 다 존재합니다. 이러한 다른 요소에는 DPI 설정, DPI 배율, ClearType 또는 앤티 앨리어싱 설정, 글꼴 연결 (다른 알파벳의 스크립트를 혼합하는 경우), 글꼴 대체 (특히 인쇄시) 및 가능하면 다른 버전의 Arial이 포함될 수 있습니다. GDI +가 GDI와 동일한 기본 매핑 모드를 사용하는지조차 모르겠습니다.

my answer on print preview도 참조하십시오.

2

애드리안에 회신 해 주셔서 감사합니다.

제 생각에 TextRenderer.DrawText는 실제로 GDI + 텍스트 렌더링을 우회하여 GDI로 호출을 래핑합니다. 그렇기 때문에 GetTextExtentPoint32가 출력에 방해가되지 않는다고 혼란스러워했습니다.

나는 문제를 발견했다고 생각한다. Graphics.DextRenderingHint를 System.Drawing.Text.TextRenderingHint.ClearTypeGridFit 또는 다른 값으로 설정하면 일부 글꼴의 일부 문자가 증가하거나 감소합니다. 이것은 비스타보다 XP에서 더 많은 것으로 보인다. 나는 그것이 Vista에서 전혀 일어나지 않는 것을 보았다.어쨌든 GetTextExtentPoint32가 차이를 인식 할 수 없거나 전화를 걸 때 어떤 종류의 플래그를 설정하지 않은 것 같습니다.

내 솔루션은 시스템 기본 textrenderinghint 설정을 사용하는 것입니다.

+0

. 나는 좋은 정보를 여기에서 발견했다. (그러나 그는 또한 모호한 주장을한다. 그래서 조심한다.) http://blogs.msdn.com/cjacks/archive/2006/05/11/595525.aspx –

0

사실 TextRenderer의 DrawText와 MeasureString은 모두 DrawTextEx을 기반으로합니다 (그리고 이것은 Gdi 기능이 아닌 User32입니다). 추가 계산이 필요하기 때문에 (특히 HDC없이 함수 재정의를 사용하는 경우) MeauseString 대신이 함수에 대한 기본 마샬링 호출을 사용하는 것이 좋습니다.

어쩌면이 post도 도움이 될 것입니다.