Paint中的PaintEventArgs.Graphics和Graphics.FromHwnd之间的差异

时间:2014-03-21 07:23:53

标签: c# winforms draw picturebox

最新

//combination of pictureBox1.Invalidate(); and pictureBox1.Update();
pictureBox1.Refresh(); 

pictureBox1.Refresh();之后,它会触发pictureBox1_Paint

以下代码将在图片框中保留图标。

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (checkBox1.Checked)
    {
        e.Graphics.DrawIcon(IconCamera, rect);
    }
}

以下代码不是!它将在Paint中绘制后立即绘制图标并清除(这就是为什么有我的旧问题)

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Graphics graphic = Graphics.FromHwnd(pictureBox1.Handle);
    if (checkBox1.Checked)
    {
        graphic.DrawIcon(IconCamera, rect);
    }
}

我认为这两个图形是相同的,但看起来它们不一样。

  1. 我可以知道PaintEventArgs的Graphics有什么不同 来自pictureBox1的pictureBox1和Graphics
  2. 为什么{box} 1上的DrawIcon来自句柄的Graphics的事件 pictureBox1将在Paint事件中消失,但在函数I中声明?感谢

  3. 旧问题

    当我选中复选框时,我会在图片框上绘制图标,

    Graphics graphic = Graphics.FromHwnd(pictureBox1.Handle);
    if (checkBox1.CheckState.ToString() == "Checked")
    {
        Icon IconCamera = new Icon("cam.ico");
        Rectangle rect = new Rectangle(100, 100, 32, 32);
        graphic.DrawIcon(IconCamera, rect);
    }
    

    但是在图片框刷新后,

    pictureBox1.Refresh();
    

    绘制的图标将消失

    我可以知道什么是图片框事件或者我可以使用绘图图标代码来维护或始终自动重绘即使在图片框refresh()?谢谢之后,图标也是如此。我尝试了Paint并且{box} 1的Validating无效。

2 个答案:

答案 0 :(得分:2)

最好是一个接一个地使用两个电话:

pictureBox1.Invalidate();
pictureBox1.Update();

这将强制重绘图片框。

然后我订阅Paint事件,当前两行代码被调用时(在重绘图片框的情况下)会发出信号。在这里,我做了所有的图纸。

在你的情况下,它会是这样的:

public void Paint(PaintEventArgs e)
{
    if (checkBox1.Checked)
    {
        Rectangle rect = new Rectangle(100, 100, 32, 32);
        Icon IconCamera = new Icon("cam.ico");
        e.Graphics.DrawIcon(IconCamera, rect);
    }
}

然后,订阅CheckedChanged的事件checkBox1,并从那里开始调用两个重绘命令。

这会导致,当用户更改checkBox1的选中状态时,将强制重绘pictureBox1,并根据checkBox1状态绘制图标。

答案 1 :(得分:0)

您可以避免使用Graphics对象并找到其他方法。我不知道您是否被迫使用图标,但您可以尝试以这种方式使用Label

label1.Image = "yourImage.bmp" // you can use a bitmap

这里有你的陈述。

if(checkBox1.Checked) {
   label1.Visible = true;
   label1.Location = new Point(x, y); // your coordinate 
}

然后你可以处理checkBox1_CheckedChanged和代码:

Void checkBox1_CheckedChanged(object sender, EventArgs e) {
  if(!checkBox1.Checked) {
    label1.Visible = false;
  }
}

希望这可以提供帮助。