Laden...

Eigenes Control erstellen

Erstellt von ratalert vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.753 Views
R
ratalert Themenstarter:in
22 Beiträge seit 2009
vor 14 Jahren
Eigenes Control erstellen

Hallo zusammen,

ich brauche ein ganz spezielles Control. Der Button soll zwei Label und eine Art zweiten Button drauf haben. Im Anhang ein kleines Paint-Gemälde davon.

Wenn ich das richtig sehe ist ein Custom Control nicht was ich hier brauche, da ich nicht bestehende Controls wie zb. ein Textfeld und einen Button gruppieren und als eines verwenden will sondern da ich etwas neues brauche.

Da ich aus der MFC-Ecke komme vermute ich jetzt dass ich die OnPaint Methode eines Buttons überschreiben muss und dort andere Controls reinzeichnen muss. Wie soll das ganze von statten gehen?

Danke schonmal für die Hilfe.

Viele Grüße,
ratalert

S
902 Beiträge seit 2007
vor 14 Jahren

Wieso kein CustomControl?

Wo du die 2 Labels anordnest und eben deinen Button als Panel, und das Clickereigniss des Customcontrols implementierst?

mfg
serial

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo ratalert,

du kannst von Control ableiten und selber zeichnen ([Artikel] Zeichnen in Windows-Programme) oder von UserControl und darauf die zwei Labels und den Button platzieren. Siehe auch Tutorial Komponentenerstellung gesucht.

herbivore

1.665 Beiträge seit 2006
vor 14 Jahren

In so einem simplen Fall bevorzuge ich das Erstellen und Zeichnen eines komplett eigenen Controls, was gegenüber einem UserControl mit 2 Labels + 1 Button bei einer großen Anzahl einen deutlichen Performanceunterschied ausmacht.

R
ratalert Themenstarter:in
22 Beiträge seit 2009
vor 14 Jahren

danke für den Hinweis was die performance betrifft.

Die Zeichnlogik in der OnPaint ist aber garnicht so einfach die ich dazu brauche...

1.665 Beiträge seit 2006
vor 14 Jahren

Wenn du dich einmal mit dem Thema auseinandersetzt, ist es ein Kinderspiel. Gerade wie in deiner Anforderung.

Wo hakts denn?

R
ratalert Themenstarter:in
22 Beiträge seit 2009
vor 14 Jahren

Naja ich habs jetzt folgendermaßen gemacht:

public Form1()
        {
            InitializeComponent();

            this.button1.Text = "";
        }

        private void button1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g;

            base.OnPaint(e);

            int iRadius = 20;

            g = e.Graphics;

            g.DrawEllipse(new Pen(Color.Black),
                     210 / 2 - iRadius,
                     50 / 2 - iRadius,
                     2 * iRadius,
                     2 * iRadius);

            g.FillEllipse(new SolidBrush(Color.Yellow),
                     210 / 2 - (iRadius - 1),
                     50 / 2 - (iRadius - 1),
                     2 * (iRadius-1),
                     2 * (iRadius-1));


            g.DrawString("Label 1",
                          new Font("Arial", 12, FontStyle.Bold),
                          Brushes.Black,
                          50 / 2 - iRadius, 50 / 2 - iRadius);

            g.DrawString("Label 2",
                          new Font("Arial", 8, FontStyle.Bold),
                          Brushes.Black,
                          52 / 2 - iRadius, 100 / 2 - iRadius);

            g.DrawString("2",
                          new Font("Arial", 18, FontStyle.Bold),
                          Brushes.Black,
                          229 / 2 - iRadius, 63 / 2 - iRadius);
        }

Nun weiss ich leider nicht wie ich den Kreis zum Button machen kann. Bzw. hätte ich dabei einen Button nehmen sollen und diesen darauf zeichen?

1.665 Beiträge seit 2006
vor 14 Jahren

Erstell dir eine Klasse 'XYButton'
Diese beinhaltet Properties wie z.B. Text, BackColor und vor allem Bounds (System.Drawing.Rectangle).

Anhand der Werte in den Properties zeichnest du den Button und speicherst die Position und Größe in dem Bounds-Property.

Später kannst du dann nämlich bei MouseMove und MouseClick die Bounds auf eine Mausposition prüfen und so die Button-Funktionalität implementieren.

Edit:
ich würde nicht

new Font("Arial", 8, FontStyle.Bold)

schreiben, sondern

new Font(this.button.Font.FontFamily.Name, 8, FontStyle.Bold)
R
ratalert Themenstarter:in
22 Beiträge seit 2009
vor 14 Jahren

ok, danke für die Rückmeldung.

Wie soll ich das machen mit der Klasse? Eine Klasse für den Button und dort hinein auch die OnPaint?

Evtl. kannst du mir ja ein mini demo projekt anlegen - würde mir sehr helfen.

1.665 Beiträge seit 2006
vor 14 Jahren

Aber nur weil ich gerade nichts besseres zu tun habe..
Eigentlich solltest du das Grundverständnis mitbringen.

R
ratalert Themenstarter:in
22 Beiträge seit 2009
vor 14 Jahren

danke! jetzt hab ich das auch kapiert 😉

Die Zeichnung der Kreise kriegt man nicht noch smoother oder?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo ratalert,

doch, aber bitte benutze doch selbst die :rtfm: Doku: SmoothingMode-Enumeration.

herbivore