Suche Control für Windows Forms

  • C#

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Suche Control für Windows Forms

    Guten Tag VBP.
    Ich suche ein Control, wie das hier rot markierte, für C#. Jedoch weiß ich nicht, wie es heißt, daher war das Suchen bisher erfolglos:


    Gibt es sowas überhaupt in Windows Forms, oder muss man auf ThirdParty Controls zurückgreifen?

    MfG
    Ok, ich schreibe mir eben was, was meinen Ansprüchen entspricht, dass wir denke ich die beste Lösung sein, will
    nur so einen ganz einfachen Header haben, der nen Text und nen Schließen-Button hat. Werde die Lösung dann hier veröffentlichen, falls
    andere was ähnliches suchen.

    EDIT:

    C#-Quellcode

    1. using System.Drawing;
    2. using System.Windows.Forms;
    3. namespace FakeBoyAdvance.Controls
    4. {
    5. class ClosablePanel : Panel
    6. {
    7. public string Title { get; set; }
    8. private static Bitmap _close_button = Properties.Resources.close;
    9. private static Pen _border = new Pen(Color.FromArgb(185, 185, 185));
    10. private static Brush _fill = new SolidBrush(Color.FromArgb(219, 219, 219));
    11. protected override void OnPaint(PaintEventArgs e)
    12. {
    13. base.OnPaint(e);
    14. Graphics g = e.Graphics;
    15. g.DrawRectangle(_border, new Rectangle(0, 0, this.Width - 1, 20));
    16. g.FillRectangle(_fill, new Rectangle(1, 1, this.Width - 2, 19));
    17. g.DrawString(this.Title, this.Font, Brushes.Black, new Point(2, 4));
    18. g.DrawImage(_close_button, new Point(this.Width - 16, 7));
    19. }
    20. protected override void OnMouseClick(MouseEventArgs e)
    21. {
    22. base.OnMouseClick(e);
    23. if (e.X >= this.Width - 16 && e.X <= this.Width - 8 && e.Y >= 7 && e.Y <= 16)
    24. {
    25. this.Dispose();
    26. }
    27. }
    28. }
    29. }

    Dazu muss die angehängte close.png in die Resourcen eingefügt werden.

    So sieht das Resultat aus. Es ist ein einfaches Panel mit einem Header, dass sich schließen lässt, genau das, was ich brauchte :)
    Bilder
    • close.png

      152 Byte, 8×7, 183 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Flerovium“ ()

    sehr hübsch!
    verbesserungsfähig noch Performance und Resourcenbereinigung.

    Resourcenbereinigung:
    Du erstellst in jedem Paint-Vorgang 2 Brushes und 1 Pen, und immer die gleichen, und räumst sie nicht auf.
    Erstell dir die Dinger als Klassenvariable und benutze sie mehrmals. Kannste sogar static machen!

    Performance:
    In jedem Paint die Bitmap erneut aus Properties.Resources.close auszulesen ist unperformant. Da wird jedesmal mittm ResourceManager glaub sogar in Dateien rumgebuddelt, und gelesen und konvertiert und wasweißich.
    Auch hier: Einmal machen, als Klassenvariable oder gar static, und dasselbe Ding immer wieder verwenden.
    ich hab mir mal 2 Bilder gezogen - dieselbe Resource, und mit Is auf Identität verglichen. Es waren verschiedene.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim bmp = My.Resources.Colors
    2. Dim bmp2 = My.Resources.Colors
    3. Dim b = bmp Is bmp2
    Also auch wenn die nicht immer von Platte geladen werden: Da werden Rohdaten iwie konvertiert, und eine neue Bitmap erstellt, und das ist bei OwnerDrawing vonne Performance und Resourcenbereinigung her problematisch, weil gepaintet wird mitunter extrem häufig.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()