使用button_Click +混合图形在pictureBox1上绘制超过1个图形

时间:2015-01-04 19:53:20

标签: c# graphics buttonclick

我正在Windows窗体应用程序上创建一个应用程序。它被称为艺术家。

这个应用程序的意思是每次我点击一个按钮,例如按钮" ellipse"将在表单上绘制一个椭圆。现在一切都很顺利,直到我互相按下所有三个按钮。然后应用程序将所有数字组合成1.而这不是我想要的。在我绘制1个椭圆,正方形或线条之后,我再次按下相同的按钮,图形消失并出现一个新的。如何解决这些问题?

我将在下面发送我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Kunstgenerator
{

    public partial class Form1 : Form
    {
        bool TekenCirkel = false;
        bool TekenRechthoek = false;
        bool TekenLijn = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            pictureBox1.Hide();
        }

        private void btnCirkel_Click(object sender, EventArgs e)
        {
            TekenCirkel = true;
            pictureBox1.Show();
            pictureBox1.Refresh();
        }

        private void btnRechthoek_Click(object sender, EventArgs e)
        {
            TekenRechthoek = true;
            pictureBox1.Show();
            pictureBox1.Refresh();
        }

        private void btnLijn_Click(object sender, EventArgs e)
        {
            TekenLijn = true;
            pictureBox1.Refresh();
            pictureBox1.Show();
        }

        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            Refresh();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
                // Er wordt een Random aangemaakt.
                Random random = new Random();

                // Breedte en hoogte wordt aangemaakt en verwezen naar zichzelf.
                // Hier wordt de Random gebruikt om een willekeurige hoogte en breedte te maken.
                int width = random.Next(this.Width);
                int height = random.Next(this.Height);

                // Primaire kleuren Rood, Geel, Blauw worden hier aangemaakt.
                // Door de Random is de kleuren willekeurig. Er wordt een kleur uitgekozen tussen 1 en 255
                int r = random.Next(255);
                int g = random.Next(255);
                int b = random.Next(255);

            if (TekenRechthoek)
            {
                Graphics graphics = e.Graphics;
                if (random.Next(2) == 0)
                {
                    graphics.FillRectangle(new SolidBrush(Color.FromArgb(r, g, b)), width, height, width, height);
                }
                else
                {
                    graphics.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(r, g, b))), width, height, width, height);
                } 

            }
            if (TekenLijn)
            {
                Graphics graphics = e.Graphics;
                graphics.DrawLine(new Pen(new SolidBrush(Color.FromArgb(r, g, b))), width, height, width, 100);
            }

            if (TekenCirkel)
            {
                Graphics graphics = e.Graphics;

                if (random.Next(2) == 0)
                {
                    graphics.FillEllipse(new SolidBrush(Color.FromArgb(r, g, b)), width, height, width, height);
                }
                else
                {
                    graphics.DrawEllipse(new Pen(new SolidBrush(Color.FromArgb(r, g, b))), width, height, width, height);
                }
            }
          }          
       }
   }

这是所有代码。我在下面放了一张图片,向大家展示我对组合图形的意思。

enter image description here

另一件事。因为我的图形的大小和位置都是随机的,所以它们都从屏幕上消失(半个ish)。这是可修复的还是随机性的一部分?

提前致谢

顺便说一下,我是编程的初学者

2 个答案:

答案 0 :(得分:2)

将您的if语句更改为:

if (TekenRechthoek)
{
}
else if ( TekenLijn )
{
}
else if ( TekenCirkel )
{
}

答案 1 :(得分:1)

按下每个按钮时,您想要发生什么并不完全清楚。如果它是一次一个,我们可以轻松使用RadioButtons。将外观设置为"按钮"它们将像切换按钮一样 - 它们保持向下直到另一个按下。此外,一次只能按下一个,这听起来像你想要的那样。

然后跟踪要绘制的形状:

private enum Shapes
{
    Circle,
    Line,
    Rect
}

// current shape var with default val
private Shapes thisShape = Shapes.Circle;

然后设置当前形状以在每个检查更改事件中绘制:

private void rbCircle_CheckedChanged(object sender, EventArgs e)
{
    if (rbCircle.Checked) {
        thisShape = Shapes.Circle;
    }
}

单击其他按钮时,它将设置为该形状指示器。然后根据thisShape的值绘制正确的形状。使用3个变量来跟踪一个图像状态通常会导致混淆。

相关问题