【问题标题】:How to draw images in a click event?如何在点击事件中绘制图像?
【发布时间】:2013-06-05 09:07:42
【问题描述】:

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

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);
            }
        }
    }
}

我知道我很可能忽略了一些简单的事情,但如果有人能给我一些关于正在发生的事情的见解,我将不胜感激。谢谢

【问题讨论】:

    标签: c# graphics bitmap drawing


    【解决方案1】:

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

    只需让它知道需要重新粉刷即可。将这行代码添加到方法的底部:

      panel1.Invalidate();
    

    【讨论】:

      【解决方案2】:

      这似乎是与处理面板内的点击事件有关的问题,因为面板内有不同的控件。

      确保您的应用程序处理 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();
      }
      

      【讨论】:

      • 嗯,面板事件正在执行我用几个消息框测试了它,什么没有。然而,它似乎只是混乱的绘图,我现在要试试你的例子,谢谢。
      • @SimonTaylor 很好。尝试一下。但如果设计搞砸了,它不会帮助你。因为,它有助于如何处理事件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多