Содержание материала

Способ 1

Code:

uses Commctrl;

const

MaxProgress = 50;

var

bm: TBitmap;

// Возвращает прямоугольник нулевой панели:

function GetPanelRect: TRect;

begin

SendMessage(Form1.StatusBar1.Handle, SB_GETRECT, 0,

  integer(@result));

InflateRect(result, -1, -1);

end;

 

// Копирует часть bm на StatusBar

procedure CopyPart(left, right: integer; ACopyMode: TCopyMode);

var bmRect, pnRect: TRect;

begin

bmRect := Rect(left, 0, right, bm.Height - 1);

pnRect := bmRect;

with GetPanelRect do

  OffsetRect(pnRect, Left, Top);

with Form1.StatusBar1.Canvas do begin

  CopyMode := ACopyMode;

  CopyRect(pnRect, bm.Canvas, bmRect);

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

with StatusBar1.Panels.Add do begin

  Width := 100;

  Style := psOwnerDraw;

end;

with StatusBar1.Panels.Add do begin

  Width := 0;

  Text := 'abc';

end;

Timer1.Enabled := false;

Timer1.Interval := 50;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

Timer1.Enabled := true;

bm := TBitmap.Create;

with GetPanelRect do begin

  bm.Width := Right - Left;

  bm.Height := Bottom - Top;

end;

with bm.Canvas do begin

  Brush.Color := clSilver;

  FillRect(Bounds(0, 0, bm.Width, bm.Height));

  TextOut(1, 1, 'Doing smth...');

end;

CopyPart(0, bm.Width - 1, cmSrcCopy); // Вывод текста

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Timer1.Tag := Timer1.Tag + 1;

if Timer1.Tag >  MaxProgress then begin

  Timer1.Enabled := false;

  Timer1.Tag := 0;

  StatusBar1.Repaint; // Очистка StatusBar

end else

  // Вывод только что закрашенной части:

  CopyPart(trunc((Timer1.Tag - 1) / MaxProgress * bm.Width),

    trunc(Timer1.Tag / MaxProgress * bm.Width), cmNotSrcCopy);

end;

 

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;

Panel: TStatusPanel; const Rect: TRect);

var p: integer;

begin

if (Panel.Index = 0) and (Timer1.Tag >  0) then begin

  p := round((Rect.Right - Rect.Left) * Timer1.Tag / MaxProgress);

  // Вывод закрашенной части:

  CopyPart(0, p, cmNotSrcCopy);

  // Вывод незакрашенной части:

  CopyPart(p + 1, bm.Width - 1, cmSrcCopy);

end;

end;

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить