- Offizieller Beitrag
Ich versuche mich gerade daran, bei einer Toolbar die Buttons verschiebbar zu machen, sodass man die Anordnung der Buttons selbst bestimmen kann.
Bisher habe ich ein, einigermassen funktionierendes, Beispiel (siehe unten) hinbekommen. Allerdings mit zwei Einschränkungen:
1. der Abstand zwischen den Buttons muss 0 Pixel betragen
2. es dürfen keine Separator-Buttons vorhanden sein
AutoIt
#include <AutoItConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiMenu.au3>
#include <GuiReBar.au3>
#include <GuiToolbar.au3>
#include <RebarConstants.au3>
#include <StructureConstants.au3>
#include <ToolbarConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIGdiInternals.au3>
#include <WinAPIHObj.au3>
#include <WinAPIIcons.au3>
#include <WinAPIShellEx.au3>
#include <WindowsConstants.au3>
Opt('GUIOnEventMode', 1)
Global Const $iUserIconSize = 32 ; die Icongroesse der User-Toolbar
Global $hUserImgList = _GUIImageList_Create($iUserIconSize, $iUserIconSize, 5)
Global $aIconIndices[] = [10, 18, 41, 54, 65, 85, 124, 94]
For $iIndex In $aIconIndices
_GUIImageList_AddIconEx($hUserImgList, 'imageres.dll', $iIndex)
Next
Global $hMainGui = GUICreate('Toolbar Drag and Drop', 800, 320, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN))
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseMainGui')
GUISetFont(12, 400, 0, 'Verdana')
Global $hDrivesRebar = _GUICtrlRebar_Create($hMainGui, BitOR($CCS_TOP, $CCS_NODIVIDER, $RBS_VARHEIGHT, $RBS_BANDBORDERS))
Global $hUserToolbar = _GUICtrlToolbar_Create($hMainGui, BitOR($TBSTYLE_FLAT, $TBSTYLE_TOOLTIPS))
_GUICtrlToolbar_SetMetrics($hUserToolbar, 10, 10, 0, 10) ; <- der Abstand zwischen den Buttons (4. Parameter) muss auf 0 stehen, sonst klappt das nicht
_GUICtrlToolbar_SetImageList($hUserToolbar, $hUserImgList)
_GUICtrlRebar_AddToolBarBand($hDrivesRebar, $hUserToolbar, '', 0, $RBBS_NOGRIPPER)
_GUICtrlRebar_SetBandLength($hDrivesRebar, 0, 800)
For $i = 0 To UBound($aIconIndices) - 1
_GUICtrlToolbar_AddButton($hUserToolbar, 10000 + $i, $i)
Next
;~ _GUICtrlToolbar_AddButtonSep($hUserToolbar) ; <- mit Separator klappt das verschieben nicht richtig
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY')
GUIRegisterMsg($WM_SIZE, '_WM_SIZE')
WinWaitClose($hMainGui)
Exit
Func _CloseMainGui()
_GUIImageList_Destroy($hUserImgList)
GUIDelete($hMainGui)
EndFunc ;==>_CloseMainGui
Func _WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $iWidth = BitAND($lParam, 0xFFFF)
_GUICtrlRebar_SetBandLength($hDrivesRebar, 0, Int($iWidth / 2))
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_SIZE
Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local Static $fDragButton = False
Local $tNMHDR, $hWndFrom, $iCode, $tNMTBHOTITEM, $iOldPos, $iNewPos, $tNMMOUSE, $iCmdID
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
$iCode = DllStructGetData($tNMHDR, 'Code')
Switch $hWndFrom
Case $hUserToolbar
Switch $iCode
Case $TBN_HOTITEMCHANGE
If $fDragButton Then
$tNMTBHOTITEM = DllStructCreate($tagNMTBHOTITEM, $lParam)
$iOldPos = _GUICtrlToolbar_CommandToIndex($hUserToolbar, DllStructGetData($tNMTBHOTITEM, 'idOld'))
$iNewPos = _GUICtrlToolbar_CommandToIndex($hUserToolbar, DllStructGetData($tNMTBHOTITEM, 'idNew'))
If $iOldPos > -1 And $iNewPos > -1 Then _GUICtrlToolbar_MoveButton($hUserToolbar, $iOldPos, $iNewPos)
EndIf
Case $TBN_DRAGOUT ; sobald ein Button zur Seite bewegt wird
$fDragButton = True ; das als dragging Start markieren
Case $TBN_ENDDRAG ; sobald der Benutzer den Button loslaesst
$fDragButton = False ; das dragging als beendet markieren
Case $NM_LDOWN ; wenn der Benutzer einen linken Mausklick auf einen der Buttons macht
$tNMMOUSE = DllStructCreate($tagNMMOUSE, $lParam)
$iCmdID = DllStructGetData($tNMMOUSE, 'ItemSpec')
If $iCmdID <> 0xFFFFFFFF Then
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iCmdID = ' & $iCmdID & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_NOTIFY
Func _GUIImageList_AddIconEx(ByRef $hImgList, $sPath, $iIndex)
Local $aIconSize, $hIcon, $hIcon32, $hDIB, $hAND, $iImgIndex
$aIconSize = _GUIImageList_GetIconSize($hImgList)
$hIcon = _WinAPI_ShellExtractIcon($sPath, $iIndex, $aIconSize[0], $aIconSize[1])
$hDIB = _WinAPI_Create32BitHBITMAP($hIcon, False)
$hAND = _WinAPI_CreateANDBitmap($hDIB)
$iImgIndex = _GUIImageList_AddMasked($hImgList, $hDIB, $hAND)
_WinAPI_DeleteObject($hAND)
_WinAPI_DeleteObject($hDIB)
_WinAPI_DestroyIcon($hIcon)
Return $iImgIndex
EndFunc ;==>_GUIImageList_AddIconEx
Alles anzeigen
Meine Frage: Wie kriege ich das ohne die Einschränkungen hin?