Nieprzewidywalne rysowanie się poziomych linii

0

Witam,projektuję małą bibliotekę do robienia wykresów funkcji liniowej i mam mały kłopot przy rysowaniu poziomych linii siatki.Moim zamiarem było aby zaznaczając kontrolkę można było zadecydować ile takich linii powinno być,niestety wszystko działa dobrze w przypadku jednej osi,gdy dodaję więcej osi to przeskakują one nie tam gdzie chce,uciekają w prawo.
Zamieszczam poniżej kod całej kontrolki i jeszcze mam dodatkowo pytanie bo aby osie sie narysowały muszę użyć opcji Build Solution a chciałbym aby robiło się to od razu po zmienieniu wartości w Designerze.

Kod Kontrolki :

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace EBinder.CustomControls.Charts
{
    public class LinearChart : Control
    {
        public Pen MyPen;

        public int Maxvalue;
        public int Minvalue;

        public int zero = 0;
      
        public int yAxisLines;
       
        public int xAxisLines;



        public int YLineX = 0;
        public int YLineY = 30;


        public Point PY1;
        public Point PY2;

        public Point y1;
        public Point y2;

        public LinearChart()
        {
            this.SuspendLayout();
            Points = new List<Point>();
            PY1 = new Point(20, 50);
            PY2 = new Point(20, Height - 20);



        }
        public int MinValue
        {
            get { return Minvalue; }
            set { Minvalue = value; }
        }
        public int MaxValue
        {
            get { return Maxvalue; }
            set { Maxvalue = value; }
        }

        
        public int YAxisLines
        {
            get { return yAxisLines; }
            set { yAxisLines = value; }
        }
       
        public int XAxisLines
        {
            get { return xAxisLines; }
            set { xAxisLines = value; }
        }


        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public List<Point> Points { get; set; }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            System.Diagnostics.Debug.WriteLine("Liczba elementów: " + Points.Count);
            MyPen = new Pen(Brushes.Black, 2);

            //PY1 = new Point(20, 50);
            //PY2 = new Point(20, Height - 20);

            g.DrawLine(MyPen, new Point(20, 50), new Point(20, Height - 20));// Oś Y
            g.DrawLine(MyPen, new Point(35, 65), new Point(20, 50));//Strzałka Y     Prawa                                                               
            g.DrawLine(MyPen, new Point(5, 65), new Point(20, 50)); //Strzałka Y

            g.DrawLine(MyPen, new Point(20, Height - 20), new Point(Width - 50, Height - 20)); //Oś X 
            g.DrawLine(MyPen, new Point(Width - 50, Height - 20), new Point(Width - 65, Height - 5));//Strzałka X
            g.DrawLine(MyPen, new Point(Width - 50, Height - 20), new Point(Width - 65, Height - 35));//Strzałka X

            g.DrawString(this.Text, new Font("Segoe UI", 12), Brushes.Black, new PointF(Width / 2 - 5 - 45, 5)); // Tytuł Wykresu

            
            for (int y = 0; y < YAxisLines; y++)
            {
                //PY1 = new Point(20, 50);
                //PY2 = new Point(20, Height - 20);

                //public int YLineX = 30;
                //public int YLineY = 30;

                //g.DrawLine(MyPen, new Point(50, 80), new Point(50, Height - 20));
                 YLineX += 30;
                 g.DrawLine(MyPen,new Point(PY1.X + YLineX,80),new Point(PY2.X + YLineX,Height - 20));
                
            }

            g.Dispose();

        }
       
    }
}

Zapomniałem jeszcze dodać,przy zmienianiu rozmiaru kontrolki osie w ogóle gdzieś znikają w prawo i nie chcą wrócić na miejsce :P .

0

Poziome linie się nie rysują ponieważ nigdzie tego nie robisz. Pokaż kod jak to realizujesz to będzie można coś więcej powiedzieć. Pionowe rysują się ok, pomijając fakt, że zawsze w odstępach 30pikseli
Zauważ za YLineX po kolejnym wejsciu do OnPaint nie jest ustawiane na 0. Czyli przy kolejnym rysowaniu linie zaczynają się np od x=20+180(dla YAxisLines=5)
Strzałki mógłbyś zrobić za pomocą CustomLineCap: http://msdn.microsoft.com/pl-pl/library/system.drawing.drawing2d.customlinecap%28v=vs.110%29.aspx

Robi Ci się straszny bałagan w tym kodzie, nie myślałeś, żeby podzielic to jakoś na klasy, tak, żeby kontrolce było cos w stylu:

wykres = new Wykres("Funkcja kwadratowa",
(x)=> x*x+5,//wzor funkcji albo lista punktów, zalezy jak sam to widzisz :)
20, //odstepy linii x 
20,//odstepy linii y );
rysownikWykresow = new RysownikWykresow(wykres);
rysownikWykresow.KolorSiatki = Color.Gray // na tej podstawie klasa stworzy Pen
rysownikWykresow.KolorWykresu = ...
rysownikWykresow.FontTextu=.. //itd..

potem w OnPaint jedna jedyna linijka:

rysownikWykresow.Rysuj(e.Graphics);
0

Linie się owszem rysują,ale uciekają na prawo za każdym razem gdy coś zrobię z kontrolką,poza tym odstępy nie są równe.
Rysują się dokładnie tutaj:

for (int y = 0; y < YAxisLines; y++)
            {
                //PY1 = new Point(20, 50);
                //PY2 = new Point(20, Height - 20);
 
                //public int YLineX = 30;
                //public int YLineY = 30;
 
                //g.DrawLine(MyPen, new Point(50, 80), new Point(50, Height - 20));
                 YLineX += 30;
                 g.DrawLine(MyPen,new Point(PY1.X + YLineX,80),new Point(PY2.X + YLineX,Height - 20));
 
            }
 
1

Napisałem Ci, żę:

Zauważ za YLineX po kolejnym wejsciu do OnPaint nie jest ustawiane na 0

Co się dziwisz, że uciekaja..

Nie są równe? Daj screena

1 użytkowników online, w tym zalogowanych: 0, gości: 1