2

ユーザーがパネルに描画してビットマップとしてコンピューターに保存できる単純なアプリケーションを作成しようとしています。しかし、保存部分に進むと、空の (白い) ビットマップしか表示されません。

私は他の多くのソリューションを閲覧してきましたが、ビットマップを正しい方法で保存していると確信しているので、描画プロセスが間違っているのではないかと思い始めています。ここで正確に何が間違っていますか?

public partial class Form1 : Form
{

    SolidBrush brush;
    Pen pen;
    Point[] points = new Point[3];
    Graphics display;
    Bitmap bmap;

    public Form1()
    {
        InitializeComponent();
        display = panel1.CreateGraphics();
        bmap = new Bitmap(panel1.Width, panel1.Height);
    }


    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        brush = new SolidBrush(Color.Black);
        pen = new Pen(Color.Black);


        display.FillEllipse(brush, e.X, e.Y, 10, 10);
        panel1.DrawToBitmap(bmap, new Rectangle(0, 0, panel1.Width, panel1.Height));

        //this.Invalidate();
    }



    private void clearToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Graphics display = panel1.CreateGraphics();
        display.Clear(panel1.BackColor);

    }

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {



        bmap.Save(@"C:\Temp\Test.bmp");

    }
}

編集 このリビジョンでは、黒い bmp が表示されるだけで、画面上に省略記号が作成されていません。マウスダウンイベントに無効化とビットマップへの描画を戻すと、保存ボタンは最後の楕円を保存することに気付きましたが、画面にはまだ何も表示されていません。

private void panel1_MouseDown(object sender, MouseEventArgs e)
        {

            mousedown = true;
            x = e.X;
            y = e.Y;

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            //Graphics g = e.Graphics;
            if(mousedown==true)

            {
            brush = new SolidBrush(Color.Black);
            pen = new Pen(Color.Black);

            Graphics.FromImage(bmap).FillEllipse(brush, x, y, 10, 10);
            panel1.Invalidate();
           //panel1.DrawToBitmap(bmap, new Rectangle(0, 0, panel1.Width, panel1.Height));


            //panel1.Invalidate();

            }
        }
4

2 に答える 2

3

Hans がコメントでほとんどの作業を行ったので、コードは次のようになります。

public partial class Form1 : Form {
  Bitmap bmap;

  public Form1() {
    InitializeComponent();

    bmap = new Bitmap(panel1.ClientWidth, panel1.ClientHeight);
    panel1.MouseDown += panel1_MouseDown;
    panel1.Paint += panel1_Paint;
  }

  void panel1_Paint(object sender, PaintEventArgs e) {
    e.Graphics.DrawImage(bmap, Point.Empty);
  }

  void panel1_MouseDown(object sender, MouseEventArgs e) {
    using (Graphics g = Graphics.FromImage(bmap)) {
      g.FillEllipse(Brushes.Black, e.X, e.Y, 10, 10);
    }
    panel1.Invalidate();
  }

  private void clearToolStripMenuItem_Click(object sender, EventArgs e) {
    using (Graphics g = Graphics.FromImage(bmap)) {
      g.Clear(Color.White);
    }
    panel1.Invalidate();
  }

  private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
    bmap.Save(@"c:\temp\bmap.bmp");
  }
}

CreateGraphics は単なる一時的なキャンバスであるため、特に画像を保存しようとしているため、描画目的で使用することはめったにありません。

于 2013-05-09T14:49:18.300 に答える