如何在点击事件中绘制图像?

时间:2013-06-05 09:07:42

标签: c# graphics bitmap drawing

所以我只是尝试绘制图像和其他东西,但似乎我的代码只适用于加载表单事件?

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 Interface_Editing_Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //This works perfectly
            /*Image i = Image.FromFile(@"C:\Users\Simon\Pictures\clickedbutton.jpg");
            Bitmap b = (Bitmap)panel1.BackgroundImage;

            using (Graphics g = Graphics.FromImage(b))
            {
                g.DrawImage(i, 0, 0, i.Size.Width, i.Size.Height);
            }*/
        }

        private void panel1_Click(object sender, EventArgs e)
        {
            //Doesnt draw anything, but will show the message box
            Image i = Image.FromFile(@"C:\Users\Simon\Pictures\clickedbutton.jpg");
            Bitmap b = (Bitmap)panel1.BackgroundImage;

            using (Graphics g = Graphics.FromImage(b))
            {
                //MessageBox.Show(" ");
                g.DrawImage(i, 0, 0, i.Size.Width, i.Size.Height);
            }
        }
    }
}

我知道这很有可能是我所忽视的简单但我很感激,如果有人能给我一些了解发生的事情。感谢

2 个答案:

答案 0 :(得分:2)

Windows不知道您更改了图像。 Image类没有任何人可以收听的事件,因此它知道图像已被更改。它在Load事件中起作用,因为窗口还不可见,之后会立即绘制。所以你可以看到改变的图像。它在Click事件处理程序中不起作用,因为面板已经显示,没有理由重新绘制自己。

只需告诉它需要重新涂漆。将此行代码添加到方法的底部:

  panel1.Invalidate();

答案 1 :(得分:1)

似乎这是问题;由于内部的控制不同,它与处理面板内的点击事件有关。

确保您的应用程序处理panel1_click事件。 (可以通过调试器来了解它)。

由于不同的原因(例如面板上的控件存在不同等),应用程序可能无法处理此事件。

您可以参考以下与您有相同问题的问题:

Panel events won't work in c#

Handling a click event anywhere inside a panel in C#

这个工作示例可能会指导你:

private Bitmap _bmp = new Bitmap(250, 250);

public Form1()
{
  InitializeComponent();   

  panel1.Click += new MouseEventHandler(panel1_Click);
  panel1.Paint += new PaintEventHandler(panel1_Paint);

  using (Graphics g = Graphics.FromImage(_bmp))
    g.Clear(SystemColors.Window);
}

private void panel1_Paint(object sender, PaintEventArgs e)
{
  e.Graphics.DrawImage(_bmp, new Point(0, 0));

}

private void panel1_Click(object sender, MouseEventArgs e)
{
  using (Graphics g = Graphics.FromImage(_bmp))
  {
    g.DrawString("Mouse Clicked Here!", panel1.Font, Brushes.Black, e.Location);
  }
  panel1.Invalidate();
}