2012-03-13 2 views
1

VCL C++ 응용 프로그램에서 이식 된 사용자 지정 컨트롤로 문제를 해결하려고합니다. 개념은 컨트롤의 개별 부분이 새 Graphics 객체에서 먼저 그려지고 컨트롤의 paint 메서드에서 Graphics 객체와 병합된다는 것입니다.그래픽 개체를 병합해도 텍스트가 올바르게 렌더링되지 않습니다.

나는 간단한 예를 만들었습니다

using System.Drawing; 
using System.Windows.Forms; 

namespace Test 
{ 
    public class Form1 : Form 
    { 
     private PictureBox pictureBox; 

     public Form1() 
     { 
      pictureBox = new PictureBox(); 
      pictureBox.Dock = DockStyle.Fill; 
      pictureBox.Paint += new PaintEventHandler(pictureBox_Paint); 

      ClientSize = new Size(100, 50); 
      Controls.Add(pictureBox); 
     } 

     private void pictureBox_Paint(object sender, PaintEventArgs e) 
     { 
      SolidBrush blackBrush = new SolidBrush(Color.Black); 

      Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height); 
      Graphics graphics = Graphics.FromImage(bitmap); 

      Font font = new Font(pictureBox.Font, FontStyle.Regular); 
      graphics.DrawString("simple test", font, Brushes.Black, 0, 0); 

      e.Graphics.DrawImage(bitmap, 0, 0); 
     } 
    } 
} 

텍스트의 위의 코드 결과를 실행하면 너무 두꺼운 그려지 :

내가 텍스트를 그리는 코드를 수정

PictureBox의 Graphics 개체에 직접 연결하면 올바른 결과를 얻습니다.

이 문제는 텍스트 렌더링에서만 발생합니다. 선과 다른 모양이 올바르게 렌더링됩니다. 어떤 아이디어가 이것을 해결하는 방법?

미리 감사드립니다.

답변

1

비트 맵 픽셀을 초기화하지 않아이 문제가 발생합니다. 기본적으로 Color.Transparent는 알파가 0 인 검정색입니다. 앤티 앨리어싱 된 텍스트를 비트 맵에 그릴 때 잘못 처리되는 경우 별칭 지정 알고리즘은 전경 (검정색)에서 배경색으로 혼합 된 픽셀을 그립니다 (또한 검은). 앤티 앨리어스가 적용되지 않은 Blobby 문자가 결과입니다.

기본 Form.OnPaintBackground() 메소드로 배경 픽셀을 전투함 회색으로 그렸기 때문에 두 번째 스크린 샷에는 문제가 없습니다. 간단하게 문제를 해결하기 위해 Graphics.Clear() 메소드를 추가

using (var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height)) { 
    using (var graphics = Graphics.FromImage(bitmap)) { 
     graphics.Clear(this.BackColor);    // <== NOTE: added 
     graphics.DrawString("simple test", pictureBox1.Font, Brushes.Black, 0, 0); 
    } 
    e.Graphics.DrawImage(bitmap, 0, 0); 
} 

충돌에서 프로그램을 방지하기 위해 추가 문을 사용하여 로를 가비지 수집기가 자주 실행되지 않을 때.

+0

대단히 감사합니다. – user828227