Announcement

Collapse
No announcement yet.

DrawRectangle + zorder

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

  • DrawRectangle + zorder

    hi,

    ich habe folgendes problem:

    ich will in einer form alle textfeld-rahmen mit drawrectangle "überzeichnen".
    das klappt auch ganz gut.


    Hier der Code:


    Private Sub zeichne_textboxBorder(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint

    Dim g As Graphics = e.Graphics
    Dim border_pen As New Pen(System.Drawing.Color.FromArgb(CType(CType(216, Byte), Integer), CType(CType(228, Byte), Integer), CType(CType(248, Byte), Integer)), 6.0)
    Dim line_pen As New Pen(System.Drawing.Color.FromArgb(CType(CType(216, Byte), Integer), CType(CType(228, Byte), Integer), CType(CType(248, Byte), Integer)), 2.0)

    For Each ctr As Control In Me.Controls
    If TypeOf ctr Is TextBox Then
    g.DrawRectangle(border_pen, New Rectangle(ctr.Location + Me.Location, ctr.Size))
    End If
    Next

    border_pen.Dispose()
    line_pen.Dispose()
    End Sub



    Jedoch befindet sich in dieser form auch eine groupbox. mit den textboxen in dieser sollte das selbe geschehen.


    Das sieht so aus:


    For Each ctr As Control In Me.gp_allgemeineStammdaten.Controls
    If TypeOf ctr Is TextBox Or (TypeOf ctr Is ComboBox And Not ctr.Name Like "*_id") Then
    g.DrawRectangle(border_pen, New Rectangle(ctr.Location + Me.gp_allgemeineStammdaten.Location, ctr.Size))
    End If
    Next


    Leider befindet sich aber das gezeichnete "hinter" der groupbox (z-achse) und wird somit verdeckt. wie kann ich es "nach vorne" holen? mit bringtofront() oder sendtoback() schaff ichs irgenwie nicht ... weil ich auch nicht weiss, worauf ich die methode anwenden soll. g.bringtofront() funkt nicht ...


    kann mir bitte jemand helfen? das muss doch möglich sein ...

    danke!
    mster

  • #2
    Hallo Mster,

    das geht deshalb nicht, weil die Groupbox ein ChildContainer ist, und sozusagen sein eigenes "Paint-Ereignis" hat. (Fachlich falsch ausgedrückt, aber eventuell besser zu verstehen).

    Warum entwirfst Du nicht Deine eigene TextBox, und zeichnest Deinen eigenen Rahmen. Damit Du nicht die ganze Arbeit einer TextBox Implementierung machen musst, empfehle ich Dir eine Control-Klasse zu erstellen, die von TextBox erbt.

    Dann kannst Du innerhalb dieser Control-Klasse die OnPaint-Methode überschreiben, und Deinen eigenen Rahmen zeichnen.

    --> Ich glaube aber dass es gerade in Bezug zu TextBoxen da Schwierigkeiten gab, ich weiß es aber definitiv nicht mehr, probiers einfach mal aus.

    Grüße
    _ntr_

    Comment


    • #3
      hi _ntr_,

      das wäre natürlich die eleganteste lösung. das werde ich auch machen denke ich. danke für den tip!

      aber trotzdem muss es doch irgendie funktionieren, in (oder "über") dieser groupbox etwas zu zeichnen oder?
      ich hab das gefühl, dass das megaeinfach wäre, ich aber auf der berühmten leitung stehe ...

      mster

      Comment


      • #4
        Hallo Mster,

        nein, das ist genau das Problem, die Childcontrols werden erst ganz zum Schluß gezeichnet, so dass keine Interferenz codemäßig mehr möglich ist (leider). Daher ist alles selbst Gezeichnete unter den Childcontrols.

        Habe gerade mal in meinen alten Gui-Dingen geschaut, und festgestellt, dass es immense Probleme mit der TextBox und dem Selberzeichnen gab. Also, bevor Du Dir da jetzt ein Bein abbrichst, ich habe das damals so gelöst, dass ich eine TextBox gewrappt hatte, die keinen Rahmen hatte, und mit einem Margin von jeweils 1 Pixel innen gezeichnet wurde. Meinen "custom border" habe ich dann drumrum gemalt.

        Ich habe nochmal in meinem Kram nachgelesen, dass es ganz komische Effekte bei der Textbox gibt ->
        - Es wird NICHT standardmäßig die Methode OnPaint aufgerufen
        - Es ist zwar möglich OnPaint aufrufen zu lassen, indem man "SetStyle(ControlStyles.AllPaintingInWmPaint, true);" setzt, dann reagiert die TextBox aber sehr komisch.
        - Es ist auch irgendwie über die WinApi nicht möglich, die Farbe des Rahmens zu beeinflussen

        Das ist aber wirklich nur eine Spezialität der TextBox, da diese anscheinend noch so hart in Windows verdrahtet ist, dass sie kaum variierbar ist.

        Also Für mich gab es damals nur die Möglichkeit einen Wrapper anzubieten, der die wesentlichen TextBox-Eigenschaften und Events durchschleift.

        Ich erwähne das, weil Du Dir nicht nochmal die selbe Mühe geben musst, da etwas zu finden. (Du kannst auch gerne mal googlen, Du findest tonnenweise Fragen hierzu und keinerlei Antworten).

        Grundsätzlich ist es aber die Objektorientiertere Lösung, von entsprechendem Control zu erben, und Modifikationen danach einzubauen, und grundsätzlich funktioniert das auch, nur mit der TextBox nicht :-(

        Viele Grüße
        _ntr_

        Comment


        • #5
          Originally posted by _ntr_ View Post
          das geht deshalb nicht, weil die Groupbox ein ChildContainer ist
          Trifft das auch für die TrackBar zu?

          Ich habe nämlich das Problem, dass ich auf die Trackbar die Minimum- und Maximumwerte zeichnen will. Die werden aber stattdessen von der Trackbar verdeckt (Außer dann, wenn sie visible=false ist).

          Ciao,


          luker

          Comment

          Working...
          X