2

私はビットマップを使用してパネルに描画することについて学びました。白いパネルを黒くするだけのトライアルプログラムを実行しようと思いました。(それを行うには複雑な方法に思えるかもしれませんが、これは基本をテストするためだけのものです)私のプログラムは次のとおりです。

public partial class Form1 : Form
{
    private Bitmap buffer = new Bitmap(100,100);

    public Form1()
    {
        InitializeComponent();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
       e.Graphics.DrawImageUnscaled(buffer, Point.Empty);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            for (int j = 0; j < 100; j++)
            {
                buffer.SetPixel(i, j, Color.Black);
            }
        }
    }
}

それを実行してボタンを押しても、パネルが変わらないようです。私が間違っているアイデア。前もって感謝します。

4

3 に答える 3

3

Windowsが強制的に再描画するように、パネルのクライアント領域を無効にする必要があります。しかし、他にもいくつかの問題があります。

  1. @Tonyが提案したように、FillRectangleは、ループ内の各ピクセルをペイントするよりもはるかに効率的な仕事をします。
  2. buffer表示の準備が整う前にパネルが無効になっていると、同時実行の問題が発生する可能性があります。ビットマップの生成がその表示から分離されていることを確認してください。

これらの提案は次のように要約されます(ただしテストされていません)。

private void button1_Click(object sender, EventArgs e)
{
    Bitmap tempBuffer = new Bitmap(100, 100);

    using (Graphics g = Graphics.FromImage(tempBuffer))
    using (SolidBrush blackBrush = new SolidBrush(Color.Black))
    {
        g.FillRectangle(blackBrush, new Rectangle(0, 0, tempBuffer.Width-1, tempBuffer.Height-1);
    }

    buffer = tempBuffer;
    panel1.Invalidate();
}
于 2012-08-31T17:24:19.173 に答える
3

パネルのクライアント領域を無効にすることに加えて、ボタンをクリックしたときにパネルをペイントしたい場合は、ボタンのクリックイベントにペイントイベントを接続する必要があります。これを試してみてください:

public partial class Form1 : Form
{
    private bool _paintWired;

    public Form1()
    {
        InitializeComponent();
    }

    private void PanelPaint(object sender, PaintEventArgs e)
    {
        using (Graphics g = this.panel1.CreateGraphics())
        {
            g.FillRectangle(Brushes.Black, this.panel1.Bounds);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if(!_paintWired)
        {
            this.panel1.Paint += new PaintEventHandler(PanelPaint);
            _paintWired = true;
        }

        this.panel1.Invalidate();
    }
}

更新:申し訳ありませんが、ビットマップの使用についてのポイントを逃しました。

于 2012-08-31T17:32:04.887 に答える
0

この例を試してみてください私はあなたがやりたいことのような何かのためにそれを使用し、それはうまくいきました。私はあなたを助けたいと思っています

example_1

于 2012-08-31T17:33:44.293 に答える