eigener Button (Anfängerproblem)
-
hi,
ich schreibe zum erstan mal was in C# und .Net (hab schon auf WinAPI Programmiert) und wollte weil ich das so toll finde ein eigenen Button mit "Spezial funktionen" programmieren. Doch mein erstes Problem kommt schon mim Zeichnen einer Textzeichenfolge in diesem "Buttonbereich"hier mal der Code der Klasse und das Prog was diesen Button testweise erstellt
ScrollButton Klasse:
class ScrollButton: Form { Size size; Rectangle rect; Point pt; public ScrollButton(Point point) { pt = point ; size.Height = 50; size.Width = 100; rect = new Rectangle(pt, size); } protected override void OnPaint(PaintEventArgs pea) { Graphics grfx = pea.Graphics ; grfx.DrawString("TEST", new Font("Times New Roman", 10), Brushes.Red, rect); } }
"Button Tester" :
class Tester: Form { public static void Main() { Application.Run(new Tester()); } public Tester() { Text = "TESTER"; new ScrollButton(new Point(40,60)); } }
Vielen Dank für jede Hilfe
-
Ahja was ich zu sehen bekomme ist das leere Formular Tester ( es ist groß genug ) und leeer !
-
Es reicht nicht, das Button zu erzeugen, Du musst es auch der Form hinzufügen:
Controls.Add(new ScrollButton(new Point(40,60));
Außerdem kannst Du das Button nicht von 'Form' ableiten, wenn Du ein Control erzeugen willst. Hier würde ich als Basisklasse eher 'Control', 'Button' oder 'ButtonBase' empfehlen.
Allerdings gibt es da noch ein paar Regeln, an die man sich halten sollte. Z.B. sollten Komponenten immer einen Standard-Konstruktor (also parameterlos) haben, damit sie mit dem Designer verwendet werden können. Außerdem erzeugst Du bei jedem Malvorgang eine neue Schriftart – das ist seeehr schlecht für den Ressourcenverbrauch des Programms. Erstell lieber im Konstruktur eine Schriftart (und speicher sie in der 'Font'-Property) und greif dann darauf zu. Zu guter Letzt ist die 'DrawString'-Methode buggy und erzeugt ein falsches Schriftbild. Abhilfe schafft die Verwendung der 'System.Windows.Forms.TextRenderer'-Klasse.
-
ich bin auf die Idee mit dem Ableiten von Form gekommen weil:
im Petzold wird das so gemacht und der spricht zwar nicht von Ownerdraw Button aber von eigenen Steuerelementen und leitet von Form ab. Der Button soll "relativ komplex" werden. Mehrere (3) Textzeilen in 2 verschiedenen Schriftgrößen und auf Mausereignisse á la Enter,Leave,Scroll reagieren. Geht das auch wenn ich von den dir genannten Klassen ableite ?mfG noha
-
noha_39 schrieb:
ich bin auf die Idee mit dem Ableiten von Form gekommen weil:
im Petzold wird das so gemacht und der spricht zwar nicht von Ownerdraw Button aber von eigenen Steuerelementen und leitet von Form ab.Was? Das macht er? Dafür gehört er gehauen. Eine Form ist eine Form ist eine Form. Ein Control ist *keine* Form.
Wo macht er das denn? Ich habe von ihm nur „Programming in the key of C#“ und da steht so ein Unsinn nicht drin (dafür aber andere Dinge, die nicht unbedingt so toll und richtig sind).
Der Button soll "relativ komplex" werden. Mehrere (3) Textzeilen in 2 verschiedenen Schriftgrößen und auf Mausereignisse á la Enter,Leave,Scroll reagieren. Geht das auch wenn ich von den dir genannten Klassen ableite ?
Natürlich. Diese Klassen stellen keinerlei Einschränkungen dar. Wobei ein scrollbares Button schon ein wenig komisch (wenn überhaupt möglich) wäre, daher würde ich hier von 'Control' oder eventuell von 'UserControl' ableiten. Letztes ist im Prinzip dafür da, als Container für andere Controls zu fungieren, die man zu einer Einheit zusammenfassen will.
-
ich hab WindowsProgrammierung mit C# ( ich glaub das ist "nur" die deutsche Version ) bei mir erstellt er auf Seite 403 AnalogClock.cs Leitet die Klasse von Form ab und spricht danach von seinem "Uhr-Steuerelement" ( das passiert auch noch an anderen Stellen )
scheinbar muss ich nicht alles glauben was "der Meister" sagt
Ich werd mal was rumprobieren mit deinen Vorschlägen ...
-
Auf Seite 399 erstellt er aber "ClockControl.cs" und leitet diese von UserControl ab!
AnalogClock ist nur das Fenster das das UserControl aufnimmt bzw. anzeigt.
Ab Seite 401 unten erklärt er auch noch den Code von ClockControl:
[Zitat]ClockControl erbt von UserControl ...[/Zitat]
-
Da hab ich wohl was "überlesen" hast recht. hm... ich werd den Fehler auf jeden fall jetzt nicht mehr machen. Vielen Dank für eure Antworten