我是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);
}
}
答案 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
可能会跳过一些更新。这很好,因为它避免了滞后。