2012-01-09 38 views
1

Visual Studio 2008 SP1 C#WindowsアプリケーションOnPaintが正しく描画されない

メインフォームに直接書き込んで描画していますが、画面の再描画に問題があります。プログラムの起動時に、画面が正しくペイントされます。さらに2つのペイントメッセージが3〜4秒後に続きます(アクションやモーションは画面に表示されません)。スクリーンはクライアント座標の代わりにスクリーン座標を使用して描画されます。元の文字列は消去されません。

問題を最も簡単な形にするために、私は新しいC#Windowsアプリケーションを開始しました。メインフォームに文字列を描画する以外は何もしません。 (下記のコードをご覧ください)プログラムを起動すると文字列が表示され、2番目の文字列が上と下に表示されます。プログラムを再起動してフォームを画面の左上隅に移動すると、2つの文字列がほぼ一致します。このため、第2のペイントがスクリーン座標を使用していると思います。

コードはありますか?お手数ですが、あらかじめご了承ください。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Junk 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnPaint(PaintEventArgs eventArgs) 
    { 
     using (Font myFont = new System.Drawing.Font("Helvetica", 40, FontStyle.Italic)) 
      { 
      eventArgs.Graphics.TranslateTransform(0, 0); 
      Point p; 
      eventArgs.Graphics.DrawString("Hello C#", myFont, System.Drawing.Brushes.Red, 200, 200); 
      } //myFont is automatically disposed here, even if an exception was thrown    
    } 
} 
} 
+1

独自のコードを使用する前に 'base.OnPaint(eventArgs) 'を呼び出すことを忘れないでください。 – FlyingStreudel

+1

投稿されたコードスニペットはこの問題を再現できません。再塗りつぶしを行うために正確にあなたが何をしたかは、非常に不明です。 –

答えて

0

このメソッドは、あなたが観察しているように画面座標を描画することを意図していると思います。達成したい結果を得る1つの方法は、クライアントの座標を、メソッドが期待しているスクリーン座標に変換することです。

protected override void OnPaint(PaintEventArgs eventArgs) 
{ 
    using (Font myFont = new System.Drawing.Font("Helvetica", 40, FontStyle.Italic)) 
     { 
     eventArgs.Graphics.TranslateTransform(0, 0); 
     Point p = this.PointToScreen(new Point(200, 200)); 
     eventArgs.Graphics.DrawString("Hello C#", myFont, System.Drawing.Brushes.Red, p); 
     } //myFont is automatically disposed here, even if an exception was thrown    
} 
+0

そうではありません、塗装は常にクライアントエリアの座標を使用します。 –

関連する問題