Is VclStyle Bug? TProgressBar.Style: = pbstMarQuee Not working

Is VclStyle Error? T ^ T I tried to find the BugFix list (http://edn.embarcadero.com/article/42090/), but I can’t

  • File> New> VCL Application
  • TProgressBar places the main form> TProgressBar.Style: = pbstMarQuee
  • Project Option> Appearence> set Custom Style> set default style
  • Ctrl + F9

ProgressBar not working

Unfortunately. My English is bad: (

+7
source share
1 answer

This function is not implemented in TProgressBarStyleHook . Unfortunately, Windows does not send any message to the progress bar to indicate whether the position of the panel has changed when marquee mode is located, so you must implement your mechanism to mimic the PBS_MARQUEE style, this can easily be done by creating a new style hook and using TTimer inside the style.

Check out this basic implementation of Style.

uses Vcl.Styles, Vcl.Themes, Winapi.CommCtrl; {$R *.dfm} type TProgressBarStyleHookMarquee=class(TProgressBarStyleHook) private Timer : TTimer; FStep : Integer; procedure TimerAction(Sender: TObject); protected procedure PaintBar(Canvas: TCanvas); override; public constructor Create(AControl: TWinControl); override; destructor Destroy; override; end; constructor TProgressBarStyleHookMarquee.Create(AControl: TWinControl); begin inherited; FStep:=0; Timer := TTimer.Create(nil); Timer.Interval := 100;//TProgressBar(Control).MarqueeInterval; Timer.OnTimer := TimerAction; Timer.Enabled := TProgressBar(Control).Style=pbstMarquee; end; destructor TProgressBarStyleHookMarquee.Destroy; begin Timer.Free; inherited; end; procedure TProgressBarStyleHookMarquee.PaintBar(Canvas: TCanvas); var FillR, R: TRect; W, Pos: Integer; Details: TThemedElementDetails; begin if (TProgressBar(Control).Style=pbstMarquee) and StyleServices.Available then begin R := BarRect; InflateRect(R, -1, -1); if Orientation = pbHorizontal then W := R.Width else W := R.Height; Pos := Round(W * 0.1); FillR := R; if Orientation = pbHorizontal then begin FillR.Right := FillR.Left + Pos; Details := StyleServices.GetElementDetails(tpChunk); end else begin FillR.Top := FillR.Bottom - Pos; Details := StyleServices.GetElementDetails(tpChunkVert); end; FillR.SetLocation(FStep*FillR.Width, FillR.Top); StyleServices.DrawElement(Canvas.Handle, Details, FillR); Inc(FStep,1); if FStep mod 10=0 then FStep:=0; end else inherited; end; procedure TProgressBarStyleHookMarquee.TimerAction(Sender: TObject); var Canvas: TCanvas; begin if StyleServices.Available and (TProgressBar(Control).Style=pbstMarquee) and Control.Visible then begin Canvas := TCanvas.Create; try Canvas.Handle := GetWindowDC(Control.Handle); PaintFrame(Canvas); PaintBar(Canvas); finally ReleaseDC(Handle, Canvas.Handle); Canvas.Handle := 0; Canvas.Free; end; end else Timer.Enabled := False; end; initialization TStyleManager.Engine.RegisterStyleHook(TProgressBar, TProgressBarStyleHookMarquee); end. 

You can check out a demo of this style hook here.

+13
source

All Articles