C# 图形中PaintEventArgs.Graphics和Graphics.FromHwnd之间的差异 最新的

C# 图形中PaintEventArgs.Graphics和Graphics.FromHwnd之间的差异 最新的,c#,winforms,draw,picturebox,C#,Winforms,Draw,Picturebox,在pictureBox1.Refresh()之后,它将触发pictureBox1\u Paint 以下代码将使图标保留在图片框上 private void pictureBox1_Paint(object sender, PaintEventArgs e) { if (checkBox1.Checked) { e.Graphics.DrawIcon(IconCamera, rect); } } 下面的代码不是!它将绘制图标,并在用油漆绘制后不久将其清除(

pictureBox1.Refresh()之后,它将触发
pictureBox1\u Paint

以下代码将使图标保留在图片框上

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (checkBox1.Checked)
    {
        e.Graphics.DrawIcon(IconCamera, rect);
    }
}
下面的代码不是!它将绘制图标,并在用油漆绘制后不久将其清除(这就是为什么我的老问题)

我以为这两个图形是一样的,但看起来好像不一样

  • 我可以知道绘画事件参数的
    图形
    有什么不同吗
    pictureBox1和pictureBox1手柄上的
    图形
  • 为什么在pictureBox1上使用
    图形绘制事件的
    DrawIcon
    pictureBox1将在绘制事件中消失,但在函数I中不会消失 宣布?谢谢

  • 老问题 选中复选框后,我将在图片框上绘制图标

    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();
    
    绘制的图标将消失


    我可以知道picturebox事件是什么吗?或者我可以使用它来输入绘图图标代码,以维护,或者总是自动重新绘制图标,即使在图片框
    刷新()之后也是如此?
    谢谢。我尝试了
    Paint
    验证picturebox1无法工作。

    最好是依次使用两个调用:

    pictureBox1.Invalidate();
    pictureBox1.Update();
    
    这将强制重新绘制picturebox

    然后我订阅
    Paint
    事件,当调用前两行代码时(在重新绘制picturebox的情况下)会发出信号。我在这里画所有的画

    在您的情况下,可能是这样的:

    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);
        }
    }
    
    然后,订阅
    checkBox1
    的event
    CheckedChanged
    ,并从本文开始调用这两个重画命令


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

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

    label1.Image = "yourImage.bmp" // you can use a bitmap
    
    你的陈述来了

    if(checkBox1.Checked) {
       label1.Visible = true;
       label1.Location = new Point(x, y); // your coordinate 
    }
    
    然后,您可以处理
    复选框1\u checked changed
    和代码:

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

    希望这能有所帮助。

    你是说刷新后?实际上,我需要将我的绘图图标放置到一个事件中,该事件将在刷新picturebox后始终触发。Thanks我的意思是在改变picturebox的代码末尾调用它。它将强制它重画。我应该把重画的代码放在哪里?我们重新绘制了picturebox事件?谢谢,它已经完成了。汉斯·帕桑:我不这么认为。Invalidate不会立即绘制,它只会将其添加到类似“待办事项列表”的内容中。来自MSDN:调用Invalidate方法不会强制同步绘制;要强制同步绘制,请在调用Invalidate方法后调用Update方法。如果在没有参数的情况下调用此方法,则整个客户端区域将添加到更新区域。我可以在一张图片中绘制多个图标,您的方法是加载某种背景图像来标记,而不是我的答案
    if(checkBox1.Checked) {
       label1.Visible = true;
       label1.Location = new Point(x, y); // your coordinate 
    }
    
    Void checkBox1_CheckedChanged(object sender, EventArgs e) {
      if(!checkBox1.Checked) {
        label1.Visible = false;
      }
    }