nervöser XbpImageButton

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

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

nervöser XbpImageButton

Beitrag 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?
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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: nervöser XbpImageButton

Beitrag 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.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: nervöser XbpImageButton

Beitrag 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.)
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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: nervöser XbpImageButton

Beitrag 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) 5326 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 ;)
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: nervöser XbpImageButton

Beitrag 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.
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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: nervöser XbpImageButton

Beitrag 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
*******************
gruss by OHR
Jimmy
Antworten