使用 button_Click + 混合图形在 pictureBox1 上绘制多于 1 个图形
Drawing more then 1 graphics on pictureBox1 with button_Click + mixed up graphics
我正在 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);
}
}
}
}
}
这是全部代码。下面我也放一张图给大家看看我说的组合图是什么意思。
还有一件事。因为我的图形大小和位置都是随机的,所以它们都会从屏幕上消失 (half-ish)。这是可修复的还是 random-ness 的一部分?
提前致谢
顺便说一句,我是编程初学者
将您的 if 语句更改为:
if (TekenRechthoek)
{
}
else if ( TekenLijn )
{
}
else if ( TekenCirkel )
{
}
不完全清楚您想要在按下每个按钮时发生什么。如果一次一个,我们使用 RadioButtons
的简单方法。将外观设置为 "Button",它们将像切换按钮一样工作 - 它们会保持向下状态,直到按下另一个按钮。此外,一次只能按一个,这听起来像你想要的。
然后跟踪要绘制的形状:
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 个变量来跟踪一个图像状态通常会导致混淆。
我正在 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);
}
}
}
}
}
这是全部代码。下面我也放一张图给大家看看我说的组合图是什么意思。
还有一件事。因为我的图形大小和位置都是随机的,所以它们都会从屏幕上消失 (half-ish)。这是可修复的还是 random-ness 的一部分?
提前致谢
顺便说一句,我是编程初学者
将您的 if 语句更改为:
if (TekenRechthoek)
{
}
else if ( TekenLijn )
{
}
else if ( TekenCirkel )
{
}
不完全清楚您想要在按下每个按钮时发生什么。如果一次一个,我们使用 RadioButtons
的简单方法。将外观设置为 "Button",它们将像切换按钮一样工作 - 它们会保持向下状态,直到按下另一个按钮。此外,一次只能按一个,这听起来像你想要的。
然后跟踪要绘制的形状:
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 个变量来跟踪一个图像状态通常会导致混淆。