Announcement

Collapse
No announcement yet.

Control verdeckt OnPaint-Ergebnis

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Control verdeckt OnPaint-Ergebnis

    Hallo Experten,

    ich möchte, dass eine Trackbar ihr Minimum und ihr Maximum anzeigt. Dafür habe ich ein UserControl angelegt, das eine Trackbar in exakt der Größe des UserControl enthält.
    Im Eventhandler für UserControl.Paint sollen dann die Zahlen gezeichnet werden:
    Code:
    private void NumberedTrackBar_Paint(object sender, PaintEventArgs e)
    {
        string strMin = tb0.Minimum.ToString();
        string strMax = tb0.Maximum.ToString();
    
        // Calculate dimensions of strings
        RectangleF rctMin = SizeOf(strMin, e.Graphics, this.Font);
        RectangleF rctMax = SizeOf(strMax, e.Graphics, this.Font);
    
        // Draw minimum into lower left corner
        e.Graphics.DrawString(strMin, this.Font, SystemBrushes.ControlText, new PointF(3, this.Height - rctMin.Height));
    
        // Draw maximum into lower right corner
        e.Graphics.DrawString(strMax, this.Font, SystemBrushes.ControlText, new PointF(this.Width - 3 - rctMax.Width, this.Height - rctMax.Height));
    }
    Ich sehe die Zahlen aber nur dann, wenn ich die Trackbar auf Visible=false setze. Daraus folgere ich
    1. Die Zahlen werden wie gewünscht gezeichnet
    2. Die Trackbar wird hernach neu gezeichnet und verdeckt die Zahlen wieder.

    Kann ich diese Reihenfolge umkehren?

    Anderer Ansatz: Die Zahlen als Labels auszuführen habe ich schon versucht. Das verdeckt aber viel mehr von der Trackbar als es sollte, weil der Hintergrund der Labels eine Farbe <> Transparent ist.

    Hat jemand eine Idee in der Richtung?

    Ciao,


    luker

  • #2
    Ist das Thema eventuell schon einmal behandelt worden und ich finde es nur nicht?

    Hat in diesem Fall jemand die passenden Suchbegriffe oder einen Link zum passenden Thread?

    Comment


    • #3
      Kann ich diese Reihenfolge umkehren?
      Nein. Es würde dir aber auch nicht helfen. Du gehst davon aus das die Controls (hier UserControl und Trackbar) sich gegenseitig beim malen überschreiben. Das ist das falsche Vorstellungsmodel bei Winforms.

      Du triffst es eher wenn du dir vorstellst das ein Bereich nur von dem Control gezeichnet wird das im Vordergrund liegt. Es hilft also nicht auf dem UserControl zu zeichnen außer der Bereich des UserControls liegt im Vordergrund.

      Du mußt also die Trackbar selbst dazu bekommen Minimum und Maximum zu zeichnen.
      Wie du wahrscheinlich bemerkt hast sind bei der Trackbar die entsprechenden Paint Events nicht sichtbar (darum hattest du wahrscheinlich die Idee mit dem UserControl). Das Control verhält sich auch intern anders als andere Winform Controls insofern das es ein einfaches überschreiben des Paint Events nicht unterstützt um irgendwas hinzuzuzeichnen. Du müßtest also die Trackbar ableiten und das Painting komplett selbst implementieren. Heißt es reicht nicht nur die min und Max Werte hinzuzufügen.
      Im Framework gibts dazu die TrackbarRenderer Klasse die schonmal die wichtigsten Zeichenmethoden enthält um das selber zu machen. Trotzdem eine Menge Aufwand.

      Du hast meiner Meinung nach 3 Möglichkeiten.
      1.)Den harten oben beschriebene Weg
      2.)Schreibe Min und Max Werte neben die Trackbar und versuche nicht darauf zu zeichnen. Das geht auch mit deinem bisherigen UserControl.
      3.)Den 1.ten Weg werden vermutlich schon einige Leute gegangen sein. Sieh dich mal auf CodeProjekt um ob du was passendes findest was sich nach deinem Gusto anpassen läßt.

      Comment


      • #4
        ZB http://www.codeproject.com/KB/miscctrl/MAC_Slider.aspx

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment

        Working...
        X