ProgressBar на окне TaskBar

Пример того как можно создать progressbar на окне TaskBar. Делается это с помощью подключения соответствующего COM интерфейса. Для примера используется библиотека Window9.

Платформа: Windows
Адаптация примера на FreeBasic: Станислав Будинов

taskbarscroll.png

#INCLUDE "window9.bi"

'Enum TBPFLAG
    'TBPF_NOPROGRESS = 0
    'TBPF_INDETERMINATE = 1
    'TBPF_NORMAL = 2
    'TBPF_ERROR = 4
    'TBPF_PAUSED = 8
'End Enum

'Enum THUMBBUTTONMASK
    'THB_BITMAP = 1
    'THB_ICON = 2
    'THB_TOOLTIP = 4
    'THB_FLAGS = 8
'End Enum

'Enum THUMBBUTTONFLAGS
    'THBF_ENABLED = 0
    'THBF_DISABLED = 1
    'THBF_DISMISSONCLICK = 2
    'THBF_NOBACKGROUND = 4
    'THBF_HIDDEN = 8
    'THBF_NONINTERACTIVE = 10
'End Enum

'#DEFINE CLSCTX_INPROC_HANDLER16 &h20
'#DEFINE CLSCTX_RESERVED1 &h40
'#DEFINE CLSCTX_RESERVED2 &h80
'#DEFINE CLSCTX_RESERVED3 &h100
'#DEFINE CLSCTX_RESERVED4 &h200
'#DEFINE CLSCTX_NO_CODE_DOWNLOAD &h400
'#DEFINE CLSCTX_RESERVED5 &h800
'#DEFINE CLSCTX_NO_CUSTOM_MARSHAL &h1000
'#DEFINE CLSCTX_ENABLE_CODE_DOWNLOAD &h2000
'#DEFINE CLSCTX_NO_FAILURE_LOG &h4000
'#DEFINE CLSCTX_DISABLE_AAA &h8000
'#DEFINE CLSCTX_ENABLE_AAA &h10000
'#DEFINE CLSCTX_FROM_DEFAULT_CONTEXT &h20000
'#DEFINE CLSCTX_ACTIVATE_32_BIT_SERVER &h40000
'#DEFINE CLSCTX_ACTIVATE_64_BIT_SERVER &h80000
'#DEFINE CLSCTX_ENABLE_CLOAKING &h100000
'#DEFINE CLSCTX_PS_DLL &h80000000

'Type THUMBBUTTON
    'As THUMBBUTTONMASK dwMask
    'As UINT iId
    'As UINT iBitmap
    'As HICON hIcon
    'As WString*260 szTip
    'As THUMBBUTTONFLAGS dwFlags
'End Type

'Type ITaskbarList3Vtbl_ As ITaskbarList3Vtbl
'
'Type ITaskbarList3
    'lpVtbl As ITaskbarList3Vtbl_ Ptr
'End Type
'
'Type ITaskbarList3Vtbl
    'QueryInterface As Function (Byval As ITaskbarList3 Ptr,Byval As IID Ptr, Byval As Any Ptr Ptr) As HRESULT
    'AddRef As Function(Byval As ITaskbarList3 Ptr) As HRESULT
    'Release As Function(Byval As ITaskbarList3 Ptr) As HRESULT
    'HrInit As Function(Byval As ITaskbarList3 Ptr) As HRESULT
    'AddTab As Function(Byval As ITaskbarList3 Ptr,a As HWND) As HRESULT
    'DeleteTab As Function(Byval As ITaskbarList3 Ptr,a As HWND) As HRESULT
    'ActivateTab As Function(Byval As ITaskbarList3 Ptr,a As HWND) As HRESULT
    'SetActiveAlt As Function(Byval As ITaskbarList3 Ptr,a As HWND) As HRESULT
    'MarkFullscreenWindow As Function(Byval As ITaskbarList3 Ptr,a As HWND,fFullscreen As BOOL) As HRESULT
    'SetProgressValue As Function (ITL As ITaskbarList3 Ptr,hwnd As HWND ,ullCompleted As Ulongint,ullTotal As Ulongint) As HRESULT
    'SetProgressState As Function(ITL As ITaskbarList3 Ptr,hwnd As HWND,tbpFlags As TBPFLAG) As HRESULT
    'RegisterTab As Function(ITL As ITaskbarList3 Ptr,hwndTab As HWND ,hwndMDI As HWND) As HRESULT
    'UnregisterTab As Function(ITL As ITaskbarList3 Ptr,hWndTab As HWND) As HRESULT
    'SetTabOrder As Function(ITL As ITaskbarList3 Ptr,hWndTab As HWND,hWndInsertBefore As HWND) As HRESULT
    'SetTabActive As Function(ITL As ITaskbarList3 Ptr,hWndTab As HWND,hWndMDI As HWND,tbatFlags As DWORD)As HRESULT
    'ThumbBarAddButtons As Function(ITL As ITaskbarList3 Ptr,hWnd As HWND,cButtons As UINT,pButton As THUMBBUTTON Ptr)As HRESULT
    'ThumbBarUpdateButtons As Function(ITL As ITaskbarList3 Ptr,hWnd As HWND,cButtons As UINT,pButton As THUMBBUTTON Ptr)As HRESULT
    'ThumbBarSetImageList As Function(ITL As ITaskbarList3 Ptr,hWnd As HWND,himl As HIMAGELIST)As HRESULT
    'SetOverlayIcon As Function(ITL As ITaskbarList3 Ptr,hWnd As HWND,hIcon As HICON,pszDescription As LPCWSTR)As HRESULT
    'SetThumbnailTooltip As Function(ITL As ITaskbarList3 Ptr,hWnd As HWND,pszTip As LPCWSTR)As HRESULT
    'SetThumbnailClip As Function(ITL As ITaskbarList3 Ptr,hWnd As HWND,prcClip As LPRECT)As HRESULT
'End Type

'Dim Shared  CLSID_TaskbarList As IID = Type(&h56FDF344, &hFD6D, &h11D0, {&h95, &h8a, &h00, &h60, &h97, &hc9, &ha0, &h90})
'Dim Shared  IID_ITaskbarList3 As IID = Type(&hEA1AFB91, &h9E28, &h4B86, {&h90, &hE9, &h9E, &h9F, &h8A, &h5E, &hEF, &hAF})


Dim As Integer ev, pct
Dim As HWND hwnd
Dim As RECT rec
Dim As ITaskbarList3 Ptr tl3

hwnd =  OpenWindow("", 0, 0, 300, 80)

ProgressBarGadget(1, 10,10, 260, 20, 0, 100)

CoInitialize(Null)
CoCreateInstance(@CLSID_TaskBarList,Null,CLSCTX_INPROC_SERVER,@IID_ITaskBarList3,@tl3)
tl3->lpVtbl->HrInit(tl3)
tl3->lpVtbl->SetProgressValue(tl3,hwnd,0,100)
tl3->lpVtbl->SetProgressState(tl3,hwnd,TBPF_NORMAL)

GetClientRect(hwnd, @rec)
rec.right /= 2
rec.bottom /= 2
tl3->lpVtbl->SetThumbnailClip(tl3,hwnd, @rec)

Do
    ev = WindowEvent()
    If ev = 0 Then
        If pct = 101 Then
            FreeGadget(1)
            SetWindowText(hwnd, "Ошибка")
            tl3->lpVtbl->SetProgressState(tl3,hwnd,TBPF_ERROR)
        Else
            SetWindowText(hwnd, Str(pct))
            SetGadgetState(1, pct)
            tl3->lpVtbl->SetProgressValue(tl3,hwnd,pct,100)
            pct += 1
        Endif
        Sleep 20
    Endif
    Sleep(1)
Loop    Until ev = EventClose


If tl3 Then
    tl3->lpVtbl->Release(tl3)
    CoUninitialize()
Endif