Contextmenu
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 194
- Registriert: Fr, 24. Feb 2006 8:09
- Kontaktdaten:
Contextmenu
Hi,
im ...\ALASKA\XPPW32\SOURCE\samples\basics\MENU Beispiel gibt es ein einfaches Contextmenu.
Wenn man dort einen Menüpunkt auswählt dann wird der entsprechende Code ausgeführt und das Menu geschlossen (oder erst Menu geschlossen und dann der dazugehörige Code ausgeführt?). Wenn kein Menupunkt ausgewählt wird und einfach irgendwo außerhalb des Menus geklickt wird dann wird das Contextmenu geschlossen (was aus sinnig ist).
Ich bastle mir gerade etwas Ähnliches. Beim Programmstart wird ein Taskbaricon in der WinTaskbar angezeigt. Mit der rechten Maustaste öffnet sich dann mein Contextmenu. Wenn ich dann einen Menupunkt auswähle so funktioniert es wie es soll: Contextmenu wird geschlossen und der dazugehörige Code ausgeführt. Wenn ich aber keinen Menupunkt auswähle und irgendwo anders klicke so wird das Menu nicht geschlossen. Und das ist absolut nervig! Das Menu wird eben erst geschlossen wenn ein Menupunkt tatsächlich ausgewählt wird.
Was muss ich machen um dem Contextmenu das „korrekte“ Schließen beizubringen?
Gruß,
Notloesung
im ...\ALASKA\XPPW32\SOURCE\samples\basics\MENU Beispiel gibt es ein einfaches Contextmenu.
Wenn man dort einen Menüpunkt auswählt dann wird der entsprechende Code ausgeführt und das Menu geschlossen (oder erst Menu geschlossen und dann der dazugehörige Code ausgeführt?). Wenn kein Menupunkt ausgewählt wird und einfach irgendwo außerhalb des Menus geklickt wird dann wird das Contextmenu geschlossen (was aus sinnig ist).
Ich bastle mir gerade etwas Ähnliches. Beim Programmstart wird ein Taskbaricon in der WinTaskbar angezeigt. Mit der rechten Maustaste öffnet sich dann mein Contextmenu. Wenn ich dann einen Menupunkt auswähle so funktioniert es wie es soll: Contextmenu wird geschlossen und der dazugehörige Code ausgeführt. Wenn ich aber keinen Menupunkt auswähle und irgendwo anders klicke so wird das Menu nicht geschlossen. Und das ist absolut nervig! Das Menu wird eben erst geschlossen wenn ein Menupunkt tatsächlich ausgewählt wird.
Was muss ich machen um dem Contextmenu das „korrekte“ Schließen beizubringen?
Gruß,
Notloesung
-
- Rekursionen-Architekt
- Beiträge: 194
- Registriert: Fr, 24. Feb 2006 8:09
- Kontaktdaten:
Hallo Rolf,
als Parent dient momentan ein xbpDialog (dieser soll später ähnlich der WinTaskbar fungieren, nur eben für selbst erstellte Programme).
Z.Z. ist der Dialog nicht sichtbar. Wenn ich ihn sichtbar mache, das Contextmenu aufrufe und dann in den Dialog reinklicke schließ sich das Menu. Klicke ich aber außerhalb des Dialogs dann bleibt das Menu sichtbar.
Im ALASKA Beispiel schließt sich das auch dann wenn ich "irgendwo" hinklicke (also auch außerhalb des zugehörigen Dialogs).
Gruß Notloesung
als Parent dient momentan ein xbpDialog (dieser soll später ähnlich der WinTaskbar fungieren, nur eben für selbst erstellte Programme).
Z.Z. ist der Dialog nicht sichtbar. Wenn ich ihn sichtbar mache, das Contextmenu aufrufe und dann in den Dialog reinklicke schließ sich das Menu. Klicke ich aber außerhalb des Dialogs dann bleibt das Menu sichtbar.
Im ALASKA Beispiel schließt sich das auch dann wenn ich "irgendwo" hinklicke (also auch außerhalb des zugehörigen Dialogs).
Gruß Notloesung
-
- Rekursionen-Architekt
- Beiträge: 194
- Registriert: Fr, 24. Feb 2006 8:09
- Kontaktdaten:
Hi Notlösung
Was für einen Owner oder Parent hat den der Dialog?
Bei einem einfachen xbpDialog scheint das mit dem Contextmenü zu funktionieren.
Kann es daran liegen das der Dialog unsichtbar ist?
Was passiert wenn der Focus verloren geht. Man könnte das Menü auch im
killDisplayFocus-Slot wieder schließen. (Obwohl das nur eine Notlösung wäre)
Grüße Rolf
Was für einen Owner oder Parent hat den der Dialog?
Bei einem einfachen xbpDialog scheint das mit dem Contextmenü zu funktionieren.
Kann es daran liegen das der Dialog unsichtbar ist?
Was passiert wenn der Focus verloren geht. Man könnte das Menü auch im
killDisplayFocus-Slot wieder schließen. (Obwohl das nur eine Notlösung wäre)
Grüße Rolf
Hi
ich hab da mal schnell was zusammengebaut:
da geht's erstmal
Grüße Rolf
ich hab da mal schnell was zusammengebaut:
Code: Alles auswählen
PUBLIC oMenu
PUBLIC oXbp
//-- Dialog erzeugen
oXbp:= XbpDialog():new(AppDesktop(),AppDesktop(),{300,300} ,{20,20},, .F. )
oXbp:icon := 1
oXbp:titleBar := .F.
oXbp:maxButton:= .F.
oXbp:minButton:= .F.
oXbp:taskList := .F. && mit Taskleisteneintrag
oXbp:create()
oXbp:show()
oMenu := XbpMenu():new( oXbp:drawingArea )
oMenu:create()
oMenu:title := "Popup"
oMenu:addItem( { "~Eins"+Space(20) , {|| Msgbox( "Erster Eintrag" ) } } )
oMenu:addItem( { "~Zwei"+Space(20) , {|| Msgbox( "Zweiter Eintrag" ) } } )
oMenu:addItem( { "~Drei"+Space(20) , {|| Msgbox( "Dritter Eintrag" ) } } )
oMenu:addItem( { "~Vier"+Space(20) , {|| Msgbox( "Vierter Eintrag" ) } } )
oXbp:drawingArea:rbDown := {|aPos,x,obj| oMenu:popup( obj, aPos ) }
Grüße Rolf
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Contextmenu
hi,
und keine Antwort bekommen.
hin cklicken muss. Es wird also das "Gegenteil" von "oMenu:PopUp" gesucht.
gruss by OHR
Jimmy
"die" Frage hab ich auch schon vor enem Jahr im Alaska Forum gestelltnotloesung hat geschrieben: Was muss ich machen um dem Contextmenu das „korrekte“ Schließen beizubringen?
und keine Antwort bekommen.
es geht darum das Pop-Up zu schliessen ohne das man dafür "irgendwo"Rolf hat geschrieben: ich hab da mal schnell was zusammengebaut:
...
oMenu:addItem( { "~Vier"+Space(20) , {|| Msgbox( "Vierter Eintrag" ) } } )
oXbp:drawingArea:rbDown := {|aPos,x,obj| oMenu:popup( obj, aPos ) }
hin cklicken muss. Es wird also das "Gegenteil" von "oMenu:PopUp" gesucht.
gruss by OHR
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 315
- Registriert: Mo, 16. Okt 2006 13:04
- Wohnort: Region Stuttgart
Hallo,
Das müßte so gehen:
Du kannst Endmenu() natürlich auch als Menüitem einbauen.
Alles Gute für das neue Jahr,
Günter
Hmm. Willst du erreichen, daß das Popup-Menu sich nach einer gewissen Zeit automatisch schließt?es geht darum das Pop-Up zu schliessen ohne das man dafür "irgendwo" hin cklicken muss.
Das müßte so gehen:
Code: Alles auswählen
SetTimerEvent( nTimeOut, {|| EndMenu(), SetTimerEvent(0) } )
oMenu:popup( obj, aPos )
SetTimerEvent(0)
DLLFUNCTION EndMenu() USING STDCALL FROM user32.dll
Du kannst Endmenu() natürlich auch als Menüitem einbauen.
Code: Alles auswählen
oMenu:addItem( { "Menü schließen", {|| EndMenu() } } )
Günter
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
Ich habe es für den "FullScreen" Modus meines aktiveX Mediaplayer
benötigt den im "FullScreen" Mode hab ich ja nichts wo ich hin clicken
könnte (ausser ins Videobild)
schon Sylvester ging es los als der Wind aufkam und dann der Regen.
zugegeben war ich nicht gut vorbereitet, lag doch alles noch verpackt
im Kofferraum. So passierte es nun das während des auspacken der
Böller einige so nass wurden das die nicht losgingen. Dumm war es
nun mit den Abschuss "Batterien" (nicht Akkus gemeint) die man ja
auf den Boden legen sollte. Diese wurden "von unter nass" sodas die
nach 20-30 "Schuss" aufhörten obwohl man genau sah das es noch
nicht mal die Hälfte der "Batterie" war ...
Erst nachdem ich anfing die "aufzustapeln" klappte es einigermassen,
aber da gab es ja auch noch die Zündschnüre ... irgendwie werden die
immer kürzer (hab ich das Gefühl ...) und mit den nassen Fingern war
das immer so eine Sache. Oft hab ich mich nicht mehr getraut den "Rest"
der Zündschnur noch einmal anzuzünden, aber zum Glück gibt es ja
eine "Reserve" Zündschnur sodas ich es meisten doch noch geschafft
habe...
naja das "richtige" Neujahr kommt für uns Chinesen ja noch und da
wird es dann auch mit dem Feuerwerk (hoffentlich) besser klappen.
danke nochmal für deinen Tip
und allen ein frohes neues Jahr
gruss by OHR
Jimmy
DAS ist es was ich gesucht habe !!!Günter Beyes hat geschrieben:Code: Alles auswählen
DLLFUNCTION EndMenu() USING STDCALL FROM user32.dll
gleich ausprobiert und eingebautGünter Beyes hat geschrieben: Du kannst Endmenu() natürlich auch als Menüitem einbauen.Code: Alles auswählen
oMenu:addItem( { "Menü schließen", {|| EndMenu() } } )
Ich habe es für den "FullScreen" Modus meines aktiveX Mediaplayer
benötigt den im "FullScreen" Mode hab ich ja nichts wo ich hin clicken
könnte (ausser ins Videobild)
bislang ging das Jahr noch nicht besonders gut los ...Günter Beyes hat geschrieben: Alles Gute für das neue Jahr,
schon Sylvester ging es los als der Wind aufkam und dann der Regen.
zugegeben war ich nicht gut vorbereitet, lag doch alles noch verpackt
im Kofferraum. So passierte es nun das während des auspacken der
Böller einige so nass wurden das die nicht losgingen. Dumm war es
nun mit den Abschuss "Batterien" (nicht Akkus gemeint) die man ja
auf den Boden legen sollte. Diese wurden "von unter nass" sodas die
nach 20-30 "Schuss" aufhörten obwohl man genau sah das es noch
nicht mal die Hälfte der "Batterie" war ...
Erst nachdem ich anfing die "aufzustapeln" klappte es einigermassen,
aber da gab es ja auch noch die Zündschnüre ... irgendwie werden die
immer kürzer (hab ich das Gefühl ...) und mit den nassen Fingern war
das immer so eine Sache. Oft hab ich mich nicht mehr getraut den "Rest"
der Zündschnur noch einmal anzuzünden, aber zum Glück gibt es ja
eine "Reserve" Zündschnur sodas ich es meisten doch noch geschafft
habe...
naja das "richtige" Neujahr kommt für uns Chinesen ja noch und da
wird es dann auch mit dem Feuerwerk (hoffentlich) besser klappen.
danke nochmal für deinen Tip
und allen ein frohes neues Jahr
gruss by OHR
Jimmy
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Rolf,
Jimmy hat den Beitrag von Günther zum Anlaß genommen, seinen "alten", von Dir genannten Thread wieder zu reaktivieren, da dies die Lösung auch seines dort genannten Problemes ist.
Viele Grüße,
Martin
Jimmy hat den Beitrag von Günther zum Anlaß genommen, seinen "alten", von Dir genannten Thread wieder zu reaktivieren, da dies die Lösung auch seines dort genannten Problemes ist.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
-
- Rekursionen-Architekt
- Beiträge: 194
- Registriert: Fr, 24. Feb 2006 8:09
- Kontaktdaten:
Hallo Helfer,
die Lösung von Günter ist super!
Bei mir funktioniert das ganze zwar etwas eingeschränkt aber es macht schon das was es soll.
Wenn ich die Funktion EndMenu() über einen Menüpunkt aufrufe so klappt es. Das automatische schließen (nach einer gewissen Zeit) funktioniert leider nicht, ist aber auch nicht ganz so tragisch.
Woran es genau liegt kann ich nicht sagen.
Die Funktion EndMenu() funktioniert bei mir eben nur dann wenn sie direkt aus dem Menü aufgerufen wird. Sonst (also wenn sie "frei" aufgerufen wird) passiert nichts, auch keine Fehlermeldung.
Vielen Dank für die Lösung(svorschläge).
Notloesung
die Lösung von Günter ist super!
Bei mir funktioniert das ganze zwar etwas eingeschränkt aber es macht schon das was es soll.
Wenn ich die Funktion EndMenu() über einen Menüpunkt aufrufe so klappt es. Das automatische schließen (nach einer gewissen Zeit) funktioniert leider nicht, ist aber auch nicht ganz so tragisch.
Woran es genau liegt kann ich nicht sagen.
Die Funktion EndMenu() funktioniert bei mir eben nur dann wenn sie direkt aus dem Menü aufgerufen wird. Sonst (also wenn sie "frei" aufgerufen wird) passiert nichts, auch keine Fehlermeldung.
Vielen Dank für die Lösung(svorschläge).
Notloesung
-
- Rekursionen-Architekt
- Beiträge: 315
- Registriert: Mo, 16. Okt 2006 13:04
- Wohnort: Region Stuttgart
Hallo,
es ist mir fast peinlich, aber folgendes schließt das Kontextmenü auch
Mittlerweile denke ich, daß EndMenu() wegen der Multithread-Architektur von Xbase++ an dieser Stelle nichts bringen kann.
Dafür geht aber folgendes.
Damit klappt auch das automatische Schließen nach einer gewissen Zeit, hier 3 Sekunden:
Gruß,
Günter
es ist mir fast peinlich, aber folgendes schließt das Kontextmenü auch
Code: Alles auswählen
oMenu:addItem( { "Menü schließen", {|| Placebo() } } )
PROCEDURE Placebo()
RETURN
Dafür geht aber folgendes.
Code: Alles auswählen
#define WM_CANCELMODE 0x001F
PROCEDURE CloseMenu( oMenuParent )
IF upper( oMenuParent:className() ) == "XBPCRT"
PostMessageA( GetDrawingAreaHwnd( oMenuParent ), WM_CANCELMODE, 0, 0 )
ELSE
PostMessageA( oMenuParent:getHWND(), WM_CANCELMODE, 0, 0 )
ENDIF
RETURN
FUNCTION GetDrawingAreaHWND( oCrt )
RETURN FindWindowExA( oCrt:getHWND(), 0, "MDIClient", 0 )
DLLFUNCTION FindWindowExA( hwndParent, hwndChildAfter, ClassName, WinName ) USING STDCALL FROM user32.dll
DLLFUNCTION PostMessageA( hWnd, nMsg, wParam, lParam ) USING STDCALL FROM user32.dll
Code: Alles auswählen
oParent:rbDown := {|aPos,x,obj| TimedPopupMenu( 300, oMenu, obj, aPos ) }
PROCEDURE TimedPopupMenu( nTimeOut, oMenu, oMenuParent, aPos )
SetTimerEvent( nTimeOut, {|| CloseMenuTimed( oMenuParent ) } )
oMenu:popup( oMenuParent, aPos )
RETURN
PROCEDURE CloseMenuTimed( oMenuParent )
STATIC lFirst
// den ersten Aufruf ignorieren
IF lFirst = NIL
lFirst := .F.
RETURN
ENDIF
CloseMenu( oMenuParent )
SetTimerEvent(0)
lFirst := NIL
RETURN
Günter
-
- Rekursionen-Architekt
- Beiträge: 194
- Registriert: Fr, 24. Feb 2006 8:09
- Kontaktdaten:
Das braucht dir doch nicht peinlich seinGünter Beyes hat geschrieben: es ist mir fast peinlich, aber folgendes schließt das Kontextmenü auch
Code: Alles auswählen
oMenu:addItem( { "Menü schließen", {|| Placebo() } } ) PROCEDURE Placebo() RETURN
denn du bringst mich auf 'ne Idee:
Code: Alles auswählen
oMenu:addItem( { "Menü schließen", {|| NIL } } )
Wie man das nun für das automatische schließen gebrauchen kann, das ist mir (noch) nicht bekannt.
Notloesung
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
nachdem wir nun gelernt haben wie man per Maus das Menu "verlassen"
kann würde ich gerne wissen wie es mit Keyboard ist ?
Ich würde gerne die _LEFT / _RIGHT in einem solches Menu "abfangen",
wie geht das ?
wenn man ein "horizontales" Menu hätte würde ja in den "vertikalen"
Menu die _LEFT / _RIGHT "abgefangen" und an das "horizontale" über-
geben ...
gruss by OHR
Jimmy
p.s. OW Menu
nachdem wir nun gelernt haben wie man per Maus das Menu "verlassen"
kann würde ich gerne wissen wie es mit Keyboard ist ?
Ich würde gerne die _LEFT / _RIGHT in einem solches Menu "abfangen",
wie geht das ?
wenn man ein "horizontales" Menu hätte würde ja in den "vertikalen"
Menu die _LEFT / _RIGHT "abgefangen" und an das "horizontale" über-
geben ...
gruss by OHR
Jimmy
p.s. OW Menu