通过单击 WinForms 中的按钮在面板上绘图
本文关键字:绘图 按钮 单击 WinForms | 更新日期: 2023-09-27 18:33:17
我正在尝试通过单击按钮制作一个程序以在Panel
(正方形,圆形等(上绘制。
到目前为止,我还没有做太多事情,只是尝试将代码绘制直接绘制到面板上,但不知道如何将其移动到按钮上。这是我到目前为止的代码。
如果您知道比我正在使用的更好的绘图方法,请告诉我。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void mainPanel_Paint(object sender, PaintEventArgs e)
{
Graphics g;
g = CreateGraphics();
Pen pen = new Pen(Color.Black);
Rectangle r = new Rectangle(10, 10, 100, 100);
g.DrawRectangle(pen, r);
}
private void circleButton_Click(object sender, EventArgs e)
{
}
private void drawButton_Click(object sender, EventArgs e)
{
}
}
}
使用这个极其简化的示例类..:
class DrawAction
{
public char type { get; set; }
public Rectangle rect { get; set; }
public Color color { get; set; }
//.....
public DrawAction(char type_, Rectangle rect_, Color color_)
{ type = type_; rect = rect_; color = color_; }
}
具有班级级别List<T>
:
List<DrawAction> actions = new List<DrawAction>();
您将像这样编写几个按钮:
private void RectangleButton_Click(object sender, EventArgs e)
{
actions.Add(new DrawAction('R', new Rectangle(11, 22, 66, 88), Color.DarkGoldenrod));
mainPanel.Invalidate(); // this triggers the Paint event!
}
private void circleButton_Click(object sender, EventArgs e)
{
actions.Add(new DrawAction('E', new Rectangle(33, 44, 66, 88), Color.DarkGoldenrod));
mainPanel.Invalidate(); // this triggers the Paint event!
}
在Paint
事件中:
private void mainPanel_Paint(object sender, PaintEventArgs e)
{
foreach (DrawAction da in actions)
{
if (da.type == 'R') e.Graphics.DrawRectangle(new Pen(da.color), da.rect);
else if (da.type == 'E') e.Graphics.DrawEllipse(new Pen(da.color), da.rect);
//..
}
}
还要使用双缓冲Panel
子类:
class DrawPanel : Panel
{
public DrawPanel()
{ this.DoubleBuffered = true; BackColor = Color.Transparent; }
}
接下来的步骤将是添加更多类型,如线条,曲线,文本;还有颜色,笔宽和样式。还要使其动态化,以便您选择一个工具,然后单击面板。
对于徒手绘画,您需要在MouseMove
等中收集List<Point>
。
工作,很多乐趣。
评论更新:
注意:这是我写的非常简化的。我有画矩形和椭圆等形状的性格。使用更多的代码,您可以为填充矩形和填充椭圆添加更多字符。但是 a( 形状确实应该在枚举中,b( 更复杂的形状,如线条、多边形、文本或旋转的形状,将需要更多数据,而不仅仅是矩形。.
对矩形坐标的限制是一种简化,不是形状的简化,而是数据结构的简化。您的其他形状可以缩小以适合一个矩形(想到四个三角形和两个六边形(;只需添加字符和新的 drawxxx 调用即可。但是,为复杂的形状添加一个列表,也许一个字符串和一个字体将允许更复杂的结果。