C# winforms에서 드로 스트링이 예상치 못한 행동을 나타내는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/837565

문제

C# winforms의 컨트롤을 서브 클래스를했으며 OnPaint() 매니저. 글꼴은 내 양식의 다음 코드를 사용하여 택배 새로 설정됩니다.

FontFamily family = new FontFamily("Courier New");
this.myControl.Font = new Font(family, 10);

컨트롤 자체에서 문자열은 realText, 그리고 다음 코드를 사용하여 화면에 그려줍니다.

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    e.Graphics.DrawString(realText, Font, new SolidBrush(ForeColor), ClientRectangle);
}

임의의 예제 텍스트에 대한 결과는 다음과 같이 보입니다.http://img219.imageshack.us/img219/1778/courier.png

확대되면 예를 들어 첫 번째 'AS'사이의 공간은 두 번째 'AS'(1 픽셀 대 2 픽셀) 사이의 공간과 다르다는 것을 알 수 있습니다. 누구 든지이 원인이 무엇인지 또는 어떻게 발생하지 않도록하는 방법을 아는 사람이 있습니까? 다른 글꼴로 그리는 것처럼 간격에서 훨씬 비슷한 기이함이 있지만, 나는 그것들이 모두 같은 문제의 결과라고 가정합니다.

당신이 가질 수있는 아이디어에 미리 감사드립니다.

도움이 되었습니까?

해결책

나는 당신이 사용하기 때문이라고 생각합니다 Graphics.DrawString() 대신에 TextRenderer.DrawText(). 전자는 gdi+를 사용하여 텍스트를 그린다. 후자는 텍스트 렌더링 측면에서 더 현대적인 GDI를 사용합니다. 나는 이것이 이전 답변 (Winforms vs. Windows)에 의해 언급 된 차이라고 생각합니다.

과부하를 시도 할 수도 있습니다 Graphics.DrawString() 그게 걸립니다 StringFormat 객체와 지정하십시오 StringFormat.GenericTypographic. 그러나 이것은 실제로 문제에 대한 약간의 해킹입니다. .NET 2.0 이상을 사용하는 경우 TextRenderer 엉터리 대신 수업 Graphics 모든 텍스트 렌더링 요구에 대한 클래스. Graphics.MeasureString() 그리고 Graphics.DrawString() .NET 1.0 및 1.1과의 거꾸로 호환성을 위해 엄격하게 존재합니다.

편집 : 아, 예, 코드는 모든 페인트주기에서 GDI 객체를 누출합니다. 브러시 객체는 관리되지 않은 자원 주변의 래퍼이므로 명시 적으로 배치해야합니다.

다른 팁

나는 정직해야하지만, 이것은 전에 나에게는 결코 일어나지 않았다. 그러나 스무딩 모드를 안티 아시아로 설정하십시오.

e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

또 다른 것은 제쳐두고, 사용에서 나온 것이 DoubleBuffer가 True로 설정되어 있는지 확인하십시오. 또한 모든 onpaint 호출에 새로운 SolidBrush를 만들지 마십시오.

Winforms를 사용하여 서브 클래스 컨트롤에 텍스트를 그리는 경험은 텍스트 렌더링 엔진 (GDI+?)이 Windows의 자체 글꼴 엔진만큼 좋지 않으며 잘 작동 할 때도 다른 결과를 제공한다는 것입니다.

나는 Visual Studio Addin의 저자입니다.http://entrian.com/source-search) Visual Studio 내에서 페인트 컨트롤을 페인트해야하며, Fonts가 Visual Studio (ListViews, TreeViews 등)의 표준 컨트롤과 동일하게 보이게하려면 Win32 API를 사용하여 Winforms를 우회하고 텍스트를 페인트해야합니다.

[DllImport("gdi32.dll")]
public static extern bool ExtTextOut(IntPtr hdc, int X, int Y,
   uint fuOptions, [In] ref RECT lprc, string lpString, uint cbCount,
   [In] int[] lpDx);

...그리고 가족.

아마도 당신이 듣고 싶었던 것이 아니라 거기에 있습니다.

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