绘制一个点

本文关键字:一个 绘制 | 更新日期: 2023-09-27 18:13:01

我有一个代码,它将绘制一个图表,如果用户试图调整表单的大小(通过拖动窗体的角)。表单将在文本框中获得x和y坐标。当按钮被按下时,我想画出他们所指示的点。然而,Click事件包含参数Object Sender和EventArgs e. OnPaint方法(为了绘制图形,我重写了它)有参数PaintEventArgs。

因此,当按钮被点击时,我不能执行以下代码:

g.DrawString("♫", new Font("Calibri", 12), new SolidBrush(Color.HotPink), (PlotArea.X + (7 - xMin)* PlotArea.Width/(xMax - xMin)), (PlotArea.Bottom - (6 - yMin) * PlotArea.Height / (yMax - yMin)));

这是因为"g"的类型是PaintEventArgs。我如何绕过这个,以便在onClick方法我可以绘制坐标?

我的代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace PlotIt
{
    public partial class Form1 : Form
    {
        public static List<TheList> GraphPoints = new List<TheList>();
        //Define the drawing area
        private Rectangle PlotArea;
        //Unit defined in world coordinate system:
        private float xMin = 0f;
        private float xMax = 10f;
        private float yMin = 0f;
        private float yMax = 10f;
        //Define the offset in pixel:
        private int offset = 150;
        Graphics g;
        Boolean buttonPressed = false; 
        public Form1()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.BackColor = Color.White;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            g = e.Graphics;
            //Calculate the location and size of the drawing area
            //within which we want to draw the graphics:
            Rectangle rect = ClientRectangle;
            PlotArea = new Rectangle(rect.Location, rect.Size);
            PlotArea.Inflate(-offset, -offset);
            g.DrawRectangle(Pens.Black, PlotArea);
            Pen aPen = new Pen(Color.Green, 3);
            g.DrawLine(aPen, Point2D(new PointF(5, 0)), Point2D(new PointF(5, 10)));
            g.DrawLine(aPen, Point2D(new PointF(0, 5)), Point2D(new PointF(10, 5)));
            aPen.Dispose();
            g.Dispose();

        }

        private PointF Point2D(PointF ptf)
        {
            PointF aPoint = new PointF();
            aPoint.X = PlotArea.X + (ptf.X - xMin) * PlotArea.Width / (xMax - xMin);
            aPoint.Y = PlotArea.Bottom - (ptf.Y - yMin) * PlotArea.Height / (yMax - yMin);
            return aPoint;
        }

        private void btnPlotGraph_Click(object sender, EventArgs e)
        {

            g.DrawString("♫", new Font("Calibri", 12), new SolidBrush(Color.HotPink),    (PlotArea.X + (7 - xMin)* PlotArea.Width/(xMax - xMin)), (PlotArea.Bottom - (6 - yMin) * PlotArea.Height / (yMax - yMin)));
        }

    }
}

绘制一个点

查看控件。CreateGraphics方法。这应该允许您获得所需的Graphic对象。

Graphics g = this.CreateGraphics();
g.DrawString("♫", new Font("Calibri", 12), new SolidBrush(Color.HotPink), (PlotArea.X + (7 - xMin)* PlotArea.Width/(xMax - xMin)), (PlotArea.Bottom - (6 - yMin) * PlotArea.Height / (yMax - yMin)));
g.Dispose();

有一种更合适的方法。

在您的Click事件中,您应该存储坐标,然后调用this.Invalidate()

这将导致你的表单重新绘制自己,触发Paint事件。

也可以手动创建一个图形对象,但更好的做法是通过调用Invalidate来要求表单刷新自己。