MenuBar() und :LockUpdate() o.ä möglich? [erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
DelUser01

MenuBar() und :LockUpdate() o.ä möglich? [erledigt]

Beitrag von DelUser01 » Mi, 04. Apr 2018 2:11

Hallo

gibt es eine Möglichkeit die Top-Menü-Einträge beu XbpCrt():MenuBar() erst anzuzeigen wenn das Menü fertig aufgebaut ist?

Der Aufruf von oXbpCrt:MenuBar() zeigt automatisch das entsprechende XbpCrt-Fenster (hatte ich schon in einem anderen Thema geschrieben). OK -muss man damit leben.
Wenn ich auf dem nun sichtbaren XbpCrt-Fenster das gesamte Menü erzeuge sieht man wie das Top-Menü nach und nach erstellt wird. Zwar recht schnell, es macht aber den Eindruck als würden die Texte von Links nach Rechts auf Ihren endgültigen Platz "zappeln". Bei großem Schrift-Font ist das schon sehr deutlich und erinnert an Laufschrift.

oXbpCrt:LockUpdate( .T. ) und oMenuBar:LockUpdate() zeigen keine Wirkung.
oXbpCrt:Hide() -> Menüaufbau -> oXbpCrt:Show() kommt nicht in Frage, der "Blinkeffekt" bei "Crt da" -> "Crt weg" -> "Crt wieder da" ist doof...

Auch die Verwendung des Parameters Visible := .F. beim Menüaufbau scheint nichts zu nutzen.

Weiß jemand wie das geht, dass das Top-Menü erst nach dem kompletten Aufbau angezeigt wird?
Zuletzt geändert von DelUser01 am Fr, 06. Apr 2018 2:14, insgesamt 1-mal geändert.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11507
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: MenuBar() und :LockUpdate() o.ä möglich?

Beitrag von AUGE_OHR » Mi, 04. Apr 2018 2:46

DelUser01 hat geschrieben:
Mi, 04. Apr 2018 2:11
gibt es eine Möglichkeit die Top-Menü-Einträge beu XbpCrt():MenuBar() erst anzuzeigen wenn das Menü fertig aufgebaut ist?
mit (Ownerdraw) Menu in XbpCRT() habe ich keine Erfahrung was deine Erkenntnisse angeht.

wenn du nun Ownerdraw Menu machst "könnte" man vielleicht einen Schalter "lSHOW" setzen.
ausgehend vom Beispiel \SOURCE\samples\basics\OWNERDRW\MENUS.prg

Code: Alles auswählen

// horizontal
FUNCTION DrawMenubarItem( oDlg, oMbar, oPS, aInfo, lSHOW )

//vertikal
METHOD XbpImageMenu:DrawItem( oPS, aInfo , lSHOW )
gruss by OHR
Jimmy

DelUser01

Re: MenuBar() und :LockUpdate() o.ä möglich?

Beitrag von DelUser01 » Mi, 04. Apr 2018 10:36

Hallo Jimmy

Du nenst ads lShow ich habe dasselbe mit lVisible in meinem Beitrag geschrieben.
Da scheint eben auch keine Wirkung zu zeigen.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11507
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: MenuBar() und :LockUpdate() o.ä möglich?

Beitrag von AUGE_OHR » Mi, 04. Apr 2018 11:05

DelUser01 hat geschrieben:
Mi, 04. Apr 2018 10:36
Da scheint eben auch keine Wirkung zu zeigen.
wie schon gesagt habe ich es noch nicht probiert aber beim Ownerdraw hat man ja die Kontrolle "was" und "wo" man was anzeigt. so lange lShow = .F. "malst" du nichts ... oder ausserhalb des Sicht Bereich ( negative Koordinaten )

Tip : falls lShow als Parameter im "Xbase++ GUI Thread" nicht funktioniert dann über eine Function auslagern.

Code: Alles auswählen

FUNCTION ShowIt(lValue)
STATIC lShow := .F.
   IF PCOUNT() > 0
      lShow := lValue
   ENDIF
RETURN lShow
---
ich bin kein Fan von "freien" XbpCRT() Fenstern. XbpCRT() sind IMHO Client Fenstern.
Ich habe lieber ein XbpDialog() als Parent für ein XbpCRT() Fenstern.
Da gibt es auch (weniger) Problem im Zusammenspiel mit dem Menu oder anderen XbParts.
gruss by OHR
Jimmy

DelUser01

Re: MenuBar() und :LockUpdate() o.ä möglich?

Beitrag von DelUser01 » Mi, 04. Apr 2018 12:54

Hallo Jimmy

bin der Sache auf der Spur:

In XbpImageMenu():DrawItem ist :LockUpdate() nicht implementiert.
Das habe ich jetzt eingebaut.
Nun muss ich noch herausfinden wie man die Top-Manü-BAr neu zeichnet. Jetzt zeigt er gerade nur einen leeren Balken und wenn man drüberfährt tauchen die Elemente auf.
oMenuBar:InvalidateRect hilft nicht, eventuell muss ich das über alle Objekte rekursiv machen...

DelUser01

Re: MenuBar() und :LockUpdate() o.ä möglich?

Beitrag von DelUser01 » Mi, 04. Apr 2018 16:58

Habe einen möglichen Weg gefunden:

Mit eigener MenuBarLockUpdate() und MS API DrawMenuBar()

Code: Alles auswählen

DLLFUNCTION DrawMenuBar( nWindowHandle ) ;
            Using STDCALL ;
            From USER32.DLL
---
Function MenuBarLockUpdate( lSet , oXbpCrt )
Static lLock := .F.
   If ValType( lSet ) == "L"
      lLock := lSet
      If ! lLock
         DrawMenuBar( oXbpCrt:GetHwnd() )
      EndIf
   EndIf
EndIf
Return( lLock )
---
in DrawBarItem gleich zu Beginn:
If MenuBarLockUpdate()
   Return oMBar
EndIf
:
MenüBar erstellen

Code: Alles auswählen

oMenuBar := oXbpCrt:MenuBar()
MenuBarLockUpdate( .T. )
:
...das Menü zusammenstellen...
:
MenuBarLockUpdate( .F. , oXbpCrt )
Nebeneffekt - gemessene Laufzeit im Durchschnitt:
ohne Lock: 0.28 bis 030 Sekunden
mit Lock: 0.21 bis 0.23 Sekunden
also ca. 25% schneller mit Lock!

Antworten