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:

Bild

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
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 ... :-k

:idea: 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

Code: Alles auswählen

#xtranslate XbpPushbutton => XbpImageButton
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
*******************