c#:单击事件在面板上绘制点

时间:2018-07-04 13:16:43

标签: c#

我是C#的初学者;

我使用的位图等于面板的大小,并将其设置为面板的背景图像。我也想使用setpixel更新位图,面板在单击事件时也会更新。但这在我单击面板时不起作用。

这是我的代码:

public partial class Form1 : Form
    {
        Bitmap bmp; 
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bmp = new Bitmap(panel1.Width, panel1.Height);
            panel1.BackgroundImage = (Image)bmp;
            panel1.BackgroundImageLayout = ImageLayout.None;
        }

        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            label1.Text = (e.Location.X).ToString();
            bmp.SetPixel(e.Location.X, e.Location.Y, Color.White);
            bmp.SetPixel((e.Location.X)+1, e.Location.Y, Color.White);
            bmp.SetPixel((e.Location.X)-1, e.Location.Y, Color.White);
            bmp.SetPixel(e.Location.X, (e.Location.Y)+1, Color.White);
            bmp.SetPixel(e.Location.X, (e.Location.Y)-1, Color.White);
        }
    }

1 个答案:

答案 0 :(得分:3)

您不更新面板。致电

panel1.Invalidate();

绘制位图后。


如果您使用MouseMove事件,还可以连续绘制:

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left) {
        bmp.SetPixel(e.Location.X, e.Location.Y, Color.Green);
        bmp.SetPixel((e.Location.X) + 1, e.Location.Y, Color.Green);
        bmp.SetPixel((e.Location.X) - 1, e.Location.Y, Color.Green);
        bmp.SetPixel(e.Location.X, (e.Location.Y) + 1, Color.Green);
        bmp.SetPixel(e.Location.X, (e.Location.Y) - 1, Color.Green);
        panel1.Invalidate(
            new Rectangle(e.Location.X - 1, e.Location.Y - 1, 3, 3));
    }
}

确保仅在按下鼠标左键时才进行绘制,并且仅使已更改以最小化闪烁的面板上的矩形无效。


关于Invalidate()的注释:无效不会立即更新图像。相反,它告诉Windows我们想要更新。 Windows然后确定无效区域是否可见。它的顶部可能有另一个窗口,它可能不在屏幕上,或者该窗口可以最小化。然后它等待,直到应用程序处于空闲状态。这样可以防止积累过多的未处理事件(例如MouseMove)。这意味着Invalidate可能会跳过一些更新。这很好,因为它避免了滞后。

相关问题