2012-03-25 1 views
7

Ist VclStyle Bug? T^TI versucht BugFix Liste (http://edn.embarcadero.com/article/42090/) zu finden, aber ich kann nichtIst VclStyle Bug? TProgressBar.Style: = pbstMarQuee Funktioniert nicht

  1. Datei> Neu> VCL Anwendung
  2. TProgressBar Hauptformular setzen> TProgressBar .Style: = pbstMarQuee
  3. Projekt Option> Appearence> set Custom Style> set Default Style
  4. Strg + F9

ProgressBar funktioniert nicht

Entschuldigung. Mein Englisch ist schlecht :(

Antwort

13

Dies ist ein Feature nicht implementiert in der TProgressBarStyleHook. Unfortunally Windows zeigt keine Nachricht an den Fortschrittsbalken Steuerung senden, wenn die Position des Balkens ändert sich, wenn in marquee mode ist, so dass Sie implementieren müssen, Ihr selbst ein Mechanismus leicht einen neuen Stil Haken zu schaffen und mit einem TTimer innerhalb des Stils Haken.

prüft diese grundlegende Umsetzung des Art Haken

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. 

Sie getan werden, um den PBS_MARQUEE Style, kann dies zu imitieren kann eine Demo von diesem Stall überprüfen le hook here

+0

Wo geben Sie den Timer frei? – Pateman

+0

@Pateman Hoppla, Code bearbeitet. Guter Fang. :) – RRUZ

+0

+1, sieht jetzt anständig aus! – Pateman