GDI 및 GDI+

11746 단어 .NETFrameworkC#
GDI는 윈도우에서 화면이나 프린터에 그리는 데 사용되는 기술입니다.

또, GDI+ 는 Windows XP 로 등장한 기술로, GDI 를 완전하게 옮겨놓는 후계가 되는 것입니다. .NET Framework에서는 System.Drawing 네임스페이스에 GDI+를 사용하기 위한 클래스가 들어 있습니다.

이 두 종류의 기술을 사용하여 텍스트를 그려 보았습니다.



같은 폰트로 묘화하고 있을 것인데, 상당히 품질이 다릅니다. 아래는 들쭉날쭉하게 눈에 띄고 너무 심합니다. 또한 같은 글꼴이어야하지만 크기가 다릅니다. 자, 어느 쪽이 GDI이고 어느 쪽이 GDI+입니까?

「설마… 아래의 끔찍한 쪽이 GDI+에 의한 그리기입니다. 게다가 스무딩 모드에는 최고 성능을 지정하고 있습니다.
protected override void OnPaint(PaintEventArgs e)
{
    var text = "Hello World! こんにちは世界!";
    var graphics = e.Graphics;

    TextRenderer.DrawText(graphics, text, Font, new Point(50, 50), ForeColor);

    graphics.SmoothingMode = SmoothingMode.HighQuality;
    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
    graphics.DrawString(text, Font, new SolidBrush(ForeColor), new PointF(50, 100));
}

이 코드의 TextRenderer.DrawText() 가 GDI 를 사용하는 메소드, Graphics.DrawString() 가 GDI+ 를 사용하는 메소드입니다.

Visual Studio에서 Windows Forms 응용 프로그램을 만들면 Program.cs의 Main()에 이전에는 없었던 메서드 호출이 하나 있습니다.
Application.SetCompatibleTextRenderingDefault(false);

이것은 무엇을 하는가 하면, 「컨트롤의 묘화에는 GDI+ 는 아니고 GDI 를 사용해 주세요」라고 하는 명령입니다. 「GDI+ 의 텍스트 묘화는 사용물이 되지 않는다」라고 MS 자신이 인정하고 있는 것이군요.

왜 출시 전에 몰랐을까요?

또한 출시 후 몇 년이 지났는데도 개선되지 않는 곳을 보면, 분명히 이대로 GDI+는 떠날 것입니다.

2017년 4월 10일 추가



@snowbug 님의 지적을 받아 TextRenderingHint = TextRenderingHint.AntiAlias 로 설정한 것을 추가했습니다. 전회의 폰트의 크기를 기억하고 있지 않았기 때문에 조금 글자가 작아진 것 같습니다만, 원치수대입니다.
맨 아래가 TextRenderingHint.AntiAlias 입니다만, 어떻습니까?
protected override void OnPaint(PaintEventArgs e)
{
    var text = "Hello World! こんにちは世界!";
    var graphics = e.Graphics;

    TextRenderer.DrawText(graphics, text, Font, new Point(50, 50), ForeColor);

    graphics.SmoothingMode = SmoothingMode.HighQuality;
    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
    graphics.DrawString(text, Font, new SolidBrush(ForeColor), new PointF(50, 100));

    graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
    graphics.DrawString(text, Font, new SolidBrush(ForeColor), new PointF(50, 150));
}

2017년 4월 10일 추가



@takabosoft 씨의 지적을 받아 다음과 같이 해 보았습니다. 글꼴은 "游ゴシック, 20.25pt"입니다. 메이리오에서도 해 보았습니다만, 비슷한 결과가 되었습니다. 또, 다른 부분을 코멘트 아웃 해, 메소드 내부의 최초 2행과 마지막 2행만으로 해도 같습니다. Application.SetCompatibleTextRenderingDefault(true); 라고도 같았습니다.

우리 Windows10입니다. 다른 쪽의 환경에서는 차이가 나오는 것일까요?
protected override void OnPaint(PaintEventArgs e)
{
    var text = "Hello World! こんにちは世界!";
    var graphics = e.Graphics;

    TextRenderer.DrawText(graphics, text, Font, new Point(50, 50), ForeColor);

    graphics.SmoothingMode = SmoothingMode.HighQuality;
    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
    graphics.DrawString(text, Font, new SolidBrush(ForeColor), new PointF(50, 100));

    graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
    graphics.DrawString(text, Font, new SolidBrush(ForeColor), new PointF(50, 150));

    graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
    graphics.DrawString(text, Font, new SolidBrush(ForeColor), new PointF(50, 200));
}

좋은 웹페이지 즐겨찾기