Окно проверки недействительности метода в C # - PullRequest
0 голосов
/ 12 сентября 2011

Я хочу нарисовать что-нибудь в графическом окне и удалить их.в этом случае мне нужно нарисовать заливочный круг и через некоторое время удалить его и нарисовать круг без заливки.

Я использую приведенный ниже код, но когда я хочу удалить фигуру, мне нужно нарисовать Picturebox в другой раз сновая форма, и это вызывает чувствительное изменение в картинке box.now, я знаю, что должен использовать метод invalidate ().но я не знаю, где и как мне это использовать.

void pbmapDo()
    {
        Graphics graphicPBMap  = pbMap.CreateGraphics();
        // usually Values : gridNeedUpdate = true; rulersNeedUpdate = true; rulerNeedUpdate = true; backGroundNeedUpdate = true; nodesNeedUpdate = true;
        if (backGroundNeedUpdate)
        {
            Bitmap srce = new Bitmap(BackGround);
            Bitmap dest = new Bitmap(pbMap.Width, pbMap.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
            Graphics gr = Graphics.FromImage(dest);
            gr.DrawImage(srce, new Rectangle(Point.Empty, dest.Size));
            graphicPBMap.DrawImage(dest, 0, 0);
        }
        backGroundNeedUpdate = false;

        if (isGridShow && gridNeedUpdate)
        {
            for (int i = 0; i < pbMap.Width / 60 + 1; i++)
            {
                graphicPBMap.DrawLine(gridPen, pbMap.Width - i * 60, 0, pbMap.Width - i * 60, pbMap.Height);
            }
            for (int i = 0; i < pbMap.Height / 60 + 1; i++)
            {
                graphicPBMap.DrawLine(gridPen, pbMap.Width, i * 60, 0, i * 60);
            }
        }
        gridNeedUpdate = false;

        if (isShowRulers && rulersNeedUpdate )
        {
            graphicPBMap.DrawLine(new Pen(Brushes.Black, 46), pbMap.Width - 1, pbMap.Height - 1, 0 - 1, pbMap.Height - 1);
            graphicPBMap.DrawLine(new Pen(Brushes.Black, 49), 0, 0, 0, pbMap.Height);

            for (int i = 0; i < pbMap.Width / 60 + 1; i++)
            {
                graphicPBMap.DrawString(XPixelToLong((double)pbMap.Width - i * 60).ToString(), new Font("Tahoma", 7), Brushes.White, pbMap.Width - i * 60, pbMap.Height - 15);
                graphicPBMap.DrawLine(gridPen, pbMap.Width - i * 60, pbMap.Height - 24, pbMap.Width - i * 60, pbMap.Height);
            }
            for (int i = 0; i < pbMap.Height / 60 + 1; i++)
            {
                graphicPBMap.DrawLine(gridPen, 0, i * 60, 25, i * 60);
                graphicPBMap.DrawString(YPixelToLat(i * 60).ToString(), new Font("Tahoma", 7), Brushes.White, 0, i * 60);
            }
        }
        rulersNeedUpdate = false;

        if (rulerNeedUpdate)
        {
            if (x0ruler != -1 && y0ruler != -1)
            {
                if (x1ruler != -1 && y1ruler != -1)
                {
                    Rectangle rectAngle = new Rectangle((int)(x1ruler - 1), (int)(y1ruler - 1), 2, 2);
                    graphicPBMap.DrawEllipse(rulerPen, rectAngle);
                    graphicPBMap.DrawLine(rulerPen, x0ruler, y0ruler, x1ruler, y1ruler);
                    rectAngle = new Rectangle((int)(x0ruler - 1), (int)(y0ruler - 1), 2, 2);
                    graphicPBMap.DrawEllipse(rulerPen, rectAngle);
                }
                else
                {
                    Rectangle rectAngle = new Rectangle((int)(x0ruler - 1), (int)(y0ruler - 1), 2, 2);
                    graphicPBMap.DrawEllipse(rulerPen, rectAngle);
                }
            }

        }
        rulerNeedUpdate = false;

        if (nodesNeedUpdate)
        {
            nodesNeedUpdate = false;
            Node node;
            for (int i = 0; i < nodes.Count; i++)
            {
                node = (Node)(nodes[i]);
                if (node.IsOn)
                {
                    drawOnCircle(graphicPBMap,node.Longitude, node.Latitude, node.RInMeter, node.IsSelected);
                }
                else
                {
                    drawOffCircle(graphicPBMap, node.Longitude, node.Latitude, node.RInMeter, node.IsSelected);
                }
            }
        }
    }

РЕДАКТИРОВАТЬ 1:

я один раз изменил код.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2011

извините за опоздание.попробуйте это

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    Bitmap bckMap = null;

    private void Form1_Load(object sender, EventArgs e)
    {
        bckMap = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height);
        using (Graphics g = Graphics.FromImage(bckMap))
        {
            g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, 0, bckMap.Width, bckMap.Height));
            g.Dispose();
        }

        pictureBox1.BackgroundImage = bckMap;

    }

    private void button2_Click(object sender, EventArgs e)
    {
        pictureBox1.Image = null;
        Bitmap ellips = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height);
        using (Graphics g = Graphics.FromImage(ellips))
        {
            g.FillEllipse(new SolidBrush(Color.Red), new Rectangle(0, 0, ellips.Width, ellips.Height));
            g.Dispose();
        }
        this.pictureBox1.Image = ellips;

    }

    private void button1_Click(object sender, EventArgs e)
    {
        pictureBox1.Image = null;
        Bitmap ellips = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height);
        using (Graphics g = Graphics.FromImage(ellips))
        {
            g.FillRectangle(new SolidBrush(Color.Green), new Rectangle(5, 5, ellips.Width-10, ellips.Height-10));
            g.Dispose();
        }
        this.pictureBox1.Image = ellips;
    }
0 голосов
/ 26 сентября 2011

Я наконец-то нашел решение.

Мне нужно использовать событие рисования для графического блока.

private void pbMap_Paint(object sender, PaintEventArgs e)
    {
       //do every think you want with picture box like draw circle or change background
    }

В этом событии я вкладываю все мысли, которые хочу сделать с pbMap изображениемbox.

и когда я изменил некоторые из них, я вызываю функцию ниже, чтобы применить мои изменения,

    public void updateMap()
    {
        if (pbMap.InvokeRequired) // just if you call in thread
        {
            pbMap.Invoke(new Action(() => pbMap.Invalidate()));
        }
        else
        {
            pbMap.Invalidate();
        }
    }
0 голосов
/ 12 сентября 2011

Вы можете использовать invalidate() или pictureBox.image = null;, где вам нужно изменить изображение вашего Picturebox. Во всяком случае, не обязательно менять фон всегда. Вместо этого вы можете создать свое растровое изображение и разместить его как pictureBox.Image = bitmap. Если вам нужен точный пример исходного кода, дайте мне знать.

...