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
Wieso kein CustomControl?
Wo du die 2 Labels anordnest und eben deinen Button als Panel, und das Clickereigniss des Customcontrols implementierst?
mfg
serial
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
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.
> Codejunky <
danke für den Hinweis was die performance betrifft.
Die Zeichnlogik in der OnPaint ist aber garnicht so einfach die ich dazu brauche...
Wenn du dich einmal mit dem Thema auseinandersetzt, ist es ein Kinderspiel. Gerade wie in deiner Anforderung.
Wo hakts denn?
> Codejunky <
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?
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)
> Codejunky <
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.
Aber nur weil ich gerade nichts besseres zu tun habe..
Eigentlich solltest du das Grundverständnis mitbringen.
> Codejunky <
danke! jetzt hab ich das auch kapiert 😉
Die Zeichnung der Kreise kriegt man nicht noch smoother oder?
Hallo ratalert,
doch, aber bitte benutze doch selbst die :rtfm: Doku: SmoothingMode-Enumeration.
herbivore