XbpMenuBar() ignoriert xbeP_ItemSelected?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

XbpMenuBar() ignoriert xbeP_ItemSelected?

Beitrag von georg »

Hallo,


mal wieder die Basteleien am Menü-System:

Code: Alles auswählen

FUNCTION GenerateMenu()
   Local oBar

   oBar := SetAppWindow():menuBar()
   oBar:addItem({"~File",   {|mp1, mp2, self| MenuSubFile(mp1, mp2, self)}})
   oBar:addItem({"~Edit",   {|mp1, mp2, self| MenuSubEdit(mp1, mp2, self)}})
   oBar:addItem({"~Window", {|mp1, mp2, self| MenuSubWindow(mp1, mp2, self)}})
RETURN (.T.)

FUNCTION MenuSubFile(mp1, mp2, oBar)
   Local aPos, aSize
   Local cCaption
   Local lDone
   Local oSub

   cCaption := oBar:getItem(mp1)[1]
   oSub := Xbpmenu():new(oBar):create()
   oSub:Title := cCaption
   oSub:addItem({"~Show", {|| ShowMe(1)}})
   oSub:addItem({"~Tell", {|| ShowMe(2)}})
   oSub:addItem({"E~xit", {|| PostAppEvent(xbeP_Close)}})
   lDone := oBar:setItem(mp1, {oSub, NIL})
   lDone := oBar:selectItem(mp1)
RETURN (lDone)
Was mache ich? Ich erzeuge NUR einen XbpMenuBar(), und wenn eines der Items angeklickt wird, soll das entsprechende Submenü "on the fly" erzeugt und angezeigt werden. (Dahinter steht eine komplexere Anwendung, bei der die Auswahl der erlaubten und gesperrten Menüpunkte zum Programmstart noch nicht zwingend festgelegt ist. Dies soll bei der Auswahl eines Menüpunktes des XbpMenuBar() entschieden werden.)

Mit setItem() ersetze ich das bisherige Item im XbpMenuBar() und versuche dann, über die Methode selectItem() den gerade geänderten Eintrag des XbpMenuBar() auszuwählen. Meinem Verständnis nach sollte der durch diese Methode ausgewählt und damit aufgeklappt werden.

Die Methode selbst liefert ein .T. zurück, der XbpMenuBar() Eintrag wird jedoch nicht ausgewählt. Hat einer von Euch eine Idee, ob ich da einen Denkfehler habe, oder ob es ein Fehler des Laufzeitsystems ist?

Hmmm, manche Fragen erübrigen sich nach der Lektüre der Dokumentation ... selectItem() setzt die Default-Auswahl für ein Menü. Was ich suche, ist ein Ereignis, mit dem ich aus dem Programm heraus das Menü "aufklappen" kann.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpMenuBar() ignoriert xebP_ItemSelected?

Beitrag von AUGE_OHR »

georg hat geschrieben:mal wieder die Basteleien am Menü-System:

Was ich suche, ist ein Ereignis, mit dem ich aus dem Programm heraus das Menü "aufklappen" kann.

Code: Alles auswählen

oMenu:popUp()
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpMenuBar() ignoriert xebP_ItemSelected?

Beitrag von georg »

Hallo, Jimmy -


auch schon versucht ... klappt nicht. Code liefere ich heute abend nach.

Das Problem mit popUp() ist, dass ich die Position angeben muss. XbpMenuBar() liefert über currentPos() und currentSize() nur die Koordinaten des Objektes an sich, nicht jedoch die des ausgewählten Items. Für das erste Item würde das stimmen, nicht aber für die Items 2 und folgende.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpMenuBar() ignoriert xebP_ItemSelected?

Beitrag von AUGE_OHR »

georg hat geschrieben:auch schon versucht ... klappt nicht. Code liefere ich heute abend nach.
hm ... das Menu selbst ist schon aufgebaut ?
georg hat geschrieben:Das Problem mit popUp() ist, dass ich die Position angeben muss. XbpMenuBar() liefert über currentPos() und currentSize() nur die Koordinaten des Objektes an sich, nicht jedoch die des ausgewählten Items. Für das erste Item würde das stimmen, nicht aber für die Items 2 und folgende.
Ownerdraw ... da gibt es für jedes Element ein aINFO[ XBP_DRAWINFO_RECT ]
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpMenuBar() ignoriert xbeP_ItemSelected?

Beitrag von georg »

Hallo, Jimmy -


der Ansatz mit dem popUp() sieht so aus:

Code: Alles auswählen

   oSub:addItem({"E~xit", {|| PostAppEvent(xbeP_Close)}})
   lDone := oBar:setItem(mp1, {oSub, NIL})
   aPos := oSub:currentPos()
   aSize := osub:currentSize()
   oSub:popup(SetAppWindow(), aPos)
Da currentPos() zu der Zeit nur die Werte {0, 0} enthält, wird das Popup-Menü unten links im SetAppWindow() angezeigt.

Deine Überlegung mit Owner-Drawing hört sich interessant an, nur: gibt es diese Information zum Zeitpunkt des xbeP_ItemSelected, und wenn ja, wo kann ich sie abfragen? Soweit ich das verstanden habe, werden diese Informationen zur Laufzeit mitgegeben, wenn Owner-Drawing angefordert wird?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: XbpMenuBar() ignoriert xbeP_ItemSelected?

Beitrag von Tom »

Hallo, Georg.

Wenn ein ItemSelected ausgelöst wird, geht der Auftrag, den Menüpunkt zu zeichnen, an die entsprechende Funktion oder Methode, je nachdem, wie Du das Ownerdrawing implementierst. Das Ownerdrawing muss übrigens überhaupt nicht zeichnen, sondern kann einfach ans Betriebssystem bzw. die Laufzeitumgebung übergeben. Dort kannst Du den Status abrufen, also den Zustand (Element "nState" des aInfo-Arrays). XBP_DRAWSTATE_SELECTED sagt Dir, dass der Menüpunkt gewählt ist. Die Position, die Du ebenfalls im aInfo-Array bekommst, könntest Du z.B. über eine Get-Set-Funktion wegspeichern - und in der Popup-Methode verwenden. Dann wäre das Popup-Menü an der richtigen Stelle. Und, wie gesagt - Du musst ja überhaupt nicht zeichnen, also tatsächliches Ownerdrawing veranstalten. Du willst nur wissen, wo der Menüpunkt steht, und das erfährst Du dort. Den Rest lässt Du dann wie gehabt machen - oder Du malst tatsächlich selbst.
Herzlich,
Tom
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpMenuBar() ignoriert xbeP_ItemSelected?

Beitrag von georg »

Hallo, Tom -


nun, nicht ganz mein Fachgebiet ...

Code: Alles auswählen

   oBar := SetAppWindow():menuBar()
   oBar:drawItem := {|oPS, aInfo, self| MyMenuBarDraw(oPS, aInfo, self)}
   oBar:addItem({"~File",   {|mp1, mp2, self| MenuSubFile(mp1, mp2, self)}, , XBPMENUBAR_MIA_OWNERDRAW})
Ich habe also mal den Slot drawItem() besetzt:

Code: Alles auswählen

FUNCTION MyMenuBarDraw(oPS, aInfo, oBar)
   oBar:cargo := AClone(aInfo)
RETURN (.T.)
Die Funktion MyMenuBarDraw() wird aufgerufen, es wird aber kein Menü mehr angezeigt, unabhängig davon, ob die Funktion TRUE, FALSE oder oBar als Rückgabewert liefert. Lasse ich übrigens XBPMENUBAR_MIA_OWNERDRAW weg, wird das MenuItem angezeigt, aber kein drawItem() generiert.

Etwas verwirrt bin ich schon, das gebe ich zu ...
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: XbpMenuBar() ignoriert xbeP_ItemSelected?

Beitrag von Tom »

Hallo, Georg.

Ich verwende Ownerdrawing bei Menüs nicht, aber ich habe gerade nachgeschaut - das Verhalten, das es bei anderen Parts gibt, nämlich in CustomDraw-Methoden durchaus auch das Zeichnen dem System zu überlassen, scheint bei Menüs nicht vorgesehen zu sein. Du müsstest also in jedem Fall etwas malen - die Rückgabewerte sind hier egal. Ein Beispiel für einfache Ownerdrawing-Menüs gibt es m.E. in den Samples.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpMenuBar() ignoriert xbeP_ItemSelected?

Beitrag von AUGE_OHR »

Tom hat geschrieben:Ich verwende Ownerdrawing bei Menüs nicht, aber ich habe gerade nachgeschaut - das Verhalten, das es bei anderen Parts gibt, nämlich in CustomDraw-Methoden durchaus auch das Zeichnen dem System zu überlassen, scheint bei Menüs nicht vorgesehen zu sein.
CustomDraw ist die Bezeichnung von Alaska für XbpBrowse() / XbpMultiCellGroup() und von Listview "abgeguckt" (NM_CUSTOMDRAW) ...

Jedes Windows Common Control hat Ownerdraw Eigenschaften ... auch wenn Alaska es o:Draw nennt oder nicht umgesetzt hat ( Treeview, Statusbar, Toolbar ... )
Tom hat geschrieben:Du müsstest also in jedem Fall etwas malen
wenn das "Attribut" XBPMENUBAR_MIA_OWNERDRAW verwendet wird
Tom hat geschrieben:- die Rückgabewerte sind hier egal.
nicht ganz ...
o:menuBar() ist ja das horizontale Menu. Wenn du nun ein Submenu hast "öffnest" du es ja horizontal !
Darüberhinaus ist ein logischer Wert als Rückgabewert der Methode :drawItem() beziehungsweise des Codeblocks in der Instanzvariable :drawItem zulässig, wodurch das Verhalten des XbpMenubar-Objekts in Bezug auf die Anzeige des Pfeilsymbols neben Submenüeinträgen beeinflusst werden kann. Ist der Rückgabewert .T. (wahr) oder das Objekt (self), werden Submenüeinträge durch einen kleinen Pfeil nach rechts kenntlich gemacht. Wird hingegen .F. (falsch) zurückgegeben, wird die Anzeige des Pfeilsymbols unterdrückt.
Tom hat geschrieben:Ein Beispiel für einfache Ownerdrawing-Menüs gibt es m.E. in den Samples.
c:\ALASKA\XPPW32\Source\samples\basics\OWNERDRW\OWNERDRW.prg
am Ende des PRG findest man

Code: Alles auswählen

   oMbar := oDlg:menuBar()
   oMbar:measureItem := {|nItem,aDims,self| MeasureMenubarItem(oDlg,self,nItem,aDims) }
   oMbar:drawItem    := {|oPS,aInfo,self  | DrawMenubarItem(oDlg,self,oPS,aInfo) }
aber die Function dazu stehen in c:\ALASKA\XPPW32\Source\samples\basics\OWNERDRW\MENUS.PRG

Code: Alles auswählen

FUNCTION MeasureMenubarItem( oDlg, oMbar, nItem, aDims )
FUNCTION DrawMenubarItem( oDlg, oMbar, oPS, aInfo )
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpMenuBar() ignoriert xbeP_ItemSelected?

Beitrag von georg »

Guten Morgen,


inzwischen habe ich das Problem gelöst, indem ich (ähnlich wie in den gerade zitierten Beispielen) ermittle, wie breit die einzelnen Items sind, und zeige dann entsprechend verschoben ein PopUp-Menü an.

Da die Lösung auch dem Kunden zusagt, belasse ich es (erst einmal) dabei.

Vielen Dank aber für die Rückmeldungen und die hilfreichen Hinweise.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten