2012-03-25 7 views
7

¿VclStyle es un error? T^T intentado encontrar una lista de corrección de errores (http://edn.embarcadero.com/article/42090/) pero no puedo¿VclStyle es un error? TProgressBar.Style: = pbstMarQuee no funciona

  1. Archivo> Nueva> Aplicación VCL
  2. TProgressBar puso forma principal> TProgressBar .style: = pbstMarQuee
  3. opción de proyecto> Apariencia> set estilo personalizado> set Estilo predeterminado
  4. Ctrl + F9

ProgressBar no funciona

Lo siento. Mi Inglés es malo :(

Respuesta

13

Esta es una característica no implementada en el TProgressBarStyleHook. Desafortunadamente, Windows no envía ningún mensaje al control de barra de progreso para indicar si la posición de la barra cambia cuando está en marquee mode, por lo que debe implementar su auto un mecanismo para imitar el estilo PBS_MARQUEE, esto se puede hacer fácilmente la creación de un nuevo gancho estilo y utilizando un TTimer interior del gancho estilo.

Marque esta implementación básica del gancho estilo

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. 

Usted puede consultar una demostración de esta pocilga le hook here

+0

¿Dónde está liberando el temporizador? – Pateman

+0

@Pateman Oops, código editado. Buena atrapada. :) – RRUZ

+0

+1, parece decente ahora! – Pateman

Cuestiones relacionadas