Как поместить ProgressBar в строку состояния

Тема в разделе "Delphi", создана пользователем WinHack, 24 ноя 2016.

  1. WinHack
    В большинстве приложений информацию о работе программы выводят в строке состояния. Можно туда же поместить и ProgressBar. Заодно и поменяем цвет индикатора.

    progressbar-inside-statusbar.png
    Поместите TStatusBar на форму, добавьте туда две панели. В первой будет содержаться текст, а вторую мы будем изменять в процессе выполнения программы. TProgressBar также поместите на форму в любое место, т.к. при выполнении программы, она будет перемещена в строку состояния. Установите свойство Position, чтобы просмотреть, как будет выглядеть приложение в работе.

    Вот код с комментариями:

    Код:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics,
      Controls, Forms, Dialogs, CommCtrl, ComCtrls;
    
    type
      TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        ProgressBar1: TProgressBar;
        procedure FormCreate(Sender: TObject);
        procedure StatusBar1DrawPanel(StatusBar: TStatusBar;
          Panel: TStatusPanel; const Rect: TRect);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      pbStyle: integer;
    begin
      // Устанавливаем цвет фона ProgressBar
      ProgressBar1.Brush.Color:= $00DDF9F8;
      // Устанавливаем цвет индикатора
      SendMessage(ProgressBar1.Handle,
                  PBM_SETBARCOLOR, 0, $00DDA04F);
    
    
       // разрешаем прорисовать вторую панель строки состояния
      StatusBar1.Panels[1].Style := psOwnerDraw;
      // помещаем ProgressBar внутрь панели
      ProgressBar1.Parent := StatusBar1;
      // удаляем границы ProgressBar
      pbStyle := GetWindowLong(ProgressBar1.Handle,
                                        GWL_EXSTYLE);
      pbStyle := pbStyle
                          - WS_EX_STATICEDGE;
      SetWindowLong(ProgressBar1.Handle,
                    GWL_EXSTYLE,
                    pbStyle);
    end;
    
    procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
    begin
      if Panel = StatusBar.Panels[1] then
      with ProgressBar1 do begin
        Top := Rect.Top;
        Left := Rect.Left;
        Width := Rect.Right - Rect.Left - 15;
        Height := Rect.Bottom - Rect.Top;
      end;
    end;
    
    end.
    ProgressBar помещен в строку состояния.