【问题标题】:How do I change the color of my progress bar in Inno Setup?如何在 Inno Setup 中更改进度条的颜色?
【发布时间】:2016-02-11 08:42:01
【问题描述】:

我使用TNewProgressBar 创建了一个进度条。
进度条的默认颜色为绿色。
我想把颜色改成蓝色。

【问题讨论】:

    标签: inno-setup pascalscript


    【解决方案1】:

    你不能。


    进度条由当前的 Windows 主题设置样式。在默认的 Windows 主题中,进度条为绿色(或黄色或红色,如果进度条处于暂停或错误状态,请参阅TNewProgressBar.State)。

    您必须完全重新实现进度条的绘制或禁用整个安装程序的视觉主题。
    How to change the color of progressbar in C# .NET 3.5?

    但 Inno Setup API 不允许您重新实现绘图。而且您可能不想禁用视觉主题。


    如果你真的需要蓝色,你可以考虑使用TBitmapImage.Bitmap.Canvas自己实现进度条(使用.Rectangle之类的方法)。

    一个简单的例子:

    var
      ProgressImage: TBitmapImage;
    
    procedure InitializeWizard();
    begin
      ProgressImage := TBitmapImage.Create(WizardForm);
      ProgressImage.Parent := WizardForm;
      ProgressImage.Left := ScaleX(10);
      ProgressImage.Top := WizardForm.ClientHeight - ScaleY(34);
      ProgressImage.Width := ScaleX(200);
      ProgressImage.Height := ScaleY(20);
      ProgressImage.BackColor := clWhite;
      ProgressImage.Bitmap.Width := ProgressImage.Width;
      ProgressImage.Bitmap.Height := ProgressImage.Height;
    end;
    
    procedure DrawProgress(Image: TBitmapImage; Progress: Integer);
    var
      Canvas: TCanvas;
      Width: Integer;
    begin
      Log(Format('Drawing progress %d', [Progress]));
    
      Canvas := Image.Bitmap.Canvas;
    
      Canvas.Pen.Style := psClear;
    
      Width := Image.Bitmap.Width * Progress / 100
      Log(Format('Bar size: %d x %d', [Width, Image.Bitmap.Height]));
    
      Canvas.Brush.Color := clHighlight;
      Canvas.Rectangle(1, 1, Width, Image.Bitmap.Height);
    
      Canvas.Brush.Color := clBtnFace;
      Canvas.Rectangle(Width - 1, 1, Image.Bitmap.Width, Image.Bitmap.Height);
    
      Canvas.Pen.Style := psSolid;
      Canvas.Pen.Mode := pmCopy;
      Canvas.Pen.Color := clBlack;
      Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(1, 1, Image.Bitmap.Width, Image.Bitmap.Height);
    end;
    
    procedure CurPageChanged(CurPageID: Integer);
    begin
      Log(Format('CurPageChanged %d', [CurPageID]));
      DrawProgress(ProgressImage, (CurPageID * 100 / wpFinished));
    end;
    

    【讨论】:

    • 但是当我使用 TBitmapImage.Bitmap.Canvas 时,我可以将动画添加到进度条吗?
    • 每次进度改变时都必须重新绘制位图。
    • 但是即使进度条卡在中间,我也希望在进度条上运行动画。他们有什么办法用 gif 来做吗?
    • 好吧,你可以画任何你想要的东西。只要您在运行冗长操作时能够控制 GUI 线程。不过,Inno Setup 中不支持动画 GIF。您必须按间隔绘制 BMP 帧。
    • 虽然您的问题是关于蓝色进度条。动画远不止于此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多