Цветной Progress Bar

Речь пойдет об индикаторе процесса выполнения (Progress Bar'е) нестандартного цвета.

Казалось бы, ничего сложного в этом нет. Просто берем и меняем свойство Color у компонента. Но у компонента нет такого свойства. Вот тут-то и начинается тот самый ступор, в который часто впадают новички в Delphi.

Дело в том, что компонент TProgressBar является, по сути, просто оберткой стандартного системного компонента. Мало того, если внимательно вглядеться в текст компонента TProgressBar, который находится в модуле ComCtrls.pas, то станет понятно, что цвет индикатора вообще нигде не задается. Почему? Да очень просто - по стандартам Microsoft любой индикатор степени выполнения должен иметь цвет, описанный в системе и никакой другой.

Но отчаиваться рано. Раз мы ничего не нашли в исходном тексте компонента, а искать в исходных текстах следует сразу после обращения к помощи Delphi, то наша дорога должна лежать напрямую к сайту MSDN Library, на котором представлена исчерпывающая информация о любом аспекте любой версии Windows. На сайте MSDN Library мы нашли сообщение PBM_SETBARCOLOR, чье переведенное описание я приведу в конце.

Теперь, когда мы знаем, что нам для установки цвета индикатора надо послать одно сообщение, давайте попробуем его послать. Хм... Если положить компонент индикатора на форму и посылать ему сообщение, то цвет, либо не меняется, либо держится только до следующей перерисовки окна. Нет, такой хоккей нам не нужен.

Решается данная проблема просто - к компоненту TProgressBar надо добавить свойство Color и перекрыть метод, отвечающий за рисование окна. Создаем новый компонент на основе старого и смотрим в текст модуля ComCtrls.pas в поисках названия метода, который надо перекрывать. Опять задержка. Метод Paint отсутствует. Еще более внимательное изучение компонента-родителя даст нам ощущение того, что у TProgressBar вообще нет окна, хоть он и является прямым потомком класса TWinControl.

На самом деле это не так. Окно у индикатора есть, только оно создается, рисуется и сразу же уничтожается. Видимо, для экономии системных ресурсов.

Ввиду всего вышесказанного, получается, что нам надо перекрыть метод, отвечающий за создание окна компонента. Такой метод имеет стандартное имя и называется CreateWnd. Вообще, этот метод часто перекрывают, но это тема для отдельного разговора.

Итак, создав свойство Color типа TColor у нашего наследника перекрываем его метод CreateWnd следующим образом:

procedure TgsProgressBar.CreateWnd;
begin
  inherited;
  if HandleAllocated then
    SendMessage(Handle, PBM_SETBARCOLOR, 0, FColor);
end;
Собственно, почти все. Единственное место, которое требует доработки - во время присвоения нового цвета, индикатор не перерисовывается. Для этого, аналогичный код надо в писать в метод, обрабатывающий установку свойства Color (обычно, SetColor).

В общем, ничего сложного. Как я уже сказал в названии статьи хитрости действительно маленькие.

Удачи!

Сообщение PBM_SETBARCOLOR

Устанавливает цвет индикатора степени выполнения в соответствующем элементе управления.

Синтаксис
Для использования вызовите функцию SendMessage нижеследующим образом.
lResult = SendMessage(        // returns LRESULT in lResult
     (HWND) hWndControl,      // handle to destination control
     (UINT) PBM_SETBARCOLOR,  // message ID
     (WPARAM) wParam,         // = 0; not used, must be zero
     (LPARAM) lParam          // = (LPARAM) (COLORREF) clrBar;
     );
     
Параметры
wParam
Должен быть нулем

clrBar
Ссылка COLORREF на новый цвет индикатора. Для задания стандартного системного значения используйте CLR_DEFAULT.

Возвращаемое значение
Возвращает предыдущий цвет индикатора или CLR_DEFAULT, если индикатор был нарисован цветом по-умолчанию.

Информация о сообщении
Минимальные версии DLL: comctl32.dll version 4.71 или более поздняя

Заголовочный файл: commctrl.h

Минимальная ОС: Windows 2000, Windows NT 4.0 с установленным Internet Explorer 4.0, Windows 98, Windows 95 с установленным Internet Explorer 4.0

Текст модуля gsProgressBar
//**! ----------------------------------------------------------
//**! This unit is a part of GSPackage project (Gregory Sitnin's
//**! Delphi Components Package).
//**! ----------------------------------------------------------
//**! You may use or redistribute this unit for your purposes
//**! while unit's code and this copyright notice is unchanged
//**! and exists.
//**! ----------------------------------------------------------
//**! (c) Gregory Sitnin, 2001-2002. All rights reserved.
//**! ----------------------------------------------------------

unit gsProgressBar;

{***} interface {***}

uses
  Windows, Messages, Classes, Graphics, ComCtrls;

type
  TgsProgressBar = class(TProgressBar)
  private
    { Private declarations }
    FColor: TColor;
    procedure SetColor(const Value: TColor);
  protected
    { Protected declarations }
  public
    { Public declarations }
    procedure CreateWnd; override;
  published
    { Published declarations }
    property Color: TColor read FColor write SetColor;
  end;

procedure Register;

{***} implementation {***}

procedure Register;
begin
  RegisterComponents('GSPackage', [TgsProgressBar]);
end;

{ TgsProgressBar }

procedure TgsProgressBar.CreateWnd;
begin
  inherited;
  if HandleAllocated then
    SendMessage(Handle, PBM_SETBARCOLOR, 0, FColor);
end;

procedure TgsProgressBar.SetColor(const Value: TColor);
begin
  FColor := Value;
  if HandleAllocated then
    SendMessage(Handle, PBM_SETBARCOLOR, 0, FColor);
end;

end.

Вот и всё, Удачи!


  1. Payday Loans Online
    Payday Loans Online a month ago
    [url=http://sirilending.com/]5000 loan no credit[/url]
  2. Best Payday Loan
    Best Payday Loan a month ago
    [url=https://sirilending.com/]guaranteed unsecured loans[/url]
  3. Speedycash
    Speedycash a month ago
    [url=http://sirilending.com/]personal loan review[/url]
  4. Payday Loans Online
    Payday Loans Online a month ago
    [url=http://sirilending.com/]reputable debt consolidation companies[/url]
  5. Quick Loan
    Quick Loan a month ago
    [url=http://sirilending.com/]payday loan no faxing[/url]
  6. Loan Cash
    Loan Cash a month ago
    [url=https://sirilending.com/]loan estimate[/url]
  7. Getting A Loan
    Getting A Loan a month ago
    [url=http://sirilending.com/]personal loan emi calculator[/url]
  8. Online Loan
    Online Loan a month ago
    [url=http://sirilending.com/]quick loans no credit check[/url]
  9. Speedy Cash
    Speedy Cash a month ago
    [url=http://sirilending.com/]guaranteed personal loans[/url]
  10. Quick Loan
    Quick Loan a month ago
    [url=https://sirilending.com/]loans online instant approval[/url]
  11. Pay Day Loan
    Pay Day Loan a month ago
    [url=https://sirilending.com/]where to get a loan[/url]
  12. Fastest Payday Loan
    Fastest Payday Loan a month ago
    [url=http://sirilending.com/]loan rehabilitation[/url]
  13. Easy Payday Loan
    Easy Payday Loan a month ago
    [url=https://sirilending.com/]5000 loan[/url]
  14. Pay Day Loans
    Pay Day Loans a month ago
    [url=https://sirilending.com/]loan money[/url]
  15. Online Loans
    Online Loans a month ago
    [url=https://sirilending.com/]best short term loans[/url]
  16. Bad Credit
    Bad Credit a month ago
    [url=https://sirilending.com/]online payday advance loan[/url]
  17. Loan Cash
    Loan Cash a month ago
    [url=http://sirilending.com/]advance payday loans[/url]
  18. Payday Loans Online
    Payday Loans Online a month ago
    [url=http://sirilending.com/]cash payday loan[/url]
  19. Fastest Payday Loan
    Fastest Payday Loan a month ago
    [url=https://sirilending.com/]loan cash now[/url]
  20. Personal Loans
    Personal Loans a month ago
    [url=http://sirilending.com/]easy loans[/url]
  21. Payday Loan Online
    Payday Loan Online a month ago
    [url=https://sirilending.com/]debt consolidation bad credit[/url]
  22. Online Payday Loans
    Online Payday Loans a month ago
    [url=https://sirilending.com/]one hour payday loan[/url]
  23. Payday
    Payday a month ago
    [url=http://sirilending.com/]cash fast loan[/url]
  24. Bad Credit
    Bad Credit a month ago
    [url=http://sirilending.com/]no credit check payday loans near me[/url]
  25. Spotloan
    Spotloan a month ago
    [url=http://sirilending.com/]pay day loan[/url]
  26. Paydayloan
    Paydayloan a month ago
    [url=https://sirilending.com/]simple loan payment[/url]
  27. Bad Credit
    Bad Credit a month ago
    [url=http://sirilending.com/]direct lenders for bad credit[/url]
  28. Bad Credit
    Bad Credit a month ago
    [url=http://sirilending.com/]bad credit personal loans guaranteed approval[/url]
  29. Online Payday Loan
    Online Payday Loan a month ago
    [url=https://sirilending.com/]online loans bad credit[/url]
  30. Payday Express
    Payday Express a month ago
    [url=http://sirilending.com/]payday loan now[/url]
  31. Get A Loan
    Get A Loan a month ago
    [url=http://sirilending.com/]loans online[/url]
  32. Loans
    Loans a month ago
    [url=https://sirilending.com/]loan repayment program[/url]
  33. Online Payday Loans
    Online Payday Loans a month ago
    [url=https://sirilending.com/]online payday loans instant approval[/url]
  34. Online Loans
    Online Loans a month ago
    [url=http://sirilending.com/]easy loan[/url]
  35. Get A Loan
    Get A Loan a month ago
    [url=https://sirilending.com/]specialized loan services[/url]
  36. Bad Credit
    Bad Credit a month ago
    [url=https://sirilending.com/]small loan[/url]
  37. Payday Loans Online
    Payday Loans Online a month ago
    [url=https://sirilending.com/]no interest loans[/url]
  38. Quick Loan
    Quick Loan a month ago
    [url=https://sirilending.com/]debt relief reviews[/url]
  39. Payday Loans
    Payday Loans a month ago
    [url=http://sirilending.com/]online payday[/url]
  40. Online Loans
    Online Loans a month ago
    [url=http://sirilending.com/]payday loans rock hill sc[/url]
  41. Payday Express
    Payday Express a month ago
    [url=https://sirilending.com/]best online loans instant approval[/url]
  42. Direct Lenders
    Direct Lenders a month ago
    [url=http://sirilending.com/]payday loans nevada[/url]
  43. Payday Loan
    Payday Loan a month ago
    [url=https://sirilending.com/]borrow cash[/url]
  44. Online Loan
    Online Loan a month ago
    [url=https://sirilending.com/]payday loans no credit check same day[/url]
  45. Direct Lenders
    Direct Lenders a month ago
    [url=http://sirilending.com/]cash advance california[/url]
  46. Best Online Loans
    Best Online Loans a month ago
    [url=http://sirilending.com/]fast loans no credit check[/url]
  47. Easy Payday Loan
    Easy Payday Loan a month ago
    [url=http://sirilending.com/]advance cash payday[/url]
  48. Fastest Payday Loan
    Fastest Payday Loan a month ago
    [url=http://sirilending.com/]credit check loans[/url]
  49. Quick Loans
    Quick Loans a month ago
    [url=https://sirilending.com/]debt consolidation loan[/url]
  50. Cash Loan
    Cash Loan a month ago
    [url=http://sirilending.com/]loans with low interest[/url]
  51. Payday Loan Online
    Payday Loan Online a month ago
    [url=https://sirilending.com/]personal loan for bad credit[/url]
  52. Speedy Cash
    Speedy Cash a month ago
    [url=http://sirilending.com/]credit check loans[/url]
Отменить.