Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Paint και UserControl

Îåêßíçóå áðü ôï ìÝëïò nikos123. Τελευταία δημοσίευση από το μέλος nikos123 στις 28-01-2009, 10:00. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  27-01-2009, 16:56 47950

    Paint και UserControl


    Γεια σας.  
     
    Φτιαχνώ ένα userControl το οποιο θα δείχνει πότε μια δραστηριότητα ειναι ON η OFF για κάποιο διαστημα.
     
    Π.χ. στο control ορίζω το σύνολο διαστηματος  startDate = 01/01/2009 και endDate = 31/05/2009.

    Αν η δραστηριότητα είναι ενεργή στα διαστήματα 17/01 - 20/02,  15/03 - 25/03 και 20/04 - 30/04 θα δείχνει τρία πράσινα
    ορθογώνια σε ανάλογες (σε σχέση με το Size.Width του Control) θέσεις και πλάτη κατα μήκος του Control. Tο υπόλοιπο θα είναι αλλο χρώμα.

    Εχω προσθέσει και μια λειτουργεία Zoom που αυξομειώνει το πλάτος του control.

    Οταν τα διαστηματα ειναι πολύ μικρά σε σχέση με το συνολικό διαστημα (και το πλάτος του Control ειναι μικρό), τα πλάτη αυτών τον ορθογώνιων μειώνονται και απο 1 pixel γίνονται 0 απότομα.

    Αν έχετε προσέξει στα προγράμματα torrent Embarrassed εχει μια μπαρα που δείχνει τις "περιοχες" του αρχείου που έχουν κατέβει.
    Οταν μειώνουμε το πλάτος της μπάρας (το ColumnHeader της λιστας ) οι "περιοχες" (που μπορει να είναι 0.1% του αρχείου) μειώνονται ομαλά χωρίς να εξαφανίζονται και δίνουν την αίσθηση ότι έχουν πλάτος μικρότερο από 1 pixel.

    Ευχαριστώ.


  •  27-01-2009, 17:06 47951 σε απάντηση της 47950

    Απ: Paint και UserControl

    Απ' ότι κατάλαβα δεν εννοείς ένα user control, το οποίο περιέχει διάφορα controls. Μάλλον θα εννοείς κάτι σαν το progress bar όσον αφορά το παράδειγμα με τα torrent. Τώρα αυτό που θες να κάνεις μπορείς να το πετύχεις με ένα datagrid. Στο ένα column θα έχεις τις ημερομηνίες και στο άλλο την κατάσταση (status = ON/OFF), το οποίο θα χρωματίζεται ανάλογα με το status.
  •  27-01-2009, 20:40 47953 σε απάντηση της 47951

    Απ: Paint και UserControl

    Συνημμένα: WindowsFormsApplication1.zip
    Είναι καλύτερο σε αυτή την περίπτωση να προχωρήσεις σε λίγη ζωγραφική. Ο παρακάτω κώδικας θεωρεί ότι η περίοδοι δίνονται με τη σωστή σειρά. Με λίγο ακόμα κώδικα μπορείς να το βελτιώσεις και να βάλεις και εφέ χρωματισμών. Επισυνάπτω sample project.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public class Period
    {
    public DateTime Start { get; set; }

    public DateTime End { get; set; }
    }

    public class PeriodsBar : Control
    {
    public List<Period> Periods { get; private set; }

    public PeriodsBar()
    {
    this.Periods = new List<Period>();
    this.BackColor = Color.Black;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
    if (this.Periods == null || this.Periods.Count == 0) return;

    var start = Periods.First().Start;
    var end = Periods.Last().End;
    var totalLength = (end - start).TotalMilliseconds;

    // project periods collection into a list with milliseconds from start and milliseconds in width
    var list = from p in this.Periods
    select new { Start = (p.Start - start).TotalMilliseconds, Length = (p.End - p.Start).TotalMilliseconds };

    var brush = Brushes.Green;

    foreach (var period in list)
    {
    var x = (period.Start / totalLength) * e.ClipRectangle.Width;
    var w = (period.Length / totalLength) * e.ClipRectangle.Width;
    e.Graphics.FillRectangle(brush, (float)x, 0, (float)w, e.ClipRectangle.Height);
    }
    }
    }
    Παράδειγμα χρήσης:
    1
    2
    3
    4
    periodsBar1.Periods.Add(new Period { Start = new DateTime(2009, 1, 3), End = new DateTime(2009, 1, 5) });
    periodsBar1.Periods.Add(new Period { Start = new DateTime(2009, 1, 8), End = new DateTime(2009, 1, 12) });
    periodsBar1.Periods.Add(new Period { Start = new DateTime(2009, 1, 17), End = new DateTime(2009, 1, 18) });
    periodsBar1.Periods.Add(new Period { Start = new DateTime(2009, 1, 25), End = new DateTime(2009, 1, 30) });


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  27-01-2009, 23:11 47954 σε απάντηση της 47953

    Απ: Paint και UserControl

    Cool Πολύ ωραίος κώδικας ... Beautiful :) Yes

    Αυτό θα πεί και MVP μάλλον :)
  •  28-01-2009, 10:00 47961 σε απάντηση της 47953

    Απ: Paint και UserControl

    Σ ευχαριστώ Δημήτρη.
    Κατι παρόμιο έχω κανει και εγώ (οχι σε C# 3.0 ακόμα).
    Τελικά το SmoothingMode.AntiAlias χρειαζόταν

    // α)
    g.FillRectangle(Brushes.Red, 0, 0, 40, 20);
    float width = 0.04f;
    g.FillRectangle(Brushes.Green, 20, 0, width, 20);


    // β)
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    g.FillRectangle(Brushes.Red, 0, 30, 40, 20);
    float width2 = 0.01f;
    g.FillRectangle(Brushes.Green, 20,30, width2, 20);



    Στο α)  αν width<0.04 δεν φαίνεται καθόλου και αν 0.04 < width<2 έχει πλατος πάντα 2. (Μαλλον δεν έχουν νόημα τα float εδω)
    Στο β) το "στενεμα" είναι ομαλο και μπορώ να βάλω μεχρι 0.01 πλατος.









Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems