改变油漆的颜色
本文关键字:颜色 改变 | 更新日期: 2023-09-27 18:18:28
我已经编写了一个程序,允许用户在表单中使用笔进行绘画。但是有一个问题。
我可以在表格中只设置 2 种颜色,例如,我为左按钮设置黑色,为右按钮设置红色。
我所需要的只是如何将此代码更改为用户可以选择自己的颜色的代码。
我尝试了不同的方式,如颜色对话,但我做不到。
我的代码:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Graphics graphic = this.CreateGraphics();
graphic.DrawLine(Pens.Black, e.X, e.Y, e.X + 1, e.Y + 1);
}
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
Graphics graphic = this.CreateGraphics();
graphic.DrawLine(Pens.Red, e.X, e.Y, e.X + 1, e.Y + 1);
}
}
使用一些对话框为鼠标左键和右键选择颜色,并将其存储在类级变量中,即
if (_leftPen != null) { _leftPen.Dispose(); }
_leftPen = new Pen(selectedColour, 1f);
请注意,1f
是Pen
的厚度,可以更改以满足您的要求。
然后在您的绘图方法中只需使用 _leftPen
.然后只需对鼠标右键应用类似的逻辑,即 _rightPen
.然后,您将拥有:
private Pen _leftPen = Pens.Black;
private Pen _rightPen = Pens.Red;
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Graphics graphic = this.CreateGraphics();
graphic.DrawLine(_leftPen, e.X, e.Y, e.X + 1, e.Y + 1);
}
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
Graphics graphic = this.CreateGraphics();
graphic.DrawLine(_rightPen, e.X, e.Y, e.X + 1, e.Y + 1);
}
}
您需要做的就是找到一种让用户选择自己颜色的方法。
另请注意@Taw的评论:
Winforms图形基本规则#1:永远不要使用控件。创建图形!永远不要尝试缓存图形对象!使用 Graphics g = Graphics.FromImage(bmp( 绘制到 Bitmap bmp 中,或者在控件的 Paint 事件中使用 e.Graphics 参数绘制。系统需要在您无法控制的时候绘制所有控件的表面;因此,要添加到这些曲面的所有内容都必须从系统将调用的一个事件(即 Paint 事件(创建。
您应该在 Paint
事件中使用您的代码,在MouseMove
事件中,您应该存储要绘制的线条的位置,然后稍后更新。
private Pen _leftPen = Pens.Black;
private Pen _rightPen = Pens.Red;
private List<Point> _leftPoints = new List<Point>();
private List<Point> _rightPoints = new List<Point>();
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
_leftPoints.Add(new Point(e.X, e.Y));
}
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
_rightPoints.Add(new Point(e.X, e.Y));
}
this.Invalidate();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
foreach (Point point in _leftPoints)
{
e.Graphics.DrawLine(_leftPen, point.X, point.Y, point.X + 1, point.Y + 1);
}
//Similar code for _rightPoints here
}
请注意,对Invalidate
的调用会强制窗体重新绘制自身。如果适用,您可以改用this.Refresh()
或this.Update()
。
Color BackColor = Color.Black;
Color ForeColor = Color.Red;
然后获取用户颜色并设置Backcolor
和Forecolor
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Graphics graphic = this.CreateGraphics();
graphic.DrawLine(new Pen(ForeColor), e.X, e.Y, e.X + 1, e.Y + 1);
}
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
Graphics graphic = this.CreateGraphics();
graphic.DrawLine(new Pen(BackColor), e.X, e.Y, e.X + 1, e.Y + 1);
}
}
你可以使用这样的东西:
using System;
using System.Drawing;
using System.Windows.Forms;
public partial class Form1 : Form
{
private readonly Graphics graphics;
public Form1()
{
InitializeComponent();
this.graphics = this.CreateGraphics();
this.Load += (s, e) =>
{
foreach (var color in Enum.GetValues(typeof(KnownColor)))
this.UserColors.Items.Add(color);
};
}
/// <summary>
/// Painting (left button use changed color, right-white to erase)
/// </summary>
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
this.graphics.DrawLine(
new Pen(
Color.FromKnownColor(
(KnownColor)Enum.Parse(typeof(KnownColor),
this.UserColors.SelectedItem.ToString()))),
e.X,
e.Y,
e.X + 1,
e.Y + 1);
if (e.Button == MouseButtons.Right)
this.graphics.DrawLine(
Pens.White,
e.X,
e.Y,
e.X + 1,
e.Y + 1);
}
}
哪里这个。UserColors 是主窗口上的 ComboBox。