doppel Menu [erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

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

doppel Menu [erledigt]

Beitrag von AUGE_OHR »

hi,

ein normales Menu ist ja in der Menu Leiste (horizontal). alternative gibt es Popup Menus (vertikal).

nun wollte ich das normal Ownerdraw Menu als Popup Menu doppeln was soweit funktioniert aber :
jetzt sind beim normalen Menu die Icons "weg" und nur im ge-doppelten Menu vorhanden ... :banghead:

jemand eine Idee woran das liegen könnte ?
der Aufruf des ge-doppelte Menu steht im Source Code erst hinter dem normalen CreateMenu()
Zuletzt geändert von AUGE_OHR am Do, 23. Jan 2014 3:18, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: doppel Menu

Beitrag von AUGE_OHR »

so das Problem mit den Icon hat sich aufgelöst, durch Umstellung des Code, aber nun hab ein anderes Problem.
Es sind viel "Schalter" im alten Menu verankert die ich zur Laufzeit mit o:childFromName( ) abfragen/setzen kann.

Code: Alles auswählen

IF( oMainDlg:childFromName( ID_VIEW ) :isItemchecked( IDV_UIMODE ), ;
aoChild[ CH_WMP ] :uiMode := "full", ;
aoChild[ CH_WMP ] :uiMode := "none" )
ich muss mich bei den ge-doppelten Menu also auch Aktionen weiterleiten zum alten Menu was auch klappt d.h. die Checkbox wird auch optisch gesetzt.
Leider funktioniert es anders-rum nicht ... wenn ich im alten Menu die Checkbox setzte wird die Änderung im neuen Menu nicht angezeigt :banghead:

Ich denke es hat was mit dem Umbau zu tun wo ich möglichst viel vorhandenen Source Code nicht doppeln wollte sondern in zerlegt habe.
alle vertikalen Popup Menu sind jetzt in einer eigene Routine während die horizontalen verschieden sind.

das alte Menu baut ja auf o:menuBar() auf während das ge-doppelte an der rechten Maustaste hängt

Code: Alles auswählen

FUNCTION CREATEMENUSYSTEM( oMainDlg, aDLGOWNER, aoChild, aoDisplay )
LOCAL oMenuBar := oMainDlg:menuBar()                        // Menubar
   oMenu := XbpImageMenu() :new(oMainDlg)                   // Parent hier Dialog !
   ...
   SUB_VIEW( oMenu,oMainDlg, aoChild, aoDisplay, aDLGOWNER )

FUNCTION RMENU1( oMainDlg, aoChild, aoDisplay, aDLGOWNER )
LOCAL oMenuBar := oMainDlg:menuBar()                        // Menubar
   oMenu1 := XbpImageMenu() :new()                          // 
   oMenu1:create(oMenuBar)                                  // hier als Parent ?
   ...
   oMenu1:addItem( { SUB_VIEW( NIL, oMainDlg, aoChild, aoDisplay, aDLGOWNER ),

STATIC FUNCTION SUB_VIEW( oMenu1,oMainDlg, aoChild, aoDisplay, aDLGOWNER  )
   IF oMenu1 <> NIL                                         // wenn ich ein Object
      oSubMenu := oMenu1                                    // aus dem alten Menu habe
      oSubMenu:setName(ID_VIEW)                             // = 2
   ELSE                                                     
      oSubMenu := XbpImageMenu() :new( oMenu1 )             // erstelle neue
      oSubMenu:title    := "~View"
      oSubMenu:BarText  := "View Control"
      oSubMenu:create()                                     
      oSubMenu:setName(ID_SUB_VIEW)                         // = 12
   ENDIF                                                    
...
   oSubMenu:addItem( { "~UiMode  Full", { || IF( SP_IsUIMode()           , ; // diese sind
       oMainDlg:childFromName( ID_VIEW ) :checkItem( IDV_UIMODE, .F. )   , ; // für das
       oMainDlg:childFromName( ID_VIEW ) :checkItem( IDV_UIMODE, .T. ) ) , ; // alte Menu
       IF( SP_IsUIMode()                                                 , ; // nochmal
       oSubMenu :checkItem( IDV_UIMODE, .F. )                            , ; // für das
       oSubMenu :checkItem( IDV_UIMODE, .T. ) )                          , ; // ge-doppelte Menu
       IF( oMainDlg:childFromName( ID_VIEW ) :isItemchecked( IDV_UIMODE ), ; // jetzt prüfen
       aoChild[ CH_WMP ] :uiMode := "full"                               , ;
       aoChild[ CH_WMP ] :uiMode := "none" )                             , ;
       IF( oMainDlg:childFromName( ID_VIEW ) :isItemchecked( IDV_UIMODE ), ;
       SP_IsUIMode( .T. )                                                , ;
       SP_IsUIMode( .F. ) ) }                                            , ;
                                                                         , ;
       XBPMENUBAR_MIA_OWNERDRAW }, CHECK_ON )
ein oMainDlg:childFromName( ID_SUB_* ):checkItem() kann ich nicht verwenden sondern muss mit oSubMenu:checkItem() arbeiten da die ID_SUB_* ja erst im zweiten Durchlauf angelegt werden ...

jemand eine Idee wie man den Code umstellen könnte ?
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: doppel Menu

Beitrag von Dieter »

Hallo Jimmy,

ich würde in der oMainDlg für jeden Menu-Schalter eine Instanzvariable, z.B. ::ID_View, einführen.
Im Kontextmenu könntest du dann problemlos über den oMainDlg:ID_View auf den gesetzten Inhalt zugreifen.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: doppel Menu

Beitrag von AUGE_OHR »

hi,
Dieter hat geschrieben:ich würde in der oMainDlg für jeden Menu-Schalter eine Instanzvariable, z.B. ::ID_View, einführen.
Im Kontextmenu könntest du dann problemlos über den oMainDlg:ID_View auf den gesetzten Inhalt zugreifen.
ich verwende ja o:SetName() womit ich die oMainDlg:childFromName( xxx ) auch finde WENN diese (irgendwo) als Parent o:MenuBar() haben.

bei einen PopUp Menu, wo man kein horizontales Menu hat, benötigt man ja nicht o:MenuBar() und damit funktioniert o:childFromName() dann nicht ?!
es scheint auch so als wenn sich ein Pop-Up Menu nicht "skinnen" lässt ... ( weil xtpSkinApplyMetrics,xtpSkinApplyMenus fehlt ? )

mit folgender Konstruktion hab nun Erfolg:

Code: Alles auswählen

oMenu1 := CreateMenuSystem( oDlg, aDLGOWNER, aoChild, aoDisplay )
//
// a Pop-Up menue on RbDown
//
oMenu2 := RMENU1( oDlg, aoChild, aoDisplay, aDLGOWNER ,oMenu1)
oLogo:RbDown   := { | mp1, mp2, obj | oMenu2:PopUp( obj, mp1, 2, ;
                  XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN ) }
Zuerst wie gehabt aber statt oMenuBar nehme ich oMainDlg als Parent für XbpMenu() (wie beim PopUp).
Rückgabe Wert ist oMenuBar (!)

Ich reiche nun oMenuBar als Parent weiter an das 2nd Menue und hänge "die" an das obere Menu an.
ich habe also im Prinzip die beiden Menu vertauscht d.h. das obere Menu sind nur PopUp-Menus als Anzeige.

jetzt scheint sowohl o:childFromName() als auch die Anzeige(n) mit der SP_*() Schaltern zu stimmen.
PopUp Menu mit iTunes Skin und BMP als Hintergrund
PopUp Menu mit iTunes Skin und BMP als Hintergrund
Doppel_Menu.PNG (267.25 KiB) 2210 mal betrachtet
p.s. alles mit Ownerdraw
gruss by OHR
Jimmy
Antworten