Laden...

OnPaint Methode wird nicht aufgerufen

Erstellt von MontyBurns vor 17 Jahren Letzter Beitrag vor 17 Jahren 7.796 Views
M
MontyBurns Themenstarter:in
32 Beiträge seit 2006
vor 17 Jahren
OnPaint Methode wird nicht aufgerufen

Hallo zusammen.

Ich habe mir ein eigenes Control gebastelt, das von System.Windows.Forms.Button erbt und habe die OnPaint Methode überschrieben. Allerdings wird diese nicht ausgeführt...

Bin ich irgendwie blind oder habe ich etwas vergessen? Einen EventHandler muss ich ja für überschriebene Eventmethoden nicht extra hinzufügen, oder sehe ich das falsch?

Wäre schön, wenn mir jemand einen Tipp geben könnte.

Alex

Der Vorteil der Klugheit liegt darin, sich dumm stellen zu können - das Gegenteil ist schon schwieriger

215 Beiträge seit 2004
vor 17 Jahren

OnPaint Methode überschrieben.

Einen EventHandler [...] für überschriebene Eventmethoden

Ich glaube hier geht was verquer 🙂

Also:
Hast Du das Event 'überschrieben'?

  • oder -
    Hast Du in Deinem Control einen Paint-Handler implementiert?
M
MontyBurns Themenstarter:in
32 Beiträge seit 2006
vor 17 Jahren

Habe die Eventmethode überschrieben:


protected override void OnPaint(PaintEventArgs e)
{
....
}

Einen Eventhandler habe ich nicht implementiert.

Der Vorteil der Klugheit liegt darin, sich dumm stellen zu können - das Gegenteil ist schon schwieriger

215 Beiträge seit 2004
vor 17 Jahren

Ähh...**On**Paint gibt es schonmal gar nicht (pfui Deulphi 🙂 ).
Paint heisst das Teil 🙂

Und dann ist das, was Du da schreibst ein Methodenrumpf -> Kein Event! Eher Handler, aber bestimmt nicht zugewiesen (Paint += new...).

M
MontyBurns Themenstarter:in
32 Beiträge seit 2006
vor 17 Jahren

Original von DaSchroeter
Ähh...**On**Paint gibt es schonmal gar nicht (pfui Deulphi 🙂 ).
Paint heisst das Teil 🙂

Paint heißt das Event, aber die entsprechende Methode heißt nunmal OnPaint (wird einem auch so vorgegeben, wenn man das .Net Studio verwendet und gerade das Schlüsselwort override ausgeschrieben hat).

Der Vorteil der Klugheit liegt darin, sich dumm stellen zu können - das Gegenteil ist schon schwieriger

215 Beiträge seit 2004
vor 17 Jahren

OnPaint...wieder was dazugelernt 🙂 -> Ändert aber nix, weil:

Du hast also eine Handler-Routine überschrieben. Das kann so eigentlich gar nicht funktionieren:
Das Event stammt aus Deiner Basisklasse, der Handler ist dort implementiert, das Event wird dort ausgelöst.
-> Die Basisklasse kennt Deine Ableitung ja gar nicht!

Warum machst Du nicht sowas:


this.Paint += new...

Geht das auch nicht?

greetz
DaSchroeter

B
1.529 Beiträge seit 2006
vor 17 Jahren

Die Namensgebung funktioniert so:
Eine Komponente will das Ereignis X auslösen. Dazu ruft es die Methode OnX () auf (daher sind die alle protected, also nur in abgeleiteten Klassen erreichbar). Die macht was nötig ist, prüft, dass das Event X (also der Delegate) nicht null ist, und ruft diesen dann auf.
Daraus folgt, dass es in keiner Komponente des Frameworks eine Methode gibt, die genauso wie ein Event heisst (was auch gar nicht geht).
Will man jetzt also die Event-Verarbeitung der auslösenden Klasse erweitern, muss man diese ableiten und OnX () überschreiben (per override).
Warum das bei dir nicht funktionieren soll, kann ich dir ohne Code aber auch nicht sagen.

215 Beiträge seit 2004
vor 17 Jahren

Ah..ok...dann hab ich jetzt echt was gelernt 🙂

Ich nehme hiermit alle meine (gutgemeinten, aber) unqualifizierten Bemerkungen zurück!

M
MontyBurns Themenstarter:in
32 Beiträge seit 2006
vor 17 Jahren

Hallo Borg,

hier mal etwas von meinem Code:


// Konstruktor
public MessageListElement(MessageData md)
		{
			this.messageData = md;

			this.Height = 52;
			this.Width = 180;
			this.Font = new Font(this.Font.Name, 12, FontStyle.Bold);

		}

protected override void OnPaint(PaintEventArgs e)
		{
			bool Read = this.messageData.Gelesen;

			e.Graphics.DrawString("Hallo", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), 5, 5);
}

Wenn ich mich nicht irre, müsste die OnPaint Methode ja zumindest EIN Mal aufgerufen werden (denn die abgeleiteten Buttons erscheinen im Formular). Da tut sich jedoch nix... die Buttons sind komplett "blank".

Nebenbei bemerkt: Ich überschreibe nach selbem Muster die OnClick - Methode. Und das funktioniert einwandfrei.

Der Vorteil der Klugheit liegt darin, sich dumm stellen zu können - das Gegenteil ist schon schwieriger

S
1.047 Beiträge seit 2005
vor 17 Jahren

hm, muß (?) in der überschriebenen methode nicht

base.OnPaint(e);

auftauchen an erster stelle?

M
MontyBurns Themenstarter:in
32 Beiträge seit 2006
vor 17 Jahren

Original von sheitman
hm, muß (?) in der überschriebenen methode nicht

base.OnPaint(e);  

auftauchen an erster stelle?

Ich bin mir nicht sicher, ob die Paint - Methode der Basisklasse als erstes aufgerufen werden muss. Aber das ist ja (wenn da wirklich eine Relevanz in der Reihenfolge besteht) ein anderes Problem. Mein Problem ist ja, dass "meine" OnPaint - Methode gar nicht erst ausgeführt wird... 🙁 daher erübrigt sich (erst einmal) deine Frage.

"Entwarnung": Soeben haben wir herausgefunden (nach elendig langem suchen), dass die OnPaint Methode eines Buttons im Compact Framework (sorry, hätte ich vielleicht erwähnen sollen 🙁 ) nicht überschrieben werden kann...

Der Vorteil der Klugheit liegt darin, sich dumm stellen zu können - das Gegenteil ist schon schwieriger

871 Beiträge seit 2005
vor 17 Jahren

Hallo,

also ich seh jetzt in deinem code auf die schnell nichts warum es nicht funktionieren sollte. Hab mal auf die schnelle was gebastelt was auch von einem Button erbt und die OnPaint überschreibt:


using System;
using System.Windows.Forms;

public class Test
{
	public static void Main( string[] args )
	{
		Application.Run( new WinTest() );
	}

}

public class WinTest : Form
{
	public WinTest()
	{
		MyButton b = new MyButton();
		this.Controls.Add( b );
	}
}


public class MyButton : Button
{
	protected override void OnPaint( PaintEventArgs e )
	{
		Console.Out.WriteLine( "PAINT" );
		base.OnPaint( e );
	}
}

Getestet unter 1.1 und 2.0 - funktioniert.

Grüsse, Egon

/EDIT: Mein Post hat sich durch den Zeitgleichen Post des OT erübrigt.

S
1.047 Beiträge seit 2005
vor 17 Jahren

"Entwarnung": Soeben haben wir herausgefunden (nach elendig langem suchen), dass die OnPaint Methode eines Buttons im Compact Framework (sorry, hätte ich vielleicht erwähnen sollen unglücklich ) nicht überschrieben werden kann...

ja bleibt ja nun noch die möglichkeit sich in das paint-event einzuklinken, wie schauts denn damit aus?

L
1 Beiträge seit 2007
vor 17 Jahren

Sollten andere Leute auf diesen Thread stoßen und auf der Suche nach der Lösung des Problems ihrer nicht aufgerufenen onPaint-Methode (wie ich mit meinem Trackbar-Derivat) sein, hier ist eine mögliche Lösung:

Im Konstruktor des abgeleiteten Controls (zusätzlich) folgendes eintragen:


            this.SetStyle(ControlStyles.AllPaintingInWmPaint |
                        ControlStyles.ResizeRedraw |
                        ControlStyles.UserPaint, true);

Entscheidend ist der Eintrag "ControlStyles.UserPaint" mit dem das Control das Zeichnen selbst in die Hand nimmt.

Das nächste Problem ist nun, dass man so in den "Dann-mach-es-halt-ALLES-selber"-Zeichenmodus entlassen wird. "base.onPaint()" kann man jetzt nicht mehr (so einfach) nutzen. Mit folgendem "Trick" jedoch schon:


        protected override void OnPaint(PaintEventArgs e)
        {
            // UserPaint kurz abschalten
            base.SetStyle(ControlStyles.UserPaint, false);
            // kurz "Standard" zeichnen lassen
            base.Refresh();

            // hier selber malen

            // UserPaint wieder anschalten
            base.SetStyle(ControlStyles.UserPaint, true);
         }

Wermutstropfen: Die Performance kann unter Umständen dabei leider etwas leiden (Flimmern etc.).

Hat jemand Vorschläge für bessere und "offiziellere" Lösungen?

3.971 Beiträge seit 2006
vor 17 Jahren

Doch es gäbe noch eine Möglichkeit. Die Funktion wndProc überschreiben und das "Event" wm_Paint abfangen und selbst behandeln

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...