2011-09-13 17 views
0

一度作成された色のグラデーションを表示するユーザーコントロールがあります。Windowsフォーム、動的に生成されたビットマップ上の表示インジケータ

usercontrolにはコントロールが含まれていません。ピクチャボックスを追加するか動的に追加する必要があるかどうかはわかりません。

その画像には、現在の結果が表示される行を表示したいと思います。マップ上にグラデーションイメージを作成するのに問題はありませんが、インジケータ(親フォームからCurrentValueを呼び出す)を更新するたびにキャッシュするため、インジケータラインをグラデーションイメージの上に配置します。これは1秒間に約30回更新されます。したがって、下のコードがどのように動作しているかで、毎回グラデーションを再描画しています。これはちらつきです。

namespace Maps.UserControls 
{ 
    public partial class UserControlLegend : UserControl 
    { 
     private double m_CurrentValue; 
     public double CurrentValue 
     { 
      get 
      { 
       return m_CurrentValue; 
      } 
      set 
      { 
       m_CurrentValue = value; 
       RefreshValue(); 
      } 
     } 

     public UserControlLegend() 
     { 
      InitializeComponent(); 
     } 

     private void UserControlLegend_Paint(object sender, PaintEventArgs e) 
     { 
      if (b == null) 
      { 
       g = e.Graphics; 
       b = new System.Drawing.Bitmap(menuWidth, menuHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

       // Code here that draws Menu 

       // Cache bitmap here? 
       g.Dispose(); 
      } 
     } 

     private void RefreshValue() 
     { 
      this.Refresh(); 
      g = this.CreateGraphics(); 
      g.DrawImage(b, 0, 0); 
      //Code to Calcuate current Indicator Location 

      int x3 = 0; 
      // Draws current indicator correctly 
      g.DrawLine(new Pen(new SolidBrush(Color.Black)), this.Width/2 - 15, x3, this.Width/2 - 5, x3); 
      g.Dispose(); 
     } 
    } 
} 
+0

私はそれを理解しました。私はビットマップを描画し、インジケータの別のコントロールを使用して、ちょうど私がそれを望むところにポイントを移動しました。うまくいく。 – dave2118

答えて

0

ビットマップを用い、コメントして上で説明し、単にXを設定し、コントロールのY:

は、ここでのサンプルコードです。

0

まず、コントロールのプロパティDoubleBufferedTrueに設定して、ちらつきがなくなるようにすることをお勧めします。しかし、コントロール自体を描画しないと、それはまったく役に立たないでしょう。ただし、PictureBoxに描画すると、自動的にDoubleBufferedになるため、より優れています。

第2に、Bitmapのサイズが数メガバイトであるため、毎回新しいBitmapにペイントしています。これはメモリの面で非常に悪いことです。私は、コンストラクタでを1つ初期化し、コンストラクタでから作成したGraphicsという単一のものを作成することをお勧めします。 paintが発生するたびに、古いGraphics gをクリアして、何度も繰り返し描画します。 g Graphicsおよびb Bitmapは、コントロール全体がDisposedである場合、1回だけDispose dになるはずです。

これはコードに影響を与える可能性があります。

関連する問題