Klick außerhalb des Objektes mitbekommen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hallo!

In meinen Bemuehungen, das Verhalten eines Menues (wx.Menu) und einer Menubar nachzuahmen, bin ich bereits sehr weit gekommen. Im Moment haenge ich an zwei Punkten fest:

Erstens
Mein MenueKlasse erbt von wx.Frame ab. Somit wird der Fokus des Fensters an das Menue beim oeffnen uebergeben... wechsel ich nun das Menue von einem Menubar-Element zum naechsten, blinkt das uebergeordnete Fenster, da es kurz den Fokus bekommt und wieder abgibt. Kann ich das irgendwie verhindern? Direktes zurueckgeben des Fokus (parent.SetFocus()) hilft da nicht so wirklich.
Gibts da noch ne Moeglichkeit? Den Focus abweisen oder so?

Zweitens
Wie kann herausfinden, ob die Mouse außerhalb des MenuFrames geklickt wurde, so dass es sich dann schließen kann?

Besten Dank im Vorraus
NKoehring
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

nkoehring hat geschrieben:Wie kann herausfinden, ob die Mouse außerhalb des MenuFrames geklickt wurde, so dass es sich dann schließen kann?
Hallo NKoehring!

Wenn das MenuFrame den Fokus verliert, dann wurde außerhalb geklickt. Das kannst du abfangen.
Was du nicht abfangen kannst, ist ob wirklich außerhalb geklickt wurde, da du darauf keinen Zugriff hast.
Also musst du dich darum kümmern, dass der Fokus nicht einfach so verloren gehen kann.


Zusatz:
Ein Menü ist an ein Frame gebunden -- um solche Flickereien und das Ändern der Farbe der Titelleiste, usw. zu unterbinden. Ich glaube nicht, dass es machbar ist, das Verhalten eines Menüs mit einem weiteren Frame nachzubilden. Auch mit anderen Container-Widgets wie z.B. einem Panel, ist es nicht möglich, da ein Panel nicht größer als das Frame werden kann (glaube ich).
Einzig das PopupWindow oder das PopupCtrl könnte eventuell so ein ähnliches Verhalten haben. Aber das müsste man mal ausprobieren.

Gut, ich habe es soeben ausprobiert (in der wxPython-Demo habe ich den anzuzeigenden Text verlängert). Das PopupWindow kann über das Frame hinausgehen, ohne dass der Fokus vom Frame genommen wird. :-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Vielen Dank! Ich weiß nicht, was ich manchmal ohne deine Ratschlaege tun wuerde Gerold.

Leider verhaelt sich das PopupWindow im Moment nocht nicht so wirklich wie ich das will, aber zumindest hat es das Flackerei-Problem nicht. Ich werde weiter probieren.

Danke nochmal und beste Gruesse aus Sachsen-Anhalt.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Also es ist nun alles wunderbar... was die Flackerei angeht. Aber scheinbar bekommt das PopupWindow keine FocusEvents :(

Kann man ihm das irgendwie beibringen? Vielleicht mit diesem ChildFocus-Dingens?

EDIT: Ja klar... logisch das er keine FocusEvents bekommt, er nimmt den Focus ja nichtmal an. Das ist auch der Grund, warum das so gut klappt, mit dem nicht-Geflicker. Ich versuche es derzeit mit CaptureMouse. Aber das will auch nicht so recht klappen. Vielleicht geht es besser?

Gruesse
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten