Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从winform中删除一个已绘制对象?_C#_.net_Winforms - Fatal编程技术网

C# 如何从winform中删除一个已绘制对象?

C# 如何从winform中删除一个已绘制对象?,c#,.net,winforms,C#,.net,Winforms,我已经创建了winform和picturebox,您可以在picturebox的上绘制/放置图标 g2.DrawIcon(SystemIcons.Warning, new Rectangle(screenPositionX, screenPositionY, _levelWidth, _levelHeight)); 但我的问题是,我想能够删除一个按钮按下警告图标,但我不知道如何。 我已经尝试过g2。清除,但这会删除所有图标。 我也试着画过它们,但这画过了所有的东西,我找不到正确的背景色 我的

我已经创建了winform和picturebox,您可以在picturebox的上绘制/放置图标

g2.DrawIcon(SystemIcons.Warning, new Rectangle(screenPositionX, screenPositionY, _levelWidth, _levelHeight));

但我的问题是,我想能够删除一个按钮按下警告图标,但我不知道如何。 我已经尝试过g2。清除,但这会删除所有图标。 我也试着画过它们,但这画过了所有的东西,我找不到正确的背景色


我的问题是,如何删除单个绘制的对象?

在纸上绘制完某个对象后,如果不使用正确的颜色将其完全重新绘制,或者丢弃(清除)所有内容并仅重新绘制应保留的对象,则无法将其取回。这同样适用于
PictureBox

如果此图标是唯一一个有时可见,其他时间不可见的图标,则可以在表单类中引入
bool
字段。如果该
bool
true
,则绘制图标,否则不绘制。然后,当用户单击按钮时,您可以更改该字段的值,并刷新表单

由于您显示的代码很少,所以我不知道您的解决方案中的任何类或方法的名称,所以请考虑此伪代码!

// Pseudo code

class MyForm : Form
{
    // The field that decides whether to draw the icon
    private bool showWarningIcon = true;

    // The button click handler
    public void OnButtonClick()
    {
        showWarningIcon = false;
        Invalidate();
    }

    // The paint handler
    public override void OnPaint(PaintEventArgs e)
    {
        // Draw other things, then:
        if (showWarningIcon)
        {
            g2.DrawIcon(SystemIcons.Warning, new Rectangle(screenPositionX, screenPositionY, _levelWidth, _levelHeight));
        }
    }
}

您需要一个字段来跟踪是否要绘制图标。按下按钮后翻转该值,当需要绘制(绘制事件)时,使用该值确定要绘制的内容

public partial class Form1 : Form
{
    bool showIcons = true;

    public Form1()
    {
        InitializeComponent();
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        var wt = pictureBox1.ClientSize.Width;
        var ht = pictureBox1.ClientSize.Height;

        // draw grid
        for (int i = 0; i < wt; i+=32)
        {
            e.Graphics.DrawLine(Pens.Black, i, 0, i, ht);
        }
        for (int j = 0; j < ht; j+=32)
        {
            e.Graphics.DrawLine(Pens.Black, 0, j, wt, j);
        }

        if (showIcons)
        {
            // draw icons
            e.Graphics.DrawIcon(SystemIcons.Warning, 5*32-1, 2*32-1);
        }
    }

    private void drawButton_Click(object sender, EventArgs e)
    {
        showIcons = true;
        pictureBox1.Refresh();
    }

    private void clearButton_Click(object sender, EventArgs e)
    {
        showIcons = false;
        pictureBox1.Refresh();
    }
}
公共部分类表单1:表单
{
bool showIcons=true;
公共表格1()
{
初始化组件();
}
私有void pictureBox1_Paint(对象发送方,PaintEventArgs e)
{
var wt=pictureBox1.ClientSize.Width;
var ht=pictureBox1.ClientSize.Height;
//绘制网格
对于(int i=0;i

您维护一个要绘制的内容列表,从列表中删除这些内容,然后重新渲染剩下的内容。我认为您必须清除这些内容,然后重新创建图像。对于绘图程序,有两种样式:仅为像素着色的样式,可撤消的选项非常有限。还有那些知道要画的每一件东西的人。您可以在其中选择要删除的特定内容。我希望g2不是由CreateGraphics创建的使用pbox.Paint事件及其e.Graphics参数从要按建议绘制的内容列表中绘制,并在列表更改时通过调用pbox.Invalidate()触发pbox.Paint!您将需要绘制整个列表!!您应该考虑创建一个类,该类保存关于绘制什么的信息以及在何处以及是否绘制它!共享更多图形代码。你提供的那一行代码暗示了很多潜在的问题。谢谢你的建议@CaiusJard,我创建了一个列表,然后将其他图标的位置存储在列表中,并重新呈现了除我想删除的东西以外的所有东西。