Рисование более 1 рисунка на pictureBox1 с помощью button_Click + смешанная графика

Я делаю приложение в приложении Windows Forms. Называется артгенератор.

Смысл этого приложения в том, что каждый раз, когда я нажимаю кнопку, например кнопку «эллипс», на форме будет нарисован эллипс. Теперь все идет гладко, пока я не нажму все три кнопки друг за другом. Затем приложение объединяет все цифры в 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);
                }
            }
          }          
       }
   }

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

введите здесь описание изображения

Еще одна вещь. Поскольку мой размер и расположение графики случайны, все они исчезают (наполовину) с экрана. Это поправимо или это часть случайности?

заранее спасибо

Кстати я новичок в программировании


person Maxime de Lange    schedule 04.01.2015    source источник
comment
that's not what I want чего делать ты хочешь? трудно предложить решение, не зная этого.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 04.01.2015
comment
Вы устанавливаете новые, но не сбрасываете старые графические типы. Также: Прочтите Enum!!   -  person TaW    schedule 04.01.2015
comment
Вместо этого рассмотрите возможность использования enum с оператором switch().   -  person John Alexiou    schedule 04.01.2015


Ответы (2)


Измените оператор if на это:

if (TekenRechthoek)
{
}
else if ( TekenLijn )
{
}
else if ( TekenCirkel )
{
}
person Sievajet    schedule 04.01.2015
comment
Спасибо, что принесли мне некоторые из них. Теперь другое :) из-за этого я получаю квадрат, если я нажимаю на эллипс (конечно, после того, как я нажал квадрат). Таким образом, похоже, что они привязаны к другой кнопке после того, как на них нажали, спасибо за ответ. - person Maxime de Lange; 04.01.2015
comment
Установите логические значения в false, как только они будут нарисованы - person Sievajet; 04.01.2015
comment
да капитан очевидно. Спасибо, чувак :) Любая идея о сохранении графики на картинке? из-за случайного положения X и Y он повсюду (должен быть случайным), но желательно, чтобы он не выпадал за пределы экрана. Или что-то подобное неизбежно, когда вы работаете с рандомами? - person Maxime de Lange; 04.01.2015
comment
НЕТ, только если вы полностью отказываетесь от применения какой-либо базовой математики.. Подсказка: вам нужно сначала установить позицию, затем вы можете ограничить диапазон допустимых размеров.. - person TaW; 04.01.2015
comment
Вы можете рисовать везде, где хотите, поэтому вам нужно проверить границы формы. Не так много опыта с рисованием winforms. - person Sievajet; 04.01.2015

Не совсем понятно, что вы хотите, чтобы происходило при нажатии каждой кнопки. Если это по одному, простой способ использовать 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 переменных для отслеживания состояния одного изображения обычно приводит к путанице.

person Ňɏssa Pøngjǣrdenlarp    schedule 04.01.2015
comment
Спасибо за ответ, я не могу использовать переключатель, даже если это лучше. Я учусь в классе программирования, и они хотят, чтобы я сделал это с помощью кнопок :( есть идеи с положением X и Y? что графика не будет падать с экрана или это неизбежно из-за рандома? - person Maxime de Lange; 04.01.2015
comment
КНОПКА радио не является КНОПКОЙ? Он даже будет выглядеть точно так же на экране, используя свойство Appearance. - person Ňɏssa Pøngjǣrdenlarp; 04.01.2015
comment
о, я не так уж много знаю об инструментах. Я получил бумагу из школы, которая описывает задание. Они говорят, что нужно использовать кнопку, а мы никогда не использовали радиокнопку, спасибо за ответ. - person Maxime de Lange; 04.01.2015