1 1 1 1 1 1 1 1 1 1 1 Рейтинг 1.00 (1 Голос)

ProgressBar в панели задач Windows 7 и старше (Delphi 7, не моё)

В свое время захотелось сделать красивый прогресс-бар прямо в панели задач, как это делают многие программы в Windows 7. Нашел готовый модуль, подцепил... И сначала не заработало. Оказалось, что работает сие чудо не во всех цветовых схемах. Но в целом более чем работоспособный модуль. Ничего экстраординарного в работе с ним нет.

Описываем переменную.

Код Delphi:
var Win7TaskProgressBar: TWin7TaskProgressBar;

Создаем объект и выводим данные:

Код Delphi:
  1. Win7TaskProgressBar:=TWin7TaskProgressBar.Create(Form1.Handle); Win7TaskProgressBar:=TWin7TaskProgressBar.Create(Form1.Handle);
  2. Win7TaskProgressBar.Max:=100;
  3. Win7TaskProgressBar.Progress:=Round(eProgress);
  4. Application.ProcessMessages;

Не забываем его уничтожить в конце работы:

Код Delphi:
Win7TaskProgressBar.Destroy;

А вот, собственно, сам модуль (насколько я помню, я туда чуток нос сунул, что-то подправлял):

Код Delphi:
  1. {*******************************************************************************
  2.   Windows 7 TaskBar Progress Unit File
  3.   File Version: 0.0.0.3
  4.   https://github.com/tarampampam
  5. *******************************************************************************}
  6.  
  7. unit Win7TaskBarProgressUnit;
  8.  
  9. interface
  10.  
  11. uses
  12. Windows, ActiveX;
  13.  
  14. type
  15. ITaskbarList = interface(IUnknown)
  16. ['{56FDF342-FD6D-11D0-958A-006097C9A090}']
  17. function HrInit: HRESULT; stdcall;
  18. function AddTab(hwnd: LongWord): HRESULT; stdcall;
  19. function DeleteTab(hwnd: LongWord): HRESULT; stdcall;
  20. function ActivateTab(hwnd: LongWord): HRESULT; stdcall;
  21. function SetActiveAlt(hwnd: LongWord): HRESULT; stdcall;
  22. end;
  23.  
  24. ITaskbarList2 = interface(ITaskbarList)
  25. ['{602D4995-B13A-429B-A66E-1935E44F4317}']
  26. function MarkFullscreenWindow(hwnd: LongWord;
  27. fFullscreen: LongBool): HRESULT; stdcall;
  28. end;
  29.  
  30. ITaskbarList3 = interface(ITaskbarList2)
  31. ['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}']
  32. procedure SetProgressValue(hwnd: LongWord; ullCompleted: UInt64; ullTotal: UInt64); stdcall;
  33. procedure SetProgressState(hwnd: LongWord; tbpFlags: Integer); stdcall;
  34. end;
  35.  
  36. type
  37. TTaskBarProgressStyle = (tbpsNone, tbpsIndeterminate, tbpsNormal, tbpsError, tbpsPaused);
  38.  
  39. TWin7TaskProgressBar = class
  40. glHandle: LongWord;
  41. glMin: Byte;
  42. glMax,
  43. glValue: Integer;
  44. glStyle: TTaskBarProgressStyle;
  45. glVisible,
  46. glMarquee: Boolean;
  47. glTaskBarInterface: ITaskbarList3;
  48. private
  49. procedure SetProgress(const Value: Integer);
  50. procedure SetMax(const Value: Integer);
  51. procedure SetStyle(const Style: TTaskBarProgressStyle);
  52. procedure SetVisible(const IsVisible: Boolean);
  53. procedure SetMarquee(const IsMarquee: Boolean);
  54. published
  55. constructor Create(const Handle: LongWord);
  56. property Max: Integer read glMax write SetMax default 100;
  57. property Min: Byte read glMin default 0;
  58. property Progress: Integer read glValue write SetProgress default 0;
  59. property Marquee: Boolean read glMarquee write SetMarquee default False;
  60. property Style: TTaskBarProgressStyle read glStyle write SetStyle default tbpsNone;
  61. property Visible: Boolean read glVisible write SetVisible default False;
  62. destructor Destroy; override;
  63. end;
  64.  
  65. implementation
  66.  
  67. procedure TWin7TaskProgressBar.SetMax(const Value: Integer);
  68. begin
  69. glMax := Value;
  70. SetProgress(glValue);
  71. end;
  72.  
  73. procedure TWin7TaskProgressBar.SetProgress(const Value: Integer);
  74. begin
  75. if (glTaskBarInterface <> nil) and (glHandle <> 0) then begin
  76. glValue := Value;
  77. if not glMarquee then
  78. glTaskBarInterface.SetProgressValue(glHandle, UInt64(glValue), UInt64(glMax));
  79. end;
  80. end;
  81.  
  82. procedure TWin7TaskProgressBar.SetStyle(const Style: TTaskBarProgressStyle);
  83. const
  84. Flags: array[TTaskBarProgressStyle] of Cardinal = (0, 1, 2, 4, 8);
  85. begin
  86. if (glTaskBarInterface <> nil) and (glHandle <> 0) then
  87. glTaskBarInterface.SetProgressState(glHandle, Flags[Style]);
  88.  
  89. glStyle := Style;
  90. end;
  91.  
  92. procedure TWin7TaskProgressBar.SetVisible(const IsVisible: Boolean);
  93. begin
  94. if IsVisible then begin
  95. if (glStyle <> tbpsNormal) then
  96. SetStyle(tbpsNormal)
  97. end else
  98. SetStyle(tbpsNone);
  99.  
  100. glVisible := IsVisible;
  101. end;
  102.  
  103. procedure TWin7TaskProgressBar.SetMarquee(const IsMarquee: Boolean);
  104. begin
  105. if IsMarquee then
  106. SetStyle(tbpsIndeterminate)
  107. else begin
  108. SetStyle(tbpsNone);
  109. if glVisible then begin
  110. SetProgress(glValue);
  111. SetStyle(tbpsNormal);
  112. end;
  113. end;
  114.  
  115. glMarquee := IsMarquee;
  116. end;
  117.  
  118. constructor TWin7TaskProgressBar.Create(const Handle: LongWord);
  119. const
  120. CLSID_TaskbarList: TGUID = '{56FDF344-FD6D-11d0-958A-006097C9A090}';
  121. var
  122. OSVersionInfo : TOSVersionInfo;
  123. begin
  124. OSVersionInfo.dwOSVersionInfoSize := sizeof(TOSVersionInfo);
  125. if (Handle <> 0) and GetVersionEx(OSVersionInfo) then
  126. if OSVersionInfo.dwMajorVersion >= 6 then try
  127. glHandle := Handle;
  128. CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC, ITaskbarList3, glTaskBarInterface);
  129.  
  130. if (glTaskBarInterface <> nil) then
  131. glTaskBarInterface.SetProgressState(glHandle, 0);
  132.  
  133. glMin := 0;
  134. glMax := 100;
  135. glValue := 10;
  136. glStyle := tbpsNormal;
  137.  
  138. SetStyle(glStyle);
  139. SetVisible(glVisible);
  140. except
  141. glTaskBarInterface := nil;
  142. end;
  143. end;
  144.  
  145. destructor TWin7TaskProgressBar.Destroy;
  146. begin
  147. if (glTaskBarInterface <> nil) then begin
  148. glTaskBarInterface.SetProgressState(glHandle, 0);
  149. glTaskBarInterface := nil;
  150. end;
  151. end;
  152.  
  153. end.

Оставьте свой комментарий

Оставить комментарий как гость

0
  • Комментариев нет
ProgressBar в панели задач Windows 7 и старше (Delphi 7, не моё) - 1.0 out of 5 based on 1 vote