Способ 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; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!