[Win7] Taskbar-Schaltfläche animieren

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Win7] Taskbar-Schaltfläche animieren

Beitrag von zigapeda »

Ohai Community,

ich hab den Beispielcode von ts-soft mal um die ThumbButton Funktionalitaet erweitert,
war dabei aber leider nicht so ganz erfolgreich. Und da dass hier das Windowsforum ist
und nicht das Snippetsforum wollte ich euch meinen Fortschritt mitteilen, evtl sieht jemand
meinen Fehler^^

Code: Alles auswählen

EnableExplicit

#TBPF_NOPROGRESS    = $0
#TBPF_INDETERMINATE = $1
#TBPF_NORMAL        = $2
#TBPF_ERROR         = $4
#TBPF_PAUSED        = $8

Interface ITaskbarList3 Extends ITaskbarList2
  SetProgressValue.i(hWnd.i, ullCompleted.q, ullTotal.q)
  SetProgressState.i(hWnd.i, tbpFlags.l)
  RegisterTab.i(hWndTab.i, hWndMDI.i)
  UnregisterTab.i(hWndTab.i)
  SetTabOrder.i(hWndTab.i, hWndInsertBefore.i)
  SetTabActive.i(hWndTab.i, hWndMDI.i, tbatFlags.l)
  ThumbBarAddButtons.i(hWnd.i, cButtons.l, *pButton)
  ThumbBarUpdateButtons.i(hWnd.i, cButtons.l, *pButton)
  ThumbBarSetImageList.i(hWnd.i, himl.i)
  SetOverlayIcon.i(hWnd.i, hIcon.i, pszDescription.s)
  SetThumbnailTooltip.i(hWnd.i, pszTip.s)
  SetThumbnailClip.i(hWnd.i, *prcClip)
EndInterface

Structure THUMBBUTTON
  dwMask.l
  iId.l
  iBitmap.l
  hIcon.i
  szTip.s{260}
  dwFlags.l
EndStructure

DataSection
  CLSID_TaskBarList:
  Data.l $56FDF344
  Data.w $FD6D, $11D0
  Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
  IID_ITaskBarList3:
  Data.l $ea1afb91
  Data.w $9e28,$4b86
  Data.b $90,$E9,$9e,$9f,$8a,$5e,$ef,$af
EndDataSection

Procedure TaskBarProgress(hWnd, flag = #TBPF_NORMAL)
  Protected ptl.ITaskbarList3
  
  Protected Dim bp.THUMBBUTTON(2)
  bp(0)\dwMask = 10
  bp(0)\iId = 4
  bp(0)\iBitmap = 0
  bp(0)\hIcon = ImageID(LoadImage(#PB_Any,"kreis.ico"))
  bp(0)\szTip = "Test"
  bp(0)\dwFlags = 0
  bp(1)\dwMask = 10
  bp(1)\iId = 5
  bp(1)\iBitmap = 0
  bp(1)\hIcon = ImageID(LoadImage(#PB_Any,"viereck.ico"))
  bp(1)\szTip = "Test2"
  bp(1)\dwFlags = 0
  
 
  If OSVersion() >= #PB_OS_Windows_7
    CoCreateInstance_(?CLSID_TaskBarList, 0, 1, ?IID_ITaskBarList3, @ptl)
   
    If ptl
      ptl\HrInit()
      ptl\SetProgressValue(hWnd, 0, 100)
      ptl\SetProgressState(hWnd, flag)
      ptl\ThumbBarAddButtons(hWnd, 2, @bp())
    EndIf
  EndIf
  ProcedureReturn ptl
EndProcedure

Procedure TBP_SetState(hWnd, ptl.ITaskbarList3, state)
  If ptl
    Select state
      Case #TBPF_NOPROGRESS, #TBPF_INDETERMINATE, #TBPF_NORMAL, #TBPF_ERROR, #TBPF_PAUSED
        ptl\SetProgressState(hWnd, state)
    EndSelect
  EndIf
EndProcedure

Procedure TBP_SetValue(hWnd, ptl.ITaskbarList3, value)
  If ptl
    If value <   0 : value =   0 : EndIf
    If value > 100 : value = 100 : EndIf
    ptl\SetProgressValue(hWnd, value, 100)
  EndIf
EndProcedure

Procedure TBP_Release(ptl.ITaskbarList3)
  If ptl
    ptl\Release()
    ptl = 0
  EndIf
EndProcedure

; example
Define TBP, progress, pause = 1
Define hIcon = ExtractIcon_(GetModuleHandle_(0), #PB_Compiler_Home + "PureBasic.exe", 0)

OpenWindow(0, #PB_Ignore, #PB_Ignore, 265, 30, "Example", #PB_Window_SystemMenu)
SendMessage_(WindowID(0), #WM_SETICON, 0, hIcon)
ButtonGadget(1, 5, 5, 80, 20, "start")
ButtonGadget(2, 90, 5, 80, 20, "stop")
ButtonGadget(3, 175, 5, 80, 20, "pause")

TBP = TaskBarProgress(WindowID(0), #TBPF_NOPROGRESS)

Define e.l

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      TBP_Release(TBP)
      DestroyIcon_(hIcon)
      Break
    Case #PB_Event_Gadget
      e = EventGadget()
      Debug e
      Select e
        Case 0
          Debug "test"
        Case 1 ; start
          AddWindowTimer(0, 1, 100)
        Case 2 ; stop
          RemoveWindowTimer(0, 1)
          TBP_SetState(WindowID(0), TBP, #TBPF_NOPROGRESS)
          progress = 0
        Case 3 ; pause
          pause ! 1
          If pause
            AddWindowTimer(0, 1, 100)
            TBP_SetState(WindowID(0), TBP, #TBPF_NORMAL)
            SetGadgetText(2, "pause")
          Else
            RemoveWindowTimer(0, 1)
            TBP_SetState(WindowID(0), TBP, #TBPF_PAUSED)
            SetGadgetText(2, "weiter")
          EndIf
      EndSelect
    Case #PB_Event_Timer
      progress + 1
      If progress > 100 : progress = 0 : EndIf
      TBP_SetState(WindowID(0), TBP, #TBPF_NORMAL)
      TBP_SetValue(WindowID(0), TBP, progress)
  EndSelect
ForEver
Also letzendlich werden 2 Buttons gezeigt, nur der erste hat ein Icon (kreis.ico und
viereck.ico im sourceordner notwendig) und beide geben bei einem Klick ein
WindowEvent = #PB_Event_Gadget mit EventGadget() = 0 zurueck.
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Salk
Beiträge: 6
Registriert: 12.12.2012 20:46

Re: [Win7] Taskbar-Schaltfläche animieren

Beitrag von Salk »

Hi,

ich hab gerade leider nicht viel Zeit, deswegen poste ich dir einfach mal einen angepassten Ausschnitt aus meinem Programm.
Vielleicht findest du deinen Fehler ja.

Code: Alles auswählen

Macro LoWord(long)
  long & $FFFF
EndMacro

Macro AddPadding(_padding) ;Für Structures unter 64Bit
  CompilerIf #PB_Compiler_Processor=#PB_Processor_x64 : _padding : CompilerEndIf
EndMacro

Procedure WindowCallback(WindowID, Message, wParam, lParam) 
  Protected result = #PB_ProcessPureBasicEvents
  
  Select Message
    Case #WM_COMMAND
      Select WindowID
        Case WindowID(0)
          Select LoWord(wParam)
            Case $01
              Debug "Button1"
            Case $02
              Debug "Button2"
          EndSelect          
      EndSelect
    Case #WM_QUERYENDSESSION
      QUIT = #True
  EndSelect
  
  ProcedureReturn result
EndProcedure

Interface ITaskbarList3 Extends ITaskbarList2
  SetProgressValue(hWnd, Completed.q, Total.q)
  SetProgressState(hWnd, Flags.l)
  RegisterTab(hWndTab, hWndMDI)
  UnregisterTab(hWndTab)
  SetTabOrder(hWndTab, hwndInsertBefore)
  SetTabActive(hWndTab, hWndMDI, dwReserved.l)
  ThumbBarAddButtons(hWnd, cButtons, *pButtons)
  ThumbBarUpdateButtons(hWnd, cButtons, *pButtons)
  ThumbBarSetImageList(hWnd, himl)
  SetOverlayIcon(hWnd, hIcon, pszDescription.s)
  SetThumbnailTooltip(hWnd, pszTip.s)
  SetThumbnailClip(hWnd, *prcClip.RECT)
EndInterface

Structure THUMBBUTTON
  dwMask.l       
  iId.l          
  iBitmap.l      
  AddPadding(_padd1.l)
  *hIcon         
  szTip.u[260]   
  AddPadding(_padd2.u)
  dwFlags.l      
  AddPadding(_padd3.u)
EndStructure


#CLSCTX_INPROC_SERVER = 1
#CLSCTX_LOCAL_SERVER  = 4
#CLSCTX_SERVER        = #CLSCTX_INPROC_SERVER | #CLSCTX_LOCAL_SERVER


#THB_BITMAP    = $01
#THB_ICON      = $02
#THB_TOOLTIP   = $04
#THB_FLAGS     = $08



Define ico1 = LoadImage(#PB_Any, "ico1.ico")
Define ico2 = LoadImage(#PB_Any, "ico2.ico")

Define *TASKBAR.ITaskbarList3
Procedure InitWin7Functions()
  Shared ico1, ico2
  
  Shared *TASKBAR
  
  Protected clip.RECT, ret
  
  ;Buttons einrichten
  CoInitialize_(0)
  Dim buttons.THUMBBUTTON(1)
  
  With buttons(0)
    \dwMask   = #THB_ICON | #THB_TOOLTIP
    \iId      = $01
    \iBitmap  = 0
    \hIcon    = ImageID(ico1)
    
    PokeS(@\szTip, "Button1", 6, #PB_Unicode)
  EndWith
  
  
  With buttons(1)
    \dwMask   = #THB_ICON | #THB_TOOLTIP
    \iId      = $02
    \iBitmap  = 0
    \hIcon    = ImageID(ico2)
    
    PokeS(@\szTip, "Button2", 10, #PB_Unicode)
  EndWith
  
  ret = CoCreateInstance_(?CLSID_TaskbarList, 0, #CLSCTX_SERVER, ?IID_ITaskbarList, @*TASKBAR)
  
  If ret = #S_OK
    *TASKBAR\HrInit()
    *TASKBAR\ThumbBarAddButtons(WindowID(0), 2, @buttons())
    
    
;     clip\top = 4
;     clip\left = 4
;     clip\bottom = 4 + 192
;     clip\right = 4 + 193
;     *TASKBAR\SetThumbnailClip(WindowID(0), clip)
  Else
    Select ret
      Case #S_OK
        Debug("An instance of the specified object class was successfully created.")
      Case #REGDB_E_CLASSNOTREG
        Debug("A specified class is Not registered in the registration database. Also can indicate that the type of server you requested in the CLSCTX Enumeration is Not registered Or the values For the server types in the registry are corrupt.")
      Case #CLASS_E_NOAGGREGATION
        Debug("This class cannot be created As part of an aggregate.")
      Case #E_NOINTERFACE
        Debug("The specified class does Not implement the requested Interface, Or the controlling IUnknown does Not expose the requested Interface.")
      Case #E_POINTER 
        Debug("The ppv parameter is NULL.")
      Default
        Debug("Other Error.")
    EndSelect
  EndIf
EndProcedure

OpenWindow(0, 100, 100, 100, 100, "Test")
SetWindowCallback(@WindowCallback(), 0)

InitWin7Functions()


While QUIT = #False
  event = WaitWindowEvent(10)
Wend


DataSection
  ;Superbarbuttons
  CLSID_TaskbarList:
  ; 56FDF344-FD6D-11D0-958A-006097C9A090
  Data.l $56FDF344
  Data.w $FD6D, $11D0, $8A95
  Data.b $00, $60, $97, $C9, $A0, $90
  IID_ITaskbarList:
  ; {56FDF342-FD6D-11D0-958A-006097C9A090}
  Data.l $56FDF342
  Data.w $FD6D, $11D0, $8A95
  Data.b $00, $60, $97, $C9, $A0, $90
EndDataSection
Das ganze funktioniert unter 64bit und eigentlich auch unter 32bit (ungetestet). Getestet hab ich das ganze nur mit Unicode aktiviert.
Falls es Fragen gibt, kann ich dir vielleicht morgen weiterhelfen.

Edit:
Achjaa. Ob die Paddings für x64 in der Thumbbutton-Struktur so richtig sind, kann ich nicht sagen. Aber bis jetzt hatte ich noch keine Probleme damit ;)
Antworten