Seite 1 von 1
nervöser XbpImageButton
Verfasst: Mi, 26. Sep 2018 10:40
von georg
Guten Morgen,
ich habe da eine ganz irre Kreuzung: das Preview aus dem Solutions-Ordner und den XbpImageButton aus dem XbpPack 1.
Das Preview hat unten links einen Button, der anzeigt, auf welcher Seite von wievielen man sich befindet, also z.B. 1/3.
Solange das ein XbpPushButton ist, ist alles gut. Ersetzt man ihn jedoch durch einen XbpImageButton, so "flackert" der Button permanent. Ich habe mich mal mit dem Debugger drauf gesetzt, und es ergibt sich immer wieder dieser Callstack:
Irgendetwas "stupst" permanent den OwnerDraw-Slot an, was zu diesem Flackern führt. Mir fehlt aber jede Idee, wo das herkommen könnte?
Re: nervöser XbpImageButton
Verfasst: Mi, 26. Sep 2018 17:47
von AUGE_OHR
georg hat geschrieben: ↑Mi, 26. Sep 2018 10:40
Irgendetwas "stupst" permanent den OwnerDraw-Slot an, was zu diesem Flackern führt. Mir fehlt aber jede Idee, wo das herkommen könnte?
das Preview hat doch
Code: Alles auswählen
oView:drawBlock := {|oPS, nPageNo, nNumRows| FormatPage(oPS, nPageNo, @nNumRows) }
was IMHO ein Ownerdraw darstellt.
Re: nervöser XbpImageButton
Verfasst: Mi, 26. Sep 2018 20:18
von georg
Hallo, Jimmy -
vielleicht tippen wir da aneinander vorbei ...
Das Problem ist, dass ein "normaler" XbpPushButton nicht flackert, ein XbpImageButton aber schon. Wenn Du in der Methode draw() des XbpImageButtons einen Breakpoint im Debugger setzt, kannst Du sehr leicht nachvollziehen, dass beim XbpImageButton permanent xbeP_Draw Events ankommen.
Wenn ich einen XbpImgButton von XbpPushButton ableite, und darin nur init() und draw() definiere, die ich quasi sofort auf die entsprechenden Methoden der Parent-Klasse weiterleite (und natürlich das OwnerDrawing aktiviere), dann gibt es keine permanent erzeugten xbeP_Draw Events. Also denke ich, dass etwas in der Implementierung der XbpImageButton-Klasse nicht stimmt und hatte gehofft, dass es einem hier aufgefallen wäre.
Ich habe mit dieser Klasse als Vergleich gearbeitet:
Code: Alles auswählen
#INCLUDE "Xbp.CH"
CLASS XbpImgButton FROM XbpPushButton
EXPORTED:
METHOD init
METHOD draw
ENDCLASS
METHOD XbpImgButton:Init( oParent, oOwner, aPos, aSize, aPP, lVisible )
::XbpPushButton:Init(oParent, oOwner, aPos, aSize, aPP, lVisible)
::DrawMode := XBP_DRAW_OWNER
RETURN self
METHOD XbpImgButton:draw(oPS, aInfo)
self:XbpPushButton:draw(oPS, aInfo)
RETURN (.T.)
Re: nervöser XbpImageButton
Verfasst: Do, 27. Sep 2018 1:05
von AUGE_OHR
georg hat geschrieben: ↑Mi, 26. Sep 2018 20:18
vielleicht tippen wir da aneinander vorbei ...
nö, ich meine den selben Button unten links
- Preview_Button_flicker.jpg (77.14 KiB) 5332 mal betrachtet
georg hat geschrieben:
Ich habe mit dieser Klasse als Vergleich gearbeitet:
das hab ich "so" nicht probiert ... hm ...
ein Schuss ins Blaue : nimm mal DrawBackground() raus
Re: nervöser XbpImageButton
Verfasst: Do, 27. Sep 2018 5:45
von georg
Guten Morgen, Jimmy -
ja, Dein Schuss ins Blaue war nicht schlecht.
Aber das beseitigt eigentlich nur das Symptom, aber nicht die Ursache - denn die xbeP_Draw Events werden weiterhin fleissig erzeugt.
Re: nervöser XbpImageButton
Verfasst: Do, 27. Sep 2018 19:37
von AUGE_OHR
wie ich schon sagte kenne ich das Problem mit einem Ownerdraw Control "in" ein CLASS wo Ownerdraw verwendet wird. ich habe zwar eine Vermutung warum das mit den XbParts passiert ... meine DXE Controls haben nicht (mehr) das Problem.
Frage : wie hast du XbpImagebutton jetzt eingebunden ?
ich bin bei so was ja faul und schreibe nur
damit leite ich nun alle XbpPushbutton auf XbpImageButton um ... auch auf die 3 "in" der CLASS. nun müssen die 3 Buttons "in" der CLASS aber nicht Ownerdraw sein ... das müsste ich noch mal probieren.
---
wenn man GraBackground() nicht verwendet hat man ja keinen visual Style. den kann man so simulieren.
Code: Alles auswählen
INLINE METHOD Draw( oPS, aInfo )
********************************
LOCAL aColors
IF ::controlState == XBP_STATE_DISABLED
aColors:= { GRA_CLR_PALEGRAY, GRA_CLR_WHITE }
ELSEIF ::controlState == XBP_STATE_PRESSED
aColors:= { GRA_CLR_AZULETE, GRA_CLR_AZULITO }
ELSEIF ::lEnter
aColors:= { GRA_CLR_ORANGE, GRA_CLR_WHITE }
ELSE
aColors:= { GRA_CLR_AZULETE, GRA_CLR_AZULITO }
ENDIF
GraGradient( oPS, aInfo[ XBP_DRAWINFO_RECT ], { { aInfo[ XBP_DRAWINFO_RECT, 3 ], aInfo[ XBP_DRAWINFO_RECT, 4 ] } }, ;
aColors, GRA_GRADIENT_VERTICAL )
GraCaptionStr( oPS, aInfo[ XBP_DRAWINFO_RECT ], { aInfo[ XBP_DRAWINFO_RECT, 3 ], aInfo[ XBP_DRAWINFO_RECT, 4 ] }, ;
::caption, XBPALIGN_VCENTER + XBPALIGN_HCENTER )
IF BAnd( aInfo[ XBP_DRAWINFO_STATE ], XBP_DRAWSTATE_FOCUS ) == XBP_DRAWSTATE_FOCUS ; GraFocusRect( oPS ) ; ENDIF
RETURN .F.
INLINE METHOD Enter ; ::lEnter:= .T. ; ::invalidateRect() ; RETURN self
*******************
INLINE METHOD Leave ; ::lEnter:= .F. ; ::invalidateRect() ; RETURN self
*******************