Построение точки - PullRequest
       5

Построение точки

1 голос
/ 01 ноября 2011

У меня есть код, который нарисует график, который масштабируется, если пользователь пытается изменить размер формы (перетаскивая углы формы).Форма получит координаты 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)));
        }



    }

}

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Есть более подходящий способ сделать это.

В вашем Click событии вы должны сохранить координаты, а затем вызвать this.Invalidate().

Это вызовет вашу формуперерисовать себя, вызывая событие Paint.

Также возможно создать графический объект вручную, но лучше попросить форму обновить себя, вызвав Invalidate.

2 голосов
/ 01 ноября 2011

Посмотрите на метод Control.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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...