1

モバイル デバイスでシグネチャ コントロールを提供するために、Psion の SDK を使用しています。シグネチャ コントロール (ピクチャ ボックス) の周りに四角形を描画したいと考えています。以下を Paint イベントに入れましたが、問題はちらつきです (画像ボックスにサインインすると、画像ボックスは常に更新されます。

これをフォームのロードイベントに入れる方法はありますか? PainEventArgs が必要なのはわかっていますが、これについてはよくわかりません。

    private void scSignature_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawRectangle(new Pen(Color.Black, 2f), 0, 0,
            e.ClipRectangle.Width - 1,
            e.ClipRectangle.Height - 1
            );
    }

ありがとう

4

2 に答える 2

7

CF でペイントするときのちらつきとガベージの作成を防ぐためのヒント:

  1. OnPaintBackground をオーバーライドして空のままにします
  2. Graphics複数の操作がある場合は、手渡されたものに直接描画しないでください。代わりに、Bitmapバッファを作成し、そこに描画してから、そのビットマップの内容をGraphics
  3. すべてのペイントで上記の #2 のバッファを作成しないでください。1 つ作成して再利用します。
  4. 静的項目 (署名コントロールのボックスなど) を再描画しないでください。代わりに、バッファリングされた に一度描画し、Bitmapそのビットマップを #2 のバッファにペイントしてから、動的アイテムをペイントします。
  5. すべてのペイントでペン、ブラシなどを作成しないでください。バッファリングして再利用します。

あなたの場合、これらの推奨事項は次のようになります。

class Foo : Form
{
    private Bitmap m_background;
    private Bitmap m_backBuffer;
    private Brush m_blackBrush;
    private Pen m_blackPen;

    public Foo()
    {
        m_blackBrush = new SolidBrush(Color.Black);
        m_blackPen = new Pen(Color.Black, 2);

        // redo all of this on Resize as well
        m_backBuffer = new Bitmap(this.Width, this.Height);
        m_background = new Bitmap(this.Width, this.Height);
        using (var g = Graphics.FromImage(m_background))
        {
            // draw in a static background here
           g.DrawRectangle(m_blackBrush, ...);
            // etc.
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
    }

    protected override void  OnPaint(PaintEventArgs e)
    {
        using (var g = Graphics.FromImage(m_backBuffer))
        {
            // use appropriate back color
            // only necessary if the m_background doesn't fill the entire image
            g.Clear(Color.White);

            // draw in the static background
            g.DrawImage(m_background, 0, 0);

            // draw in dynamic items here
            g.DrawLine(m_blackPen, ...);
        }

        e.Graphics.DrawImage(m_backBuffer, 0, 0);         
    } 
}
于 2012-07-23T14:49:46.547 に答える
0

これは確かに洗練された方法ではありませんが、画像ボックスに境界線がまったくないことを確認できる場合は、代わりに画像ボックス コンテナー コントロールに塗りつぶされた四角形を描画できます。画像ボックスのすぐ後ろに配置し、すべての辺を 1 ピクセル広くして、画像ボックスの周りに 1 ピクセルの境界線があるようにします。

考えられる例 (ピクチャ ボックスを含むコントロールの OnPaint メソッドをオーバーライドする):

protected override OnPaint(object sender, PaintEventArgs e)
{
     base.OnPaint(sender, e);
     int x = scSignature.Location.X - 1;
     int y = scSignature.Location.Y - 1;
     int width = scSignature.Size.Width + 2;
     int height = scSignature.Size.Height + 2;
     using (Brush b = new SolidBrush(Color.Black))
     {
        e.Graphics.FillRectangle(b,x,y,width,height);
     }

}
于 2012-07-23T12:56:08.173 に答える