Bug im Ownerdrawing bei xbpMenu?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Bug im Ownerdrawing bei xbpMenu?

Beitrag von Lewi »

Bei den Ownerdrawing-Eigenschaften von XbpMenu bin ich auf ein Re-Paint Problem gestoßen. Wird das Beispiel von Ownerdrw.prg wie folgt abgeändert und um einige Menupunkte erweitert:

Code: Alles auswählen

PROCEDURE CreateMenuSystem( oDlg )

 LOCAL oFMenu, oHMenu, oSMenu, oMbar, oS1Menu

   // Erzeugen des Menuesystems der Anwendung mit
   // von XbpImageMenu-Objekten. Die von XbpMenu
   // abgeleitete Klasse implementiert die fuer
   // das Owner-Drawing in Menues noetige
   // Logik sowie die Ereignisbearbeitung.
   //
   // "Datei"-Popup-Menue
   oFMenu := XbpImageMenu():new()
   oFMenu:BarText:= "File Menu"
   oFMenu:title  := "~File"
   oFMenu:create( oDlg )
   oFMenu:addItem( {"~Open..."+Chr(9)+"Ctrl+O",;
                   {|| NIL},,                          XBPMENUBAR_MIA_OWNERDRAW } )
   oFMenu:addItem( {"~Save"+Chr(9)+"Ctrl+S",;
                   {|| NIL},,                          XBPMENUBAR_MIA_OWNERDRAW } )
   oFMenu:addItem( {NIL,;
                   {|| NIL}, XBPMENUBAR_MIS_SEPARATOR, XBPMENUBAR_MIA_OWNERDRAW } )
   oFMenu:addItem( {"~Properties",;
                   {|| MsgBox("Settings")},,           XBPMENUBAR_MIA_OWNERDRAW },;
                   121 )
   oFMenu:addItem( {NIL,;
                   {|| NIL}, XBPMENUBAR_MIS_SEPARATOR, XBPMENUBAR_MIA_OWNERDRAW } )
   oFMenu:addItem( {"~Quit"+Chr(9)+"Alt+F4",;
                   {|| PostAppEvent(xbeP_Quit)},,      XBPMENUBAR_MIA_OWNERDRAW },;
                   120 )

   // "Hilfe -> Hilfeartikel"-Untermenue
   oSMenu := XbpImageMenu():new():create( oDlg )
   oSMenu:title  := "~Help Articles"
   oSMenu:addItem( {"Article ~1..."+Chr(9)+"Ctrl+1",;
                  {|| NIL},,                          XBPMENUBAR_MIA_OWNERDRAW },;
                  123 )
   oSMenu:addItem( {"Article ~2..."+Chr(9)+"Ctrl+2",;
                  {|| NIL},,                          XBPMENUBAR_MIA_OWNERDRAW },;
                  123 )
   oSMenu:addItem( {"Article ~3..."+Chr(9)+"Ctrl+3",;
                  {|| NIL},,                          XBPMENUBAR_MIA_OWNERDRAW },;
                  123 )

   oS1Menu := XbpImageMenu():new():create( oDlg )
   oS1Menu:title  := "~Help Test"
   oS1Menu:addItem( {"Test 1..."+Chr(9)+"Ctrl+4",;
                  {|| NIL},,                          XBPMENUBAR_MIA_OWNERDRAW },;
                  123 )
   oS1Menu:addItem( {"Test 2..."+Chr(9)+"Ctrl+5",;
                  {|| NIL},,                          XBPMENUBAR_MIA_OWNERDRAW },;
                  123 )
   oS1Menu:addItem( {"Test 3 ..."+Chr(9)+"Ctrl+6",;
                  {|| NIL},,                          XBPMENUBAR_MIA_OWNERDRAW },;
                  123 )


   // "Hilfe"-Popup-Menue
   oHMenu := XbpImageMenu():new()
   oHMenu:BarText:= "Help"
   oHMenu:title  := "~Help"
   oHMenu:create( oDlg )
   oHMenu:addItem( {"~Test",;
                  {|| MsgBox("Test")},,           XBPMENUBAR_MIA_OWNERDRAW },;
                  121 )

   oHMenu:addItem( {oSMenu,,, XBPMENUBAR_MIA_OWNERDRAW}, 122 )
   oHMenu:addItem( {oS1Menu,,, XBPMENUBAR_MIA_OWNERDRAW}, 122 )
   oHMenu:addItem( {NIL,;
                   {|| NIL}, XBPMENUBAR_MIS_SEPARATOR, XBPMENUBAR_MIA_OWNERDRAW } )
   oHMenu:addItem( {"~About",;
                  {|| MsgBox("About")},,           XBPMENUBAR_MIA_OWNERDRAW },;
                  121 )

   // Hinzufuegen der Popup-Menues zur
   // Menuezeile
   oMbar := oDlg:menuBar()
   oMbar:measureItem := {|nItem,aDims,self| MeasureMenubarItem(oDlg,self,nItem,aDims) }
   oMbar:drawItem    := {|oPS,aInfo,self  | DrawMenubarItem(oDlg,self,oPS,aInfo) }
   oMbar:addItem( {oFMenu,,, XBPMENUBAR_MIA_OWNERDRAW} )
   oMbar:addItem( {oHMenu,,, XBPMENUBAR_MIA_OWNERDRAW} )

RETURN

wird ein Teil des Aufklapp-Menüs beim „einklappen“ nicht überpaintet.
Bild

Versuche, den betreffenden Bereich "manuell" mit einer GraBox() zu überpainten, blieben erfolglos.

Ich habe die Vermutung, dass der Bezugspunkt des übergebenen Presentation-Space fehlerhaft ist, die Dimension des PS indes aber stimmt.

Oder gibt es eine Lösung?



Gruß,
Olaf
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 Olaf,
setze Dich mal mit Jan hier aus dem Forum in Verbindung bzw. nimm mal seine in seinem Beispiel-ZIP beigefügten neueren (DLL-)Dateien von Alaska!
Das Problem als solches kommt mir sehr bekannt vor - ich weiß jetzt leider nur nicht mehr, ob ich darüber was hier im Forum, in den Newsgroups (glaube ich, am ehesten) oder bei der letzten XUG-Osnabrück-Sitzung gelesen/gehört habe - und leider habe ich im Moment wenig Zeit, mich auf die Suche zu machen...

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.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Martin,
ich habe Jan kontaktiert. Mal schauen, ob mit der neuen DLL das Problem behoben ist.

Gruß
Olaf
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 Olaf,
wie geschrieben - die ist auch in seiner ZIP drin (wenn Du Dir sein Beispiel mit den Buttons aus der Wissensbasis herunterlädst).
Diente zwar in erster Linie dem Beheben der Unverträglichkeiten beim Ansprechen der Position im Top-Left-Verfahren, aber wer weiß?

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.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Auch mit diesen DLL´s besteht das Problem weiterhin.

Ich werde ALASKA das Problem melden.

Gruß,
Olaf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Olaf,

Du hast Recht, mit den neuen dll sollte das Resultat kein anderes sein. Die helfen "nur" bei TopLeft und bei diversen ActiveX-Problemen.

Ich schau mir gerne Dein Problem genauer an, aber ich werde bis morgen Abend in Rendsburg auf einer 68 m-Luxus-Jacht sein (beruflich, nicht privat :-)). Ich werde also wohl erst frühestens in 24 Stunden dazu kommen, eher erst am Mittwoch.

Es gibt allerdings in der Tat ein paar Probleme in der Darstellung von Ownerdraw-Menus. Auch in der Font-Darstellung des Alaska-Beispiels auf der Installations-CD kannst D soetwas beobachten, wenn auch nicht auf jedem Rechner.

Jan
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 Olaf,
habe während meiner Nachtschicht doch noch ein wenig Zeit zum Stöbern gefunden.
Es war hier im Forum in diesem Thread von Jimmy (AUGE_OHR), in dem das Thema (am Rande) zur Sprache kam.
Er bezieht sich dabei auch auf den PDR #5562, der aber nichts mit Deinem Problem zu tun hat.

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.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Martin,
in dem von angesprochenen Thread hast Du - wie ich nun feststellen mußte - , das Problem kurz angesprochen.

Die Frage ist, ob dass Problem als solches schon gelöst ist?

Ich habe in meiner xbImageButton-Class mittlerweile eine Möglichkeit geschaffen, zu einem (Flat-) Button aufklappbare Listeneinträge anzuzeigen. Leider funktioniert das nur ohne "Untermenüs" einwandfrei, bei aufklappbaren Untermenüs gibt es leider das "Schatten-Problem". Und wie es scheint, läßt sich das Problem nur durch ein BugFix seitens Alaska beheben.

Beispiel:

Bild

Gruß, Olaf
Zuletzt geändert von Lewi am Mo, 20. Nov 2006 23:18, insgesamt 1-mal geändert.
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 Olaf,
yup (damit meine ich jetzt nicht, dass es bereits gelöst ist - das weiß ich nicht) - Alaska ist in diesem Fall der richtige Ansprechpartner!
Denen ist das Problem seit der diesjährigen DevCon auch bereits bekannt (jetzt weiß ich auch wieder, wo ich das gesehen/gehört hatte)!
Das mit den Untermenüs zu den Flat-Buttons: Genial :!:

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.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Tja Martin, ist nur ärgerlich, dass meine Lösung nur (teilweise) "optimal" funktioniert. Mal schauen, wann ALASKA einen BugFix bereit stellt.

Gruß, Olaf
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Übrigens, das "Schattenproblem" tritt in Zusammenhang mit Untermenüs nicht auf, wenn einzelne Menüeinträge über die Tastatur angewählt werden.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Ich habe das Verhalten von Ownerdrawing in Zusammenhang mit xbpMenu eingehend untersucht.

Erst nach dem ::drawItem( oPs, aInfo) ausgeführt wurde, schließt sich ein Aufklappmenu. Nach dem Schließen des Aufklappmenus werden Teile des an drawItem() übergebenen Presentations-Space postum (fehlerhaft) überpaintet bzw. restauriert. Dies betrifft bezogen auf den PS den Bereich von {x-2, 0} bis {x,y}. Insofern ist es aussichtslos, innerhalb von drawItem() dem Fehlverhalten mit irgendwelchen DrawBox()-Menthoden beim Schließen eines Sub-Menus entgegenzuwirken.

Ich habe allerdings eine Lösung, die den Bug auf ein erträgliches Maß reduziert.

Ausgehend von Beispiel von Alaska habe ich in der Menu.prg folgende Änderung in der Methode ::DrawItem() vorgenommen:

Code: Alles auswählen


/**** die 3 nachfolgenden Zeilen sind vor dem Orginlacode *********/
IF aInfo[2] == XBP_DRAWACTION_DRAWALL .AND. aInfo[1] >1
      aInfo[2] := XBP_DRAWACTION_SELCHANGE
   endif
*******************************************************************
// ab hier wieder der Orginalcode:

   IF BAND(aInfo[2], XBP_DRAWACTION_DRAWALL) != 0 .AND. aInfo[1] == 1 
      aAAttrs[GRA_AA_COLOR] := MENU_BGCOLOR
      .........
      .....

Hinweis zum Code:
Wenn der Mouse-Cursor von einem Sub-Menu wieder auf einen anderen Haupt-Menueintrag gesetzt wird, enthält aInfo[2] immer den Status XBP_DRAWACTION_DRAWALL.

Wie schon erwähnt: Wenn über den Pfeiltasten ein Sub-Menu geschlossen wird, landet der Mouse-Cursor wieder auf den Menueintrag, der das Sub-Menu repräsentiert. In diesem Fall wird die DrawItem()-Methode nicht durchlaufen. Und in diesem Fall erscheint auch kein Schatten-Fehler.
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 Olaf,
hast Du Deine Ergebnisse denn auch schon an Alaska gemailt? Till würde sich bestimmt freuen...

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.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Nein, bisher nicht. Außerdem habe ich keine Mail-Adresse von Till, da ich bisher noch keinen Kontakt zu ihm hatte.
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 Olaf,
Du kannst auch direkt an die offizielle Supportadresse mailen - landet früher oder später bei Till :D

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.
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,
Lewi hat geschrieben: Dies betrifft bezogen auf den PS den Bereich von {x-2, 0} bis {x,y}.
Es ist doch {-4, 0} bis {x+4,y}, oder ?

Also wenn man sich den "Schatten" mal ansieht und dann auf so einem
MenuItem steht dann geht der "Frame" des MenuItem nur bis zum "Schatten"

Code: Alles auswählen

// ab hier wieder der Orginalcode:
IF BAND(aInfo[2], XBP_DRAWACTION_DRAWALL) != 0  .AND. aInfo[1] == 1
   aAAttrs[GRA_AA_COLOR] := MENU_BGCOLOR
   GraSetAttrArea( oPS, aAAttrs )
   GraBox( oPS, {0,0}, {oPS:SetPageSize()[1]}, GRA_FILL )
An dieser Stelle wird doch der "Hintergrund" komplett(?) neu gezeichnet.
Dann erst folgt der "BarText" und die MenuItem´s.
Lewi hat geschrieben: Insofern ist es aussichtslos, innerhalb von drawItem() dem Fehlverhalten mit irgendwelchen DrawBox()-Menthoden beim Schließen eines Sub-Menus entgegenzuwirken.
JaNein, man kann ja die "MenuItem-" Fläche vergrössern :

Code: Alles auswählen

LOCAL aItemBG := {aInfo[4][1] + ::BarWidth + ITEM_SPACING -4 ,aInfo[4][2],;
aInfo[4][3] - ITEM_SPACING +4 , aInfo[4][4] -1}
Nun geht das MenuItem vom linken bis zum rechten Rand ... aber der
Rand bleibt immer noch (auch wenn man < 4 nimmt)

Damit ist das "Schatten" Problem leider noch nicht behoben. Man kann
aber jetzt den "Schatten" übermalen ...

man müsste also :drawItem() dazu bringen, wenn ein SubMenu geschlossen wird,
sich so zu verhalten als wenn man das Menu eben erst aufgemacht
hat und den Cursor auf die "richtige" Position zu bringen ...

gruss by OHR
Jimmy
p.s. wieso geht das nicht fett wenn ich es im Code habe ?

Code: Alles auswählen

[b]fett[/b]
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Moin Jimmy,
wie kommst Du auf {-4,0}bis {y+4,y}? Meine Angaben beziehen auf den Presentations-Space (oPs) von ::DrawItem(oPs, aInfo) . Das PS repräsentiert die Fläche innerhalb der Menu-Umrandung. Es ist nur möglich, innerhalb des PS grafische Primitiven einzusetzen ( {0,0} bis {x,y}).

Code: Alles auswählen

IF BAND(aInfo[2], XBP_DRAWACTION_DRAWALL) != 0  .AND. aInfo[1] == 1 
   aAAttrs[GRA_AA_COLOR] := MENU_BGCOLOR 
   GraSetAttrArea( oPS, aAAttrs ) 
   GraBox( oPS, {0,0}, {oPS:SetPageSize()[1]}, GRA_FILL )
Bitte beachte den Parameter aInfo[1]. Dieser Parameter enthält das aktuelle Menue-Item. Die Bedingung insgesamt wird nur dann erfüllt, wenn ( aInfo[2] = XBP_DRAWACTION_DRAWALL und aInfo[1]= 1 ist.

Wenn von einem Sub-Menue auf ein Menu-Item <> 1 gesprungen wird, ist die Bedingung nicht erfüllt. d.h., das Menue-wird insgesamt nicht neu gezeichnet.
JaNein, man kann ja die "MenuItem-" Fläche vergrössern


Klar kannst du bezogen auf den PS das MenuItem beliebig vergrößern. Und natürlich kann du den Schatten, den ein Sub-Menu hinterlassen hat, überpainten. Aber halt nur den Schatten eines Sub-Menus, der vor dem Öffnen eines anderen Sub-Menus entstand. Es ist ja eben die Crux, dass erst die Methode :drawItem durchlaufen wird und sich erst anschließend das Sub-Menu schließt, dass dann wiederum einen „Schattenfehler“ hinterläßt.

Wenn :drawItem() nach dem Schließen eines Sub-Menu ausgeführt werden würde, könnte man evtl. auftretende Schattenfehler des gerade geschlossenen Sub-Menues beheben.

Gruß, Olaf
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Übrigens tritt der "Schattenfehler" auch bei dem OWNERDRAW- Beispiel des DEV-CON USB-Sticks auf. Allerdings ist der Bug nicht augenfällig, weil in diesem Beispiel der Menuhintergrund mit einen Farbverlauf versehen ist. Wird der Farbverlauf aufgehoben und das Menu um einige Menupunkte inkl. Sub-Menus erweitert, tritt der Fehler wieder zutage.

Gruß, Olaf
Antworten