2012-03-13 13 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のグラフィックスオブジェクトに私は正しい結果を得る:

この問題は、テキストレンダリングでのみ発生します。線や他の図形が正しくレンダリングされます。任意のアイデアをどのようにこれを解決するには?

ありがとうございます。

答えて

1

これは、ビットマップピクセルの初期化を忘れたために発生します。デフォルトでは、Color.Transparentはアルファ0の黒です。アンチエイリアス処理されたテキストをビットマップに描画すると、エイリアシングアルゴリズムはフォアグラウンド(黒)から背景にブレンドされたピクセルを描画します(また、黒)。アンチエイリアス処理されていないBlobby文字が結果です。

これは、デフォルトのForm.OnPaintBackground()メソッドによって背景ピクセルが戦艦グレーに描画されたため、2番目のスクリーンショットでは問題ありません。ガベージコレクタは、十分な頻度で実行されないときにクラッシュからプログラムを防止するために添加ステートメントを使用して

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); 
} 

:単にあなたの問題を解決するためにGraphics.Clear()メソッドを追加します。

+0

ありがとうございます! – user828227

関連する問題