Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > ProgressBar


Автор: Illusion Dolphin 7.4.2005, 14:26
Начиная с виньХР появились в системе забавные ProgressBar'ы, которые не отображают реального "прогресса", а лишь отображают, что что-нибудь работает... такой же появляется при загрузки виндыХР (бегает пару чёрточек слева вправо, а потом обратно возвращаются в начало). Такой же прогресс отображается если в ХР выбрать изображение, в меню нажать на Print (Печать), и вэтом диалоге при выборе шаблона печати - тоже такого стиля есть прогресс. (надеюсь, что теперь ясно что я имел в виду smile )

И сам вопрос: как такой сделать на делфи?

Автор: ДЫМ 9.4.2005, 02:54
Если я тебя правильно понял, то посмотри мой компонент LSVGauge. Там все это есть. RunningNext(RepeatAmount:Integer) сдвигает "бегущую полосу" вправо/вверх на шаг RunningStep RepeatAmount раз(подробнее читай в Readme и смотри демку). А сам вызов можешь засунуть в отдельный поток или через таймер.

Вот ссылочка
http://www.lsvhost.narod.ru/LSVGauge.zip

Автор: Illusion Dolphin 9.4.2005, 20:13
Компонентик прикольный smile
Но выовдить через текстуры прогресс я умею, мне интересно как с WinAPI выдавить из винды прогрессс этим отображением, т.к. в случае если у юзера будет стоять не обычная тема, а совершено левая с другой гаммой, то тогда потенциальный прогресс через WinAPI будет нормально смотреться, а вот LSVGauge будет сильно выделяться, чего бы не хотелось.
Вотпрос открыт: как сделать сабж.? (ручками не прикольно, это слишком просто и не гибко)

Автор: p0s0l 10.4.2005, 15:37
Судя по MSDN, надо юзать это:
Код

const
  PBS_MARQUEE            = $08;
  PBM_SETMARQUEE         = WM_USER+10;

...

  with ProgressBar1 do
  begin
    SetWindowLong (Handle, GWL_STYLE, (GetWindowLong (Handle, GWL_STYLE) or PBS_MARQUEE));
    Perform(PBM_SETMARQUEE, 1, 50);
  end;
(вместо 50 поставь время перемещения кубиков)
Цитата(MSDN)
Use this message when you do not know the amount of progress toward completion but wish to indicate that progress is being made.


Добавлено @ 15:38
PS: чтобы это работало, нужно включить в прогу XP-манифест

Автор: ДЫМ 11.4.2005, 00:57
Держи готовый компонент

Код

unit MarqueeProgressBar;

interface

uses
  SysUtils, Windows, Classes, Controls, ComCtrls, CommCtrl, Graphics, Messages;

type
  TMarqueeProgressBar = class(TProgressBar)
  private
    FActive: Boolean;
    FAnimationSpeed: Integer;
    FBarColor: TColor;
    procedure SetActive(const Value: Boolean);
    procedure SetAnimationSpeed(const Value: Integer);
    procedure UpdateProgressBar;
    procedure SetBarColor(const Value: TColor);
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Active: Boolean read FActive write SetActive;
    property AnimationSpeed: Integer read FAnimationSpeed write SetAnimationSpeed;
    property BarColor: TColor read FBarColor write SetBarColor;
  end;

const
  PBS_MARQUEE = $08;
  PBM_SETMARQUEE = WM_USER + 10;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMarqueeProgressBar]);
end;

constructor TMarqueeProgressBar.Create(AOwner: TComponent);
begin
  inherited;
  FAnimationSpeed := 60;
  FBarColor := clNavy;
end;

procedure TMarqueeProgressBar.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or PBS_MARQUEE;
end;

procedure TMarqueeProgressBar.SetActive(const Value: Boolean);
begin
  FActive := Value;
  UpdateProgressBar;
end;

procedure TMarqueeProgressBar.SetAnimationSpeed(const Value: Integer);
begin
  FAnimationSpeed := Value;
  UpdateProgressBar;
end;

procedure TMarqueeProgressBar.SetBarColor(const Value: TColor);
begin
  FBarColor := Value;
  SendMessage(Self.Handle, PBM_SETBARCOLOR, 0, FBarColor);
  Invalidate;
end;

procedure TMarqueeProgressBar.UpdateProgressBar;
begin
  if FActive then
    SendMessage(Self.Handle, PBM_SETMARQUEE, 1, FAnimationSpeed)
  else
    SendMessage(Self.Handle, PBM_SETMARQUEE, 0, 0);
end;

end.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)