通过单击 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)
    {
    }
}

}

通过单击 WinForms 中的按钮在面板上绘图

使用这个极其简化的示例类..:

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 调用即可。但是,为复杂的形状添加一个列表,也许一个字符串和一个字体将允许更复杂的结果。