Благополучно переехал на Win7 RC - мне нравится еще больше
Одна из фишек, которую захотелось сразу сделать - показ прогресса чего-нибудь прямо на кнопке в таскбаре; вроде получилось, ничего военного в общем нету; код:
uses
windows;
type
TBPF = (TBPF_NOPROGRESS = 0,
TBPF_INDETERMINATE = 1,
TBPF_NORMAL = 2,
TBPF_ERROR = 4,
TBPF_PAUSED = 8);
TBATF = (TBATF_USEMDITHUMBNAIL = 1,
TBATF_USEMDILIVEPREVIEW = 2);
function InitTaskBar: HResult;
function SetTaskBarState ( hWnd: HWND; State: TBPF ): HResult;
function SetTaskBarValue ( hWnd: HWND; Value: integer ): HResult;
implementation
uses
ActiveX;
const
CLSID_TaskbarList: TGUID = '{56fdf344-fd6d-11d0-958a-006097c9a090}';
IID_ITaskbarList: TGUID = '{56FDF342-FD6D-11d0-958A-006097C9A090}';
IID_ITaskbarList2: TGUID = '{602D4995-B13A-429b-A66E-1935E44F4317}';
IID_ITaskbarList3: TGUID = '{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}';
type
ITaskbarList = interface(IUnknown)
['{56FDF342-FD6D-11d0-958A-006097C9A090}']
function HrInit : HResult; stdcall;
function AddTab(hWndOwner : HWND) : HResult; stdcall;
function DeleteTab(hWndOwner : HWND) : HResult; stdcall;
function ActivateTab(hWndOwner : HWND) : HResult; stdcall;
function SetActiveAlt(hWndOwner : HWND) : HResult; stdcall;
end; { ITaskbarList }
ITaskbarList2 = interface(ITaskbarList)
['{602D4995-B13A-429b-A66E-1935E44F4317}']
function MarkFullscreenWindow(wnd : HWND; fFullscreen : bool) : HResult; stdcall;
end;
ITaskbarList3 = interface (ITaskbarList2)
['{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}']
function SetProgressValue (hWnd: HWND; ullCompleted: int64; ullTotal: int64): HResult; stdcall;
function SetProgressState (hWnd: HWND; tbpFlags: TBPF): HResult; stdcall;
function RegisterTab (hwndTab: HWND; hwndMDI: HWND): HResult; stdcall;
function UnregisterTab (hwndTab: HWND): HResult; stdcall;
function SetTabOrder (hwndTab: HWND; hwndInsertBefore: HWND): HResult; stdcall;
function SetTabActive (hwndTab: HWND; hwndMDI: HWND; tbatFlags: TBATF): HResult; stdcall;
function ThumbBarAddButtons (hWnd: HWND; cButtons: integer; pButtons: pointer): HResult; stdcall;
function ThumbBarUpdateButtons (hWnd: HWND; cButtons: cardinal; pButtons: pointer): HResult; stdcall;
function ThumbBarSetImageList (hWnd: HWND; himl: pointer): HResult; stdcall;
function SetOverlayIcon (hWnd: HWND; hIcon: HICON; pszDescription: PWideChar): HResult; stdcall;
function SetThumbnailTooltip (hWnd: HWND; pszTip: PWideChar): HResult; stdcall;
function SetThumbnailClip (hWnd: HWND; prcClip: PRect): HResult; stdcall;
end;
var
pTaskBarList: ITaskbarList3;
function InitTaskBar: HResult;
begin
Result := CoCreateInstance (CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, pTaskbarList);
if Failed ( Result ) then
pTaskBarList := nil;
end;
function SetTaskBarState ( hWnd: HWND; State: TBPF ): HResult;
begin
if pTaskBarList = nil then
Result := S_FALSE else
Result := pTaskBarList.SetProgressState ( hWnd, State );
end;
function SetTaskBarValue ( hWnd: HWND; Value: integer ): HResult;
begin
// assume Value = 0-100
if pTaskBarList = nil then
Result := S_FALSE else
Result := pTaskBarList.SetProgressValue ( hWnd, Value, 100 );
end;
Использование - проще некуда: код можно выделить в отдельный юнит и подключать его при необходимости; перед использованием надо вызвать InitTaskBar - если получится создать нужный интерфейс (читай - если он есть, т.е. если мы в Win7), то вернется S_OK и значит можно вызывать функции прогресса.. хотя их можно вызывать и так, ничего не случится, но для красоты..
Ну и дальше - вызываем SetTaskBarState c:
Вот пример, как все должно работать: http://rapidshare.com/files/230523628/TaskBarDemo.zip.html
Вот как все работает (сначала надо нажать btn1 - это собственно инициализация, потом пощелкать по радиокнопкам и подвигать ползунок):
Одна из фишек, которую захотелось сразу сделать - показ прогресса чего-нибудь прямо на кнопке в таскбаре; вроде получилось, ничего военного в общем нету; код:
uses
windows;
type
TBPF = (TBPF_NOPROGRESS = 0,
TBPF_INDETERMINATE = 1,
TBPF_NORMAL = 2,
TBPF_ERROR = 4,
TBPF_PAUSED = 8);
TBATF = (TBATF_USEMDITHUMBNAIL = 1,
TBATF_USEMDILIVEPREVIEW = 2);
function InitTaskBar: HResult;
function SetTaskBarState ( hWnd: HWND; State: TBPF ): HResult;
function SetTaskBarValue ( hWnd: HWND; Value: integer ): HResult;
implementation
uses
ActiveX;
const
CLSID_TaskbarList: TGUID = '{56fdf344-fd6d-11d0-958a-006097c9a090}';
IID_ITaskbarList: TGUID = '{56FDF342-FD6D-11d0-958A-006097C9A090}';
IID_ITaskbarList2: TGUID = '{602D4995-B13A-429b-A66E-1935E44F4317}';
IID_ITaskbarList3: TGUID = '{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}';
type
ITaskbarList = interface(IUnknown)
['{56FDF342-FD6D-11d0-958A-006097C9A090}']
function HrInit : HResult; stdcall;
function AddTab(hWndOwner : HWND) : HResult; stdcall;
function DeleteTab(hWndOwner : HWND) : HResult; stdcall;
function ActivateTab(hWndOwner : HWND) : HResult; stdcall;
function SetActiveAlt(hWndOwner : HWND) : HResult; stdcall;
end; { ITaskbarList }
ITaskbarList2 = interface(ITaskbarList)
['{602D4995-B13A-429b-A66E-1935E44F4317}']
function MarkFullscreenWindow(wnd : HWND; fFullscreen : bool) : HResult; stdcall;
end;
ITaskbarList3 = interface (ITaskbarList2)
['{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}']
function SetProgressValue (hWnd: HWND; ullCompleted: int64; ullTotal: int64): HResult; stdcall;
function SetProgressState (hWnd: HWND; tbpFlags: TBPF): HResult; stdcall;
function RegisterTab (hwndTab: HWND; hwndMDI: HWND): HResult; stdcall;
function UnregisterTab (hwndTab: HWND): HResult; stdcall;
function SetTabOrder (hwndTab: HWND; hwndInsertBefore: HWND): HResult; stdcall;
function SetTabActive (hwndTab: HWND; hwndMDI: HWND; tbatFlags: TBATF): HResult; stdcall;
function ThumbBarAddButtons (hWnd: HWND; cButtons: integer; pButtons: pointer): HResult; stdcall;
function ThumbBarUpdateButtons (hWnd: HWND; cButtons: cardinal; pButtons: pointer): HResult; stdcall;
function ThumbBarSetImageList (hWnd: HWND; himl: pointer): HResult; stdcall;
function SetOverlayIcon (hWnd: HWND; hIcon: HICON; pszDescription: PWideChar): HResult; stdcall;
function SetThumbnailTooltip (hWnd: HWND; pszTip: PWideChar): HResult; stdcall;
function SetThumbnailClip (hWnd: HWND; prcClip: PRect): HResult; stdcall;
end;
var
pTaskBarList: ITaskbarList3;
function InitTaskBar: HResult;
begin
Result := CoCreateInstance (CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, pTaskbarList);
if Failed ( Result ) then
pTaskBarList := nil;
end;
function SetTaskBarState ( hWnd: HWND; State: TBPF ): HResult;
begin
if pTaskBarList = nil then
Result := S_FALSE else
Result := pTaskBarList.SetProgressState ( hWnd, State );
end;
function SetTaskBarValue ( hWnd: HWND; Value: integer ): HResult;
begin
// assume Value = 0-100
if pTaskBarList = nil then
Result := S_FALSE else
Result := pTaskBarList.SetProgressValue ( hWnd, Value, 100 );
end;
Использование - проще некуда: код можно выделить в отдельный юнит и подключать его при необходимости; перед использованием надо вызвать InitTaskBar - если получится создать нужный интерфейс (читай - если он есть, т.е. если мы в Win7), то вернется S_OK и значит можно вызывать функции прогресса.. хотя их можно вызывать и так, ничего не случится, но для красоты..
Ну и дальше - вызываем SetTaskBarState c:
- TBPF_NORMAL, если будет показываться "обычный" прогресс
- TBPF_INDETERMINATE, если надо отобразить процесс неопределенной длительности
- TBPF_ERROR, если надо показать, что в процессе произошла ошибка (прогресс-бар окрасится в красный цвет)
- TBPF_PAUSED, если процесс запаузили (прогресс-бар окрасится в желтый)
Вот пример, как все должно работать: http://rapidshare.com/files/230523628/TaskBarDemo.zip.html
Вот как все работает (сначала надо нажать btn1 - это собственно инициализация, потом пощелкать по радиокнопкам и подвигать ползунок):
-> ->
Май в этом году мокрый-мокрющий получается.. снова дождь, снова грозу обещают, снова все выходные поливать будет..
Погоду смотрю в гаджете виндовом - он в RC "из коробки" наконец заработал..
Май в этом году мокрый-мокрющий получается.. снова дождь, снова грозу обещают, снова все выходные поливать будет..
Погоду смотрю в гаджете виндовом - он в RC "из коробки" наконец заработал..
Комментариев нет:
Отправить комментарий