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