Laden...

Probleme mit ToolTip-Klasse

Erstellt von plugnpray vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.850 Views
P
plugnpray Themenstarter:in
78 Beiträge seit 2006
vor 16 Jahren
Probleme mit ToolTip-Klasse

Hallo,

ich möchte in meinem Programm ein BalloonTip anzeigen lassen. Dies soll eine "X"-Button enthalten.

Ich habe dazu hier diesen Code gefunden:
BalloonTip-Code

Ich habe den MessageBalloon-Code bei mir eingefügt.
Das Problem ist, dass bei mir kein "X"-Button im ToolTip angezeigt wird.

Ich habs sowohl mit meinem Programm gestest, als auch mit einem komplett neuem und leeren Projekt. Beides Mal das gleich, kein "X"-Button.

Wisst ihr vielleicht eine Möglichkeit, wie ich das hinkriegen kann????

mfg

plugnpray

P
78 Beiträge seit 2006
vor 16 Jahren

Möglich das du den Title des Tooltips entfernt hast? Wenn ich dem Title nen nullstring gebe passiert das bei mir auch 😉

P
plugnpray Themenstarter:in
78 Beiträge seit 2006
vor 16 Jahren

Hallo,

ich hab den kompletten Quelltext von dem Beispiel so übernommen wie er ist.

Hab da weder was hizugefügt noch rausgenommen.

Ich hab auch den Text nicht verändert....

Schade, aber es klappt dann wohl nicht.

mfg

plugnpray

915 Beiträge seit 2006
vor 16 Jahren

Hallo plugnpray,

Vorweg, ich versuche es einfach auszudrücken nur damit das Verständniss da ist.

Die erste Möglichkeit zur Fehlerbehebung:
Über NativeWindow ist es dir möglich ein neue "Klasse" zu erstellen hierzu benötigt es die typischen Angaben über Borderstyles wie verhalten, der Klasse. Das geschieht über CreateParams. Somit ist es somit möglich Controls bzw Forms zu erstellen (eigentlich ists ja sowieso ein und das selbe).

1.)
Wenn dir also die Methode "CreateTool" in der Klasse MessageBalloon ansiehst wirst dort bei CreateParams den Klassennamen entdecken wie die Styles. Du wirst dort den Style "TTS_CLOSE" vorfinden der für den schließen Button verantwortlich ist auch für dessen darstellung. Wenn du den eintrag nicht findest (warum auch immer, evtl durchs kopieren) füge ihn hinzu.

2.) Wenn der parameter TTS_CLOSE da sein sollte und dennoch nichts passiert dann mach folgendes. Wir erstellen ein eigenes Control indem wir unsere WindowsNachrichten nach aussen legen so wie bei einen Standardcontrol.

Nun wird es leider kompliziert 🙂

Okay, erweitere die MessageTool Klasse um folgendes:


internal class MessageTool : NativeWindow
	{
		private const int WM_LBUTTONDOWN = 0x0201;
		public event DeActivateEventHandler DeActivate;

        public delegate void WndProcEventHandler(Message m);
        public event WndProcEventHandler WndProcEvent;
		
		protected override void WndProc(ref System.Windows.Forms.Message m)
		{
            if (this.WndProcEvent != null)
                this.WndProcEvent(m);

			if( m.Msg == WM_LBUTTONDOWN )
			{
				System.Diagnostics.Debug.WriteLine(m);
				// allow the balloon to close if clicked upon
				if(DeActivate!=null)
				{
					DeActivate();
				}
			}

			base.WndProc(ref m);
		}
	}

Soo der nächste Schritt, schmeiß in der Methode "CreateTool" in der Klasse MessageBalloon folgendes raus:


CreateParams cp = new CreateParams();
			cp.ClassName = TOOLTIPS_CLASS;
			cp.Style = 
				WS_POPUP | 
				TTS_BALLOON | 
				TTS_NOPREFIX |	
				TTS_ALWAYSTIP;
                //|
				//TTS_CLOSE;

Soo als nächstes fügst du den Eventhandler an geh in die Methode "CreateTool" in der Klasse MessageBalloon und füge folgendes "am Ende" hinzu:


 this.m_tool.WndProcEvent += new MessageTool.WndProcEventHandler(this.WndProc);

Nun erstellst du noch folgende Methoden in der Klasse MessageBalloon


       protected virtual void OnPaint(Graphics e)
        {

        }

        protected virtual void WndProc(Message m)
        {
            if (m.Msg == WM_PAINT)
            {
                using(Graphics gfx = Graphics.FromHwnd(m.HWnd))
                {
                    this.OnPaint(gfx);
                }
            }
        }

Du kannst nun etwas weiter in der Klasse aufräumen, usw. Nun hast du eine wirkliches "UserControl" mit einen WndProc und einer OnPaint Methode die du jetzt nach herzenslust übermalen kannst. Denk dran, zu einem "echten" UserControl gehört meiner Meinung nach noch das Property Controls das noch anfügen solltest. Über Win32 API SetParent und SetWindowPos kannst du dann die Controls wirklich mit einbinden auf das Handle von deinem eigenen ToolTip.

Hoffe dir ist klar was ich meinte, hier tue ich mich etwas schwer das ganze zu erklären denke als nicht Studierter fehlen mir da die Fachbegriffe 🙂

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

P
plugnpray Themenstarter:in
78 Beiträge seit 2006
vor 16 Jahren

Danke!!!

Ich werds mal noch testen.

Ich habe aber selber noch mit der Klasse von Codeproject rumgespielt.
In meiner Anwendung gibt es verschiedene Fenster, die ich über das Hauptfenster aufrufen kann.
Der (die, das ?) ToolTip wird im Hauptfenster angezeigt.

Wenn ich jetzt mit dem Programm arbeite, dann wird manchmal das ToolTip-Fenster korrekt angezeigt.

Ich kanns leider noch nicht reproduzieren.

Ich versuchs aber weiter.
Vielleicht komme ich ja so auf den Fehler...

Trotzdem danke.

mfg

plugnpray