Contextmenu

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Contextmenu

Beitrag von notloesung »

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
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi Notlösung

Wer ist der Parent von dem Contextmenü?

Grüße Rolf
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

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
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

.. ich wieder ...

bezüglich des Parent habe ich einiges Ausprobiert ohne sichtbare Erfolge:
- Menü mit Desktop als Parent (oMenu := XbpMenu():new( AppDesktop() ):create())
- Menü ohne Parent (oMenu := XbpMenu():new():create())

irgendwie tappe ich noch im dunklen

Notloesung
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

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
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi

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 ) }
da geht's erstmal

Grüße Rolf
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

hi,
notloesung hat geschrieben: Was muss ich machen um dem Contextmenu das „korrekte“ Schließen beizubringen?
"die" Frage hab ich auch schon vor enem Jahr im Alaska Forum gestellt
und keine Antwort bekommen.
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 ) }
es geht darum das Pop-Up zu schliessen ohne das man dafür "irgendwo"
hin cklicken muss. Es wird also das "Gegenteil" von "oMenu:PopUp" gesucht.

gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo,
es geht darum das Pop-Up zu schliessen ohne das man dafür "irgendwo" hin cklicken muss.
Hmm. Willst du erreichen, daß das Popup-Menu sich nach einer gewissen Zeit automatisch schließt?

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() } } )
Alles Gute für das neue Jahr,

Günter
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Günter Beyes hat geschrieben:

Code: Alles auswählen

DLLFUNCTION EndMenu() USING STDCALL FROM user32.dll
DAS ist es was ich gesucht habe !!!
Günter Beyes hat geschrieben: Du kannst Endmenu() natürlich auch als Menüitem einbauen.

Code: Alles auswählen

oMenu:addItem( { "Menü schließen",  {|| EndMenu() } } )
gleich ausprobiert und eingebaut :)

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)
Günter Beyes hat geschrieben: Alles Gute für das neue Jahr,
bislang ging das Jahr noch nicht besonders gut los ...
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
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi

Ich glaub hier kam es grad zu einer Überschneidung der zwei Themen

aus Bereich "GUI" mit dem Thema
o:rbClick := {| aPos, uNIL, oObj | myPOPUP() } ... destroy()
von AUGE_OHR

und aus "Programmierung allgemein" mit dem Thema
Contextmenu
von notloesung

oder irre ich mich da

Grüße Rolf
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

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
:grommit:
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.
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

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
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo,

es ist mir fast peinlich, aber folgendes schließt das Kontextmenü auch :razz:

Code: Alles auswählen

oMenu:addItem( { "Menü schließen",  {|| Placebo() } } )

PROCEDURE Placebo() 
RETURN
Mittlerweile denke ich, daß EndMenu() wegen der Multithread-Architektur von Xbase++ an dieser Stelle nichts bringen kann.

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
Damit klappt auch das automatische Schließen nach einer gewissen Zeit, hier 3 Sekunden:

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
Gruß,
Günter
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

Günter Beyes hat geschrieben: es ist mir fast peinlich, aber folgendes schließt das Kontextmenü auch :razz:

Code: Alles auswählen

oMenu:addItem( { "Menü schließen",  {|| Placebo() } } )

PROCEDURE Placebo() 
RETURN
Das braucht dir doch nicht peinlich sein :wink:
denn du bringst mich auf 'ne Idee:

Code: Alles auswählen

oMenu:addItem( { "Menü schließen",  {|| NIL } } )
das reicht zum schließen auch :roll:

Wie man das nun für das automatische schließen gebrauchen kann, das ist mir (noch) nicht bekannt.

Notloesung
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

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
Antworten