Announcement

Collapse
No announcement yet.

Panel zeichnen

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

  • Panel zeichnen

    Hallo zusammen,

    ich habe mich heute mal in (von mir) unerforschtes Gebiet begeben müssen.
    Ich entwickle einen Editor ähnlich dem in Visual Studio mit dem die Benutzer für eine Anwendung ihre Benutzeroberfläche selber gestalten können. (Textboxen, Komboboxen, usw.)
    Nun sollen sie die Möglichkeit erhalten einen Rahmen (Panel-Control) einzufügen und diesem ein gewünschtes Aussehen verleihen. Möglich sollen hier zb. Rechteck(standard), Quadrat, Kreis, Ellipse und noch ein paar sein. Um das zu erreichen überschreibe ich die OnPaint-Methode vom Panel. Aber irgendwas mache ich falsch. Das OnPaint wird fehlerfrei abgeschlossen, aber visuell ändert sich nichts im Editor.

    Das hier ist mal ein Ausriss aus meinem aktuellen Code:
    [highlight=c#]
    public enum Rahmenart
    {
    Rechteck = 0,
    Quadrat,
    Ellipse,
    Kreis,
    Gerundetes_Rechteck,
    Gerundetes_Quadrat
    }


    [DisplayName("Rahmenart")]
    [Category("Allgemein")]
    public Rahmenart Shape
    {
    get { return (Rahmenart)shape; }
    set
    {
    shape = (int)value;
    ((CtrRahmen)bezugscontrol).Refresh();
    }
    }


    protected override void OnPaint(PaintEventArgs e)
    {
    switch ((int)Shape)
    {
    case 0:
    e.Graphics.DrawRectangle(new Pen(Rahmenfarbe), this.Top, this.Left, this.Width, this.Height);
    break;
    case 1:
    e.Graphics.DrawRectangle(new Pen(Rahmenfarbe), this.Top, this.Left, this.Height, this.Height);
    break;
    case 2:
    e.Graphics.DrawEllipse(new Pen(Rahmenfarbe), this.Top, this.Left, this.Width, this.Height);
    break;
    default:
    break;
    }
    base.OnPaint(e);
    }
    [/highlight]

    Was mach ich falsch?

    Danke schon mal
    Andreas

  • #2
    Sieht korrekt aus. Rahmenfarbe = Hintergrundfarbe


    Das casten für den switch kannst du dir sparen. Das geht genauso und lesbarer direkt mit dem Enum.

    Comment


    • #3
      Ok, aber warum seh ich dann, wenn ich zb. Ellipse auswähle, keine Ellipse.
      Das OnPaint läuft fehlerfrei durch, aber aus dem Rechteck wird keineEllipse

      Comment


      • #4
        Das OnPaint läuft fehlerfrei durch, aber aus dem Rechteck wird keineEllipse
        Heißt zeichnen hat zumindest einmal funktioniert mit dem Code für Rechteck? Oder lese ich das falsch zwischen den Zeilen?

        Comment


        • #5
          also wenn ich den kompletten Switch auskommentiere wird noch immer das Rechteck gezeichnet.

          Hier mal ein Bild, damit sich das vielleicht ein wenig besser vorstellen kann, was ich meine.

          Editor2.jpg
          Zuletzt editiert von gfoidl; 09.07.2012, 14:02. Reason: Beiträge zusammengeführt

          Comment


          • #6
            Ich glaube, ich habs.
            Das Problem war der "Ort" an dem ich zeichnen wollte. OnPaint ist dafür scheinbar nicht geeignet, sondern man muss das Paint-Ereignis benutzen.
            Zudem darf man Top und Left nicht angeben, bzw. die müssen 0 sein, sonst wird zwar gezeichnet, aber ausserhalb des sichtbaren Zeichnungsbereiches.

            Für Interessierte hier mein Code:
            [highlight=C#]
            private void CtrRahmen_Paint(object sender, PaintEventArgs e)
            {
            e.Graphics.Clear(.Parent.BackColor);
            switch (this.Shape)
            {
            case this.Rahmenart.Rechteck:
            e.Graphics.DrawRectangle(new Pen(Rahmenfarbe,4), 0, 0, this.Width-1, this.Height-1);
            break;
            case this.Rahmenart.Quadrat:
            if (this.Width < this.Height) this.Height = this.Width;
            else if (this.Width > this.Height) this.Width = this.Height;
            e.Graphics.DrawRectangle(new Pen(Rahmenfarbe,4), 0, 0, this.Width-1, this.Height-1);
            break;
            case this.Rahmenart.Ellipse:
            e.Graphics.DrawEllipse(new Pen(Rahmenfarbe,2), 0, 0, this.Width-1, this.Height-1);
            break;
            case Rahmenart.Kreis:
            if (this.Width < this.Height) this.Height = this.Width;
            else if (this.Width > this.Height) this.Width = this.Height;
            e.Graphics.DrawEllipse(new Pen(Rahmenfarbe,2), 0, 0, this.Width-1, this.Height-1);
            break;
            case Rahmenart.Gerundetes_Rechteck:
            e.Graphics.DrawPath(new Pen(Rahmenfarbe, 4), RoundedRectangle.Create(0, 0, this.Width, this.Height,20));
            break;
            case Rahmenart.Gerundetes_Quadrat:
            if (this.Width < this.Height) this.Height = this.Width;
            else if (this.Width > this.Height) this.Width = this.Height;
            e.Graphics.DrawPath(new Pen(Rahmenfarbe, 4), RoundedRectangle.Create(0, 0, this.Width, this.Height, 20));
            break;
            default:
            break;
            }
            if (this.Fill) // Rahmen füllen
            {
            SolidBrush myBrush = new SolidBrush(Rahmenfarbe);
            switch (this.Shape)
            {
            case Rahmenart.Rechteck:
            case Rahmenart.Quadrat:
            e.Graphics.FillRectangle(myBrush, 0, 0, this.Width-1, this.Height-1);
            break;
            case Rahmenart.Ellipse:
            case Rahmenart.Kreis:
            e.Graphics.FillEllipse(myBrush, 0, 0, this.Width - 1, this.Height - 1);
            break;
            case Rahmenart.Gerundetes_Rechteck:
            case Rahmenart.Gerundetes_Quadrat:
            e.Graphics.FillPath(myBrush, RoundedRectangle.Create(0, 0, this.Width, this.Height, 20));
            break;
            default:
            break;
            }
            }
            e.Graphics.ResetClip();
            }
            [/highlight]

            Comment


            • #7
              Das wäre merkwürdig wenn man das so machen müßte. Also ein Control das seinen eigenen Event fängt. Da dein ursprünglicher Code bei mir funktioniert wenn ich mir damit ein Panel bastle vermute ich mal du hattest vorher bereits einen Paint EventHandler am Control hängen der deine Ausgabe überzeichnet hat. Du hast ja auch
              base.OnPaint(e) nach deinem zeichnen aufgerufen.

              Comment


              • #8
                Hmm... Kann es daran liegen, das sich das Control im Edit-Mode befindet? Ich bin mir auch nicht ganz sicher, wie der Designer-Host sich da noch mit einmischt.base.OnPaint(e) wird, wie du im code oben sehen kannst nicht von mir aufgerufen. Das hat zu einer Endlosschleife geführt.

                Comment

                Working...
                X