Jump to content

Recommended Posts

I have already made a regarding the same issue. But its old enough to start the discussion again there.
I wanted to have a custom scrollbar for an edit control. This is the script, it works as required.

CScrollBar

#include-once
#include <GDIP.au3> ;http://www.autoitscript.com/forum/topic/106021-gdipau3/
#include <WinAPIEx.au3>
#include <GuiConstantsEx.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <ScrollBarConstants.au3>
#include <Misc.au3>
#include <GUIEdit.au3>
#include <Array.au3>

Global $iWidth_VSCROLL = _WinAPI_GetSystemMetrics($SM_CXVSCROLL)
Global $hGraphic, $hGraphicGUI, $hBMPBuff

;Double-Click
Global $iDoubleClickTime = DllCall("user32.dll", "uint", "GetDoubleClickTime")
$iDoubleClickTime = $iDoubleClickTime[0]

;User-Custom Messages
Global $WM_UPDATETHUMB = $WM_APP + 11 ;Called when the height of the thumb has to be changed.
Global $WM_THUMBMOVE = $WM_APP + 12 ;Called when the Thumb has been clicked
Global $WM_ARROWDOWN = $WM_APP + 13 ;Called when the Arrow buttons have been clicked.
Global $WM_PAINTSCROLLBAR = $WM_APP + 14 ;Implements the painting of the scroll bar over the NC area of the EditBox.

Global Const $tagNCCALCSIZE_PARAMS = $tagRECT & ";" & $tagRECT & ";" & $tagRECT & ";ptr PWINDOWPOS"

; Register callback function and obtain handle to _New_WndProc
Global $___hNew_WndProc = DllCallbackRegister("_New_WndProc", "int", "hwnd;uint;wparam;lparam")
; Get pointer to _New_WndProc
Global $___pNew_WndProc = DllCallbackGetPtr($___hNew_WndProc)

Global $___cEdit ; Handle of the Edit
Global $___pOld_WndProc ; Old Window Procedure's Address

_GDIPlus_Startup()

Global $hPen = _GDIPlus_PenCreate(0xAAFCD667, 2), _
        $hBrush = _GDIPlus_BrushCreateSolid(0xAAFCD667), _
        $hFormat = _GDIPlus_StringFormatCreate(), _
        $hFamily = _GDIPlus_FontFamilyCreate("Wingdings"), _
        $hPath = _GDIPlus_PathCreate()

Func Startup_CustomScrollBar($hEdit)


    $___cEdit = $hEdit ;get the handle of the edit
    $___pOld_WndProc = _SubClass($hEdit, $___pNew_WndProc) ;store the old WndProc

    ;post a WM_NCCALCSIZE msg.
    _WinAPI_SetWindowPos($hEdit, Default, Default, Default, Default, Default, $SWP_FRAMECHANGED)

EndFunc   ;==>Startup_CustomScrollBar

Func Shutdown_CustomScrollBar();Mem Release

    ;unsubclass the control
    _SubClass($___cEdit, $___pOld_WndProc)

    ;dispose the resources
    _Gdiplus_PathDispose($hPath)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_StringFormatDispose($hFormat)

    _GDIPlus_FontFamilyDispose($hFamily)

    DllCallbackFree($___hNew_WndProc)
EndFunc   ;==>Shutdown_CustomScrollBar

;The path of the Top Arrow button
;This could be rotated to obtain the Bottom Arrow button's path.
Func TopBtn_Path(ByRef $hPath, $iX, $iY, $iSide)
    ;* Not required when the path is in order.
    _GDIPlus_PathStartFigure($hPath) ;*
    _GDIPlus_PathAddLine($hPath, $iX + $iSide, $iY + $iSide, $iX + $iSide, $iY)
    _GDIPlus_PathAddLine($hPath, $iX + $iSide, $iY, $iX, $iY)
    _GDIPlus_PathAddLine($hPath, $iX, $iY, $iX, $iY + $iSide)
    _GDIPlus_PathAddArc($hPath, $iX, $iY + $iSide / 2, $iSide, $iSide, 180, 180)
    _GDIPlus_PathCloseFigure($hPath) ;*
EndFunc   ;==>TopBtn_Path

;The Path of the Thumb
Func ThumbBtn_Path(ByRef $hPath, $iX, $iY, $iHeight, $iSide)

    ;* Not required when the path is in order.
    _GDIPlus_PathStartFigure($hPath) ;*
    _GDIPlus_PathAddLine($hPath, $iX, $iY, $iX, $iY + $iHeight)
    _GDIPlus_PathAddArc($hPath, $iX, $iY + $iHeight - $iSide / 2, $iSide, $iSide, 180, -180)
    _GDIPlus_PathAddLine($hPath, $iX + $iSide, $iY + $iHeight, $iX + $iSide, $iY)
    _GDIPlus_PathAddArc($hPath, $iX, $iY - $iSide / 2, $iSide, $iSide, -180, 180)
    _GDIPlus_PathCloseFigure($hPath) ;*

EndFunc   ;==>ThumbBtn_Path

Func _SubClass($hWnd, $pNew_WindowProc)
    Local $iRes = _WinAPI_SetWindowLong($hWnd, -4, $pNew_WindowProc)
    If @error Then Return SetError(1, 0, 0)
    If $iRes = 0 Then Return SetError(1, 0, 0)
    Return SetError(0, 0, $iRes)
EndFunc   ;==>_SubClass

;The new window procedure of the edit control.
Func _New_WndProc($hWnd, $iMsg, $wParam, $lParam)
    Static $aRegion[3], $i_Thumb_Height = -1, $i_TrackHeight, $iY_Thumb = -1, $iPixel_Per_Line_Scale = 1, $iThumb_Pic = 0, $iTrack_Pic = 0

    Static $hDC, $hGfx

    Switch $iMsg

        Case $WM_NCCALCSIZE

            $tNCCALCSIZE_PARAMS = DllStructCreate($tagNCCALCSIZE_PARAMS, $lParam)

            DllStructSetData($tNCCALCSIZE_PARAMS, 1, DllStructGetData($tNCCALCSIZE_PARAMS, 1) + 2)
            DllStructSetData($tNCCALCSIZE_PARAMS, 2, DllStructGetData($tNCCALCSIZE_PARAMS, 2) + 2)
            DllStructSetData($tNCCALCSIZE_PARAMS, 3, DllStructGetData($tNCCALCSIZE_PARAMS, 3) - 2 - $iWidth_VSCROLL) ;Space for VSCROLL Bar
            DllStructSetData($tNCCALCSIZE_PARAMS, 4, DllStructGetData($tNCCALCSIZE_PARAMS, 4) - 2)

            Return 0

        Case $WM_NCPAINT

            ;the first draw.
            If $i_Thumb_Height = -1 Then _SendMessage($hWnd, $WM_UPDATETHUMB, 0, 0)


        Case $WM_PAINTSCROLLBAR

            $iRet = _WinAPI_CallWindowProc($___pOld_WndProc, $hWnd, $iMsg, _
                    $wParam, $lParam)

            $iWidth = _WinAPI_GetWindowWidth($hWnd) - _WinAPI_GetClientWidth($hWnd) - 4
            $iHeight = _WinAPI_GetClientHeight($hWnd)

            ;Set the Range
            SetInRange($i_Thumb_Height, 15, $i_TrackHeight)
            SetInRange($iY_Thumb, 0, $i_TrackHeight - $i_Thumb_Height)

            $hHbmp = hHbmp_ScrollButtons_And_Track($iWidth, $iHeight, 0xFF000000 + GUICtrlGetBkColor($hWnd, _WinAPI_GetClientWidth($hWnd), $iHeight), $aRegion, _Iif($iY_Thumb < 0, 0, $iY_Thumb), $i_Thumb_Height) ;
            GUICtrlSendMsg($iTrack_Pic, 370, $IMAGE_BITMAP, $hHbmp) ;370 = $STM_SETBITMAP
            _WinAPI_DeleteObject($hHbmp)

            _WinAPI_EmptyWorkingSet()

            Return $iRet

        Case $WM_NCHITTEST

            $tPoint = DllStructCreate($tagPoint)
            DllStructSetData($tPoint, 1, _WinAPI_LoWord($lParam))
            DllStructSetData($tPoint, 2, _WinAPI_HiWord($lParam))
            _WinAPI_ScreenToClient($hWnd, $tPoint)

            $tRect = Return_CLientRect($hWnd)
            If _WinAPI_PtInRect($tRect, $tPoint) Then Return $HTBORDER

        Case $WM_NCLBUTTONDOWN

            $tPoint = _WinAPI_GetMousePos(True, $hWnd)

            If _GDIPlus_RegionIsVisiblePoint($aRegion[0], DllStructGetData($tPoint, 1) - _WinAPI_GetClientWidth($hWnd) - 2, DllStructGetData($tPoint, 2) - 2, $hGfx) Then

                _WinAPI_PostMessage($hWnd, $WM_ARROWDOWN, $SB_LINEUP, 0)

            ElseIf _GDIPlus_RegionIsVisiblePoint($aRegion[1], DllStructGetData($tPoint, 1) - _WinAPI_GetClientWidth($hWnd) - 2, DllStructGetData($tPoint, 2) - 2, $hGfx) Then

                _WinAPI_PostMessage($hWnd, $WM_ARROWDOWN, $SB_LINEDOWN, 1)

            ElseIf _GDIPlus_RegionIsVisiblePoint($aRegion[2], DllStructGetData($tPoint, 1) - _WinAPI_GetClientWidth($hWnd) - 2, DllStructGetData($tPoint, 2) - 2, $hGfx) Then

                _WinAPI_PostMessage($hWnd, $WM_THUMBMOVE, 0, 0)

            Else

                $tRect = Return_CLientRect($hWnd)
                If _WinAPI_PtInRect($tRect, $tPoint) Then

                    $iY_Thumb = DllStructGetData($tPoint, 2) - (($i_Thumb_Height / 2) + ($iWidth_VSCROLL - 2))
                    $iLine_Scroll = Floor(($iY_Thumb / $iPixel_Per_Line_Scale))
                    $iLine_Scroll_Count = $iLine_Scroll - _GUICtrlEdit_GetFirstVisibleLine($hWnd)
                    _SendMessage($hWnd, $EM_LINESCROLl, 0, $iLine_Scroll_Count)
                    _SendMessage($hWnd, $WM_PAINTSCROLLBAR, 0, 0)

                EndIf
            EndIf

        Case $WM_CHAR, $WM_UNDO, $EM_UNDO, $WM_HOTKEY
            _WinAPI_PostMessage($hWnd, $WM_UPDATETHUMB, 0, 0)

        Case $WM_SIZE, $WM_SIZING
            $iRet = _WinAPI_CallWindowProc($___pOld_WndProc, $hWnd, $iMsg, _
                    $wParam, $lParam)
            $aPos = ControlGetPos("", "", $hWnd)

            If $iTrack_Pic Then
                GUICtrlSetPos($iTrack_Pic, $aPos[0] + 2 + _WinAPI_GetClientWidth($hWnd), $aPos[1] + 2, $iWidth_VSCROLL, _WinAPI_GetClientHeight($hWnd))
            Else
                $iTrack_Pic = GUICtrlCreatePic("", $aPos[0] + 2 + _WinAPI_GetClientWidth($hWnd), $aPos[1] + 2, $iWidth_VSCROLL, _WinAPI_GetClientHeight($hWnd))
                GUICtrlSetBkColor(-1, 0)
            EndIf

            _SendMessage($hWnd, $WM_UPDATETHUMB)

            If $hDC Then ;release the old ones
                _GDIPlus_GraphicsDispose($hGfx)
                _WinAPI_ReleaseDC($hDC, $hWnd)
            EndIf

            ;update the new graphics and DC
            $hDC = _WinAPI_GetWindowDC($hWnd)
            $hGfx = _GDIPlus_GraphicsCreateFromHDC($hDC)

            Return $iRet

        Case $WM_KEYDOWN

            Switch $wParam

                Case $VK_DOWN, $VK_UP, $VK_PRIOR, $VK_NEXT ;Down
                    $iRet = _WinAPI_CallWindowProc($___pOld_WndProc, $hWnd, $iMsg, _
                            $wParam, $lParam)
                    _SendMessage($hWnd, $WM_UPDATETHUMB)
                    Return $iRet

                Case $VK_END, $VK_HOME
                    If _IsPressed("11") Then ;CTRL Pressed

                        _SendMessage($hWnd, $WM_VSCROLL, _WinAPI_MakeLong($SB_BOTTOM + $VK_END - $wParam, 0))

                        $iY_Thumb = _Iif($wParam = $VK_END, $i_TrackHeight - $i_Thumb_Height, 0)

                        ;Redraw the window, _Winapi_RedrawWindow didn't work
                        _SendMessage($hWnd, $WM_PAINTSCROLLBAR)

                    EndIf
            EndSwitch

        Case $WM_MOUSEWHEEL

            $iDelta = _WinAPI_HiWord($wParam)
            $iCount = Abs($iDelta) / 120

            For $i = 1 To $iCount

                _SendMessage($hWnd, $WM_ARROWDOWN, _Iif($iDelta > 0, $SB_LINEUP, $SB_LINEDOWN), -$iDelta)

            Next

        Case $WM_UPDATETHUMB

            ;Calculate the required vars
            $i_LineCount = _GUICtrlEdit_GetLineCount($hWnd)
            $i_ScrollBarHeight = _WinAPI_GetClientHeight($hWnd)
            $i_LineHeight = GetLineHeight($hWnd)
            $iMax_LineVisible = Floor($i_ScrollBarHeight / $i_LineHeight)
            $i_PageHeight = $i_LineCount * $i_LineHeight
            $i_TrackHeight = $i_ScrollBarHeight - (2 * ($iWidth_VSCROLL - 2))
            $i_CurLine = _GUICtrlEdit_GetFirstVisibleLine($hWnd)

            ;Set the Thumb size
            $i_Thumb_Height = $i_TrackHeight * ($iMax_LineVisible * $i_LineHeight / $i_PageHeight)


            ;Set the Scale
            $iPixel_Per_Line_Scale = ($i_TrackHeight - $i_Thumb_Height) / ($i_LineCount - $iMax_LineVisible)

            ;Set the Thumb Pos
            $iY_Thumb = (($i_CurLine / ($i_LineCount - $iMax_LineVisible)) * ($i_TrackHeight - $i_Thumb_Height))

            ;Redraw the window, _Winapi_RedrawWindow didn't work
            _SendMessage($hWnd, $WM_PAINTSCROLLBAR, 0, 0)


        Case $WM_THUMBMOVE
            $iLine_InPage = _WinAPI_GetClientHeight($hWnd) / GetLineHeight($hWnd)
            $Y_Offset = _WinAPI_GetMousePosY(True, $hWnd) - $iY_Thumb
            $iY_Thumb_Prev = $iY_Thumb
            Local $iOutofBounds = False

            While _IsPressed("01")
                $Mouse_Y = _WinAPI_GetMousePosY(True, $hWnd)

                #cs - need to be improved
                    Select  ;halt if out of bounds
                    Case $Mouse_Y < $Y_Offset Or $Mouse_Y - $Y_Offset > $i_TrackHeight - $i_Thumb_Height

                    Switch $iOutofBounds
                    Case True
                    Sleep(10)
                    ContinueLoop

                    Case False
                    $iOutofBounds = True
                    EndSwitch

                    EndSelect
                #ce

                Switch $Mouse_Y - $Y_Offset ;pause if mouse isn't moved
                    Case $iY_Thumb

                        Sleep(10)
                        ContinueLoop

                    Case Else

                        $iY_Thumb = $Mouse_Y - $Y_Offset
                        $iOutofBounds = True
                        $iLine_Scroll = Floor(($iY_Thumb / $iPixel_Per_Line_Scale))
                        $iLine_Scroll_Count = $iLine_Scroll - _GUICtrlEdit_GetFirstVisibleLine($hWnd)
                        _SendMessage($hWnd, $EM_LINESCROLl, 0, $iLine_Scroll_Count)
                        _SendMessage($hWnd, $WM_PAINTSCROLLBAR)

                        Sleep(20)
                EndSwitch

            WEnd

        Case $WM_ARROWDOWN

            ;lParam = +ve : Down Arrow lParam = -ve : Up Arrow
            Local $iDirection = $wParam
            If $wParam = 0 Then $iDirection = _Iif($lParam > 0, $SB_LINEDOWN, $SB_LINEUP)
            _GUICtrlEdit_Scroll($hWnd, $iDirection)

            $iY_Thumb = _Iif($lParam > 0, $iY_Thumb + $iPixel_Per_Line_Scale, $iY_Thumb - $iPixel_Per_Line_Scale)

            _SendMessage($hWnd, $WM_PAINTSCROLLBAR, 0, 0)

            ;Continuous dragging
            Static $i_Start_Drag = False

            If _IsPressed("01") And $i_Start_Drag = False Then
                $iTimer = TimerInit()

                While _IsPressed("01")
                    If TimerDiff($iTimer) >= $iDoubleClickTime Then
                        $i_Start_Drag = True
                        ExitLoop
                    EndIf
                WEnd
            EndIf

            If _IsPressed("01") Then
                Sleep(15)
                _WinAPI_PostMessage($hWnd, $WM_ARROWDOWN, $wParam, $lParam)
            Else
                $i_Start_Drag = False
            EndIf



    EndSwitch

    ; Pass to the Original Window Procedure.
    Return _WinAPI_CallWindowProc($___pOld_WndProc, $hWnd, $iMsg, _
            $wParam, $lParam)
EndFunc   ;==>_New_WndProc

Func hHbmp_ScrollButtons_And_Track($iWidth, $iHeight, $iBkColor, ByRef $aRegion, $iThumb_Y, $iThumb_Height)

    If $iHeight < 2 * ($iWidth_VSCROLL - 2) Then Return 0

    Local $hFont = _GDIPlus_FontCreate($hFamily, $iWidth_VSCROLL / 2 - 1, 2)

    ;Image Containing the Scroll Bar
    $hBmp = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
    $hGfx_Bmp = _GDIPlus_ImageGetGraphicsContext($hBmp)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx_Bmp, 2)
    _GDIPlus_GraphicsClear($hGfx_Bmp, $iBkColor) ;Set Bkcolor of the Bmp to that of the Edit

    #cs - Doesn't work as expected
        ;Invalidate and erase the part of the edit containing ScrollBar.
        $tRect = Return_CLientRect($hWnd, $iX, $iY, $iX + $iWidth, $iY + $iHeight)
        _WinAPI_RedrawWindow($hWnd, $tRect, 0, BitOR($RDW_INVALIDATE, $RDW_ERASE))
    #ce

    _Gdiplus_PathReset($hPath)

    ;Top Button
    TopBtn_Path($hPath, 0, 1, $iWidth_VSCROLL - 2)
    $aRegion[0] = _GDIPlus_RegionCreateFromPath($hPath)
    _Gdiplus_GraphicsFillPath($hGfx_Bmp, $hPath) ;The Curve part

    _Gdiplus_PathReset($hPath)

    ;Bottom Button
    TopBtn_Path($hPath, 0, $iHeight - $iWidth_VSCROLL + 1, $iWidth_VSCROLL - 2)
    _PathRotate($hPath, 180)
    $aRegion[1] = _GDIPlus_RegionCreateFromPath($hPath)
    _Gdiplus_GraphicsFillPath($hGfx_Bmp, $hPath)

    _Gdiplus_PathReset($hPath)

    ;Thumb
    ThumbBtn_Path($hPath, 0, $iWidth_VSCROLL - 2 + $iThumb_Y, $iThumb_Height, $iWidth_VSCROLL - 2)
    $aRegion[2] = _GDIPlus_RegionCreateFromPath($hPath)
    _Gdiplus_GraphicsFillPath($hGfx_Bmp, $hPath)

    ;Draw something more

    $iSide = $iWidth / 2 - 2
    _GDIPlus_GraphicsDrawArc($hGfx_Bmp, $iWidth / 2 - $iSide, $iWidth_VSCROLL - 2 + $iThumb_Y + $iThumb_Height / 2 - $iSide, 2 * $iSide, 2 * $iSide, 51, 180, $hPen)
    $iSide = $iWidth / 3 - 2
    _GDIPlus_GraphicsDrawArc($hGfx_Bmp, $iWidth / 2 - $iSide, $iWidth_VSCROLL - 2 + $iThumb_Y + $iThumb_Height / 2 - $iSide, 2 * $iSide, 2 * $iSide, 230, 110, $hPen)

    ;Arrows

    $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGfx_Bmp, ChrW(217), $hFont, $tLayout, $hFormat)
    _GDIPlus_GraphicsDrawStringEx($hGfx_Bmp, ChrW(217), $hFont, $aInfo[0], $hFormat, $hBrush) ;Up Arrow

    $tLayout = _GDIPlus_RectFCreate(0, $iHeight - ($iWidth_VSCROLL - 2) / 2, 0, 0)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGfx_Bmp, ChrW(218), $hFont, $tLayout, $hFormat)
    _GDIPlus_GraphicsDrawStringEx($hGfx_Bmp, ChrW(218), $hFont, $aInfo[0], $hFormat, $hBrush) ;Down Arrow

    ;Draw the image on the GUI
    $hHbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

    ;Mem Release
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_GraphicsDispose($hGfx_Bmp)
    _GDIPlus_ImageDispose($hBmp)

    Return $hHbmp
EndFunc   ;==>hHbmp_ScrollButtons_And_Track

#cs
    Func hHbmp_ScrollThumb($iWidth, $iHeight, $iBkColor, ByRef $aRegion, $iThumb_Y, $iThumb_Height)

    _Gdiplus_PathReset($hPath)

    ;Thumb
    ThumbBtn_Path($hPath, 0, $iWidth_VSCROLL - 2 + $iThumb_Y, $iThumb_Height, $iWidth_VSCROLL - 2)
    $aRegion[2] = _GDIPlus_RegionCreateFromPath($hPath)
    _Gdiplus_GraphicsFillPath($hGfx_Bmp, $hPath)

    ;Draw something more

    $iSide = $iWidth / 2 - 2
    _GDIPlus_GraphicsDrawArc($hGfx_Bmp, $iWidth / 2 - $iSide, $iWidth_VSCROLL - 2 + $iThumb_Y + $iThumb_Height / 2 - $iSide, 2 * $iSide, 2 * $iSide, 51, 180, $hPen)
    $iSide = $iWidth / 3 - 2
    _GDIPlus_GraphicsDrawArc($hGfx_Bmp, $iWidth / 2 - $iSide, $iWidth_VSCROLL - 2 + $iThumb_Y + $iThumb_Height / 2 - $iSide, 2 * $iSide, 2 * $iSide, 230, 110, $hPen)

    EndFunc   ;==>hHbmp_ScrollThumb
#ce

Func SetInRange(ByRef $iVar, $iMin, $iMax)
    $iVar = _Iif($iVar < $iMin, $iMin, $iVar)
    $iVar = _Iif($iVar > $iMax, $iMax, $iVar)
EndFunc   ;==>SetInRange

Func Return_CLientRect($hWnd, $iX = -1, $iY = -1, $iWidth = -1, $iHeight = -1)


    $tRect = DllStructCreate($tagRECT)

    If $iX = -1 And $iY = -1 And $iWidth = -1 And $iHeight = -1 Then

        DllStructSetData($tRect, 1, _WinAPI_GetClientWidth($hWnd) + 2)
        DllStructSetData($tRect, 2, 2)
        DllStructSetData($tRect, 3, _WinAPI_GetWindowWidth($hWnd) - 2)
        DllStructSetData($tRect, 4, _WinAPI_GetClientHeight($hWnd))

    Else

        DllStructSetData($tRect, 1, $iX)
        DllStructSetData($tRect, 2, $iY)
        DllStructSetData($tRect, 3, $iX + $iWidth)
        DllStructSetData($tRect, 4, $iY + $iHeight)

    EndIf


    Return $tRect
EndFunc   ;==>Return_CLientRect

Func GetCurLineIndex($hEdit)
    $aSel = _GUICtrlEdit_GetSel($hEdit)
    If $aSel[0] = $aSel[1] Then
        Return _GUICtrlEdit_LineFromChar($hEdit)
    Else
        _GUICtrlEdit_SetSel($hEdit, -1, -1)
        $iRet = _GUICtrlEdit_LineFromChar($hEdit)
        _GUICtrlEdit_SetSel($hEdit, $aSel[0], $aSel[1])
        Return $iRet
    EndIf
EndFunc   ;==>GetCurLineIndex

;Thanks to Guinness - http://www.autoitscript.com/forum/topic/125684-guictrlgetbkcolor-get-the-background-color-of-a-control/
Func GUICtrlGetBkColor($hWnd, $iX = 0, $iY = 0) ;Modified - PXL
    If IsHWnd($hWnd) = 0 Then $hWnd = GUICtrlGetHandle($hWnd)
    Local $hDC = _WinAPI_GetDC($hWnd)
    Local $iColor = _WinAPI_GetPixel($hDC, $iX, $iY)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    Return $iColor
EndFunc   ;==>GUICtrlGetBkColor

;Thanks to UEZ - http://www.autoitscript.com/forum/topic/150160-solved-gdi-path-transform-rotate/#entry1072071
Func _PathRotate($hPath, $iAngle) ;Modified - PXL
    $aBounds = _GdiPLus_PathGetWorldBounds($hPath)
    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $aBounds[0] + $aBounds[2] / 2, $aBounds[1] + $aBounds[3] / 2)
    _GDIPlus_MatrixRotate($hMatrix, $iAngle)
    _GDIPlus_MatrixTranslate($hMatrix, -($aBounds[0] + $aBounds[2] / 2), -($aBounds[1] + $aBounds[3] / 2))
    _GDIPlus_PathTransform($hPath, $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)
EndFunc   ;==>_PathRotate

Func GetLineHeight($hEdit)
    ; Create DC
    $hDC = _WinAPI_GetDC($hEdit)
    $hFont = _SendMessage($hEdit, $WM_GETFONT) ; $WM_GetFont
    $hPrev_Font = _WinAPI_SelectObject($hDC, $hFont)

    Local $tSize = DllStructCreate("int;int")

    DllCall("gdi32.dll", "bool", "GetTextExtentPoint32W", "handle", $hDC, "wstr", "¤", "int", 1, "ptr", DllStructGetPtr($tSize))

    _WinAPI_SelectObject($hDC, $hPrev_Font)
    _WinAPI_ReleaseDC($hEdit, $hDC)

    Return DllStructGetData($tSize, 2)
EndFunc   ;==>GetLineHeight

Func MapWindowPoints($hWndFrom, $hWndTo, $lpPoints, $cPoints)

    $aRet = DllCall("user32.dll", "int", "MapWindowPoints", "hwnd", $hWndFrom, "hwnd", $hWndTo, "ptr", $lpPoints, "int", $cPoints)

    If @error Or $aRet[0] = 0 Then Return SetError(@error, 0, -1)
    Return $aRet[0]

EndFunc   ;==>MapWindowPoints

Test

#include <CScrollBar.au3> ;What ever name you give to the UDF

$hGui = GUICreate("Paths", 400, 400, -1, -1, $WS_SIZEBOX + $WS_MINIMIZEBOX)

Local $String
For $i = 1 To 50 ;No. of lines
    For $j = Random(33, 127, 1) To Random(33, 127, 1) ;No of chars in a line
        $String &= Chr($j)
    Next
    $String &= @CRLF
Next

GUICtrlCreateEdit($String, 5, 5, 200, 300, BitOR($ES_WANTRETURN, $ES_AUTOVSCROLL))
Startup_CustomScrollBar(GUICtrlGetHandle(-1))
GUISetState()


Do
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Shutdown_CustomScrollBar()
            Exit
    EndSwitch
Until 0

The CPU consumed upon moving the thumb is approx 12-18. So is it much enough to stop this project in Autoit. I just want some reviews and what users think about this script. The above is just implemented with Vertical Scrollbar.
Thanks for you time :)

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to post
Share on other sites

Hi,

Very nice example. The CPU overload is due to the Draw_ScrollBar function called multiple times for only one move (redrawing the scrollbar 20 times in less than one sec).

I see a possible improvement: shift the code that returns the same thing each time to the startup function and avoid the redraw if it's not necessary.

Br, FireFox.

Edited by FireFox

 

OS : Win XP SP2 (32 bits) / Win 7 SP1 (64 bits) / Win 8 (64 bits) | Autoit version: latest stable / beta.
Hardware : Intel(R) Core(TM) i5-2400 CPU @ 3.10Ghz / 8 GiB RAM DDR3.

My UDFs : Skype UDF | TrayIconEx UDF | GUI Panel UDF | Excel XML UDF | Is_Pressed_UDF

My Projects : YouTube Multi-downloader | FTP Easy-UP | Lock'n | WinKill | AVICapture | Skype TM | Tap Maker | ShellNew | Scriptner | Const Replacer | FT_Pocket | Chrome theme maker

My Examples : Capture toolIP Camera | Crosshair | Draw Captured Region | Picture Screensaver | Jscreenfix | Drivetemp | Picture viewer

My Snippets : Basic TCP | Systray_GetIconIndex | Intercept End task | Winpcap various | Advanced HotKeySet | Transparent Edit control

 

Link to post
Share on other sites

I see a possible improvement: shift the code that returns the same thing each time to the startup function and avoid the redraw if it's not necessary.

Tried many a times, but upon declaring the local variables( of function Draw_ScrollBar) to global, Autoit crashes on my computer. Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to post
Share on other sites

Here is a start :

#include <GDIP.au3> ;http://www.autoitscript.com/forum/topic/106021-gdipau3/
#include <WinAPIEx.au3>
#include <GuiConstantsEx.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <ScrollBarConstants.au3>
#include <Misc.au3>
#include <GUIEdit.au3>
#include <Array.au3>

Global $iWidth_VSCROLL = _WinAPI_GetSystemMetrics($SM_CXVSCROLL)
Global $hGraphic, $hGraphicGUI, $hBMPBuff

;Double-Click
Global $iDoubleClickTime = DllCall("user32.dll", "uint", "GetDoubleClickTime")
$iDoubleClickTime = $iDoubleClickTime[0]

;User-Custom Messages
Global $WM_UPDATETHUMB = $WM_APP + 11
Global $WM_THUMBMOVE = $WM_APP + 12
Global $WM_ARROWDOWN = $WM_APP + 13

Global Const $tagNCCALCSIZE_PARAMS = $tagRECT & ";" & $tagRECT & ";" & $tagRECT & ";ptr PWINDOWPOS"

; Register callback function and obtain handle to _New_WndProc
Global $___hNew_WndProc = DllCallbackRegister("_New_WndProc", "int", "hwnd;uint;wparam;lparam")
; Get pointer to _New_WndProc
Global $___pNew_WndProc = DllCallbackGetPtr($___hNew_WndProc)

Global $___cEdit ; Handle of the Edit
Global $___pOld_WndProc ; Old Window Procedure's Address

Global $_hPen = 0, $_hBrush = 0, $_hFormat = 0, $_hFamily = 0

_GDIPlus_Startup()

Func Startup_CustomScrollBar($hEdit)
    $___cEdit = $hEdit
    $___pOld_WndProc = _SubClass($hEdit, $___pNew_WndProc)

    _WinAPI_SetWindowPos($hEdit, Default, Default, Default, Default, Default, $SWP_FRAMECHANGED)

    $_hPen = _GDIPlus_PenCreate(0xAAFCD667, 2)
    $_hBrush = _GDIPlus_BrushCreateSolid(0xAAFCD667)

    $_hFormat = _GDIPlus_StringFormatCreate()
    $_hFamily = _GDIPlus_FontFamilyCreate("Wingdings")
EndFunc   ;==>Startup_CustomScrollBar

Func Shutdown_CustomScrollBar();Mem Release
    _SubClass($___cEdit, $___pOld_WndProc)

    DllCallbackFree($___hNew_WndProc)

    _GDIPlus_FontFamilyDispose($_hFamily)
    _GDIPlus_StringFormatDispose($_hFormat)

    _GDIPlus_BrushDispose($_hBrush)
    _GDIPlus_PenDispose($_hPen)
EndFunc   ;==>Shutdown_CustomScrollBar

Func TopBtn_Path(ByRef $hPath, $iX, $iY, $iSide)
    ;* Not required when the path is in order.

    _GDIPlus_PathStartFigure($hPath)
    _GDIPlus_PathAddLine($hPath, $iX + $iSide, $iY + $iSide, $iX + $iSide, $iY)
    _GDIPlus_PathAddLine($hPath, $iX + $iSide, $iY, $iX, $iY)
    _GDIPlus_PathAddLine($hPath, $iX, $iY, $iX, $iY + $iSide)
    _GDIPlus_PathAddArc($hPath, $iX, $iY + $iSide / 2, $iSide, $iSide, 180, 180)
    _GDIPlus_PathCloseFigure($hPath)
EndFunc   ;==>TopBtn_Path

Func ThumbBtn_Path(ByRef $hPath, $iX, $iY, $iHeight, $iSide)
    ;* Not required when the path is in order.

    _GDIPlus_PathStartFigure($hPath)
    _GDIPlus_PathAddLine($hPath, $iX, $iY, $iX, $iY + $iHeight)
    _GDIPlus_PathAddArc($hPath, $iX, $iY + $iHeight - $iSide / 2, $iSide, $iSide, 180, -180)
    _GDIPlus_PathAddLine($hPath, $iX + $iSide, $iY + $iHeight, $iX + $iSide, $iY)
    _GDIPlus_PathAddArc($hPath, $iX, $iY - $iSide / 2, $iSide, $iSide, -180, 180)
    _GDIPlus_PathCloseFigure($hPath)
EndFunc   ;==>ThumbBtn_Path

Func _SubClass($hWnd, $pNew_WindowProc)
    Local $iRes = _WinAPI_SetWindowLong($hWnd, -4, $pNew_WindowProc)
    If @error Then Return SetError(1, 0, 0)
    If $iRes = 0 Then Return SetError(1, 0, 0)

    Return SetError(0, 0, $iRes)
EndFunc   ;==>_SubClass

Func _New_WndProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
        Case $WM_SETCURSOR, $WM_NCMOUSEMOVE, $WM_MOUSEMOVE, $WM_MOUSELEAVE
            Return _WinAPI_CallWindowProc($___pOld_WndProc, $hWnd, $iMsg, $wParam, $lParam)
    EndSwitch

    Local Static $aRegion[3], $i_Thumb_Height = 0, $i_TrackHeight = 0, $iY_Thumb = 0, $iPixel_Per_Line_Scale = 1
    Local Static $hDC = 0, $hGfx = 0, $tPoint = DllStructCreate($tagPOINT), $blTop = False, $blBottom = False

    If $hDC = 0 Then
        $hDC = _WinAPI_GetWindowDC($hWnd)
        $hGfx = _GDIPlus_GraphicsCreateFromHDC($hDC)
    EndIf

    Switch $iMsg
        Case $WM_NCCALCSIZE
            Local $tNCCALCSIZE_PARAMS = DllStructCreate($tagNCCALCSIZE_PARAMS, $lParam)

            DllStructSetData($tNCCALCSIZE_PARAMS, 1, DllStructGetData($tNCCALCSIZE_PARAMS, 1) + 2)
            DllStructSetData($tNCCALCSIZE_PARAMS, 2, DllStructGetData($tNCCALCSIZE_PARAMS, 2) + 2)
            DllStructSetData($tNCCALCSIZE_PARAMS, 3, DllStructGetData($tNCCALCSIZE_PARAMS, 3) - 2 - $iWidth_VSCROLL) ;Space for VSCROLL Bar
            DllStructSetData($tNCCALCSIZE_PARAMS, 4, DllStructGetData($tNCCALCSIZE_PARAMS, 4) - 2)

            $tNCCALCSIZE_PARAMS = 0

            Return 0
        Case $WM_NCPAINT, $WM_NCACTIVATE
;~          $iRet = _WinAPI_CallWindowProc($___pOld_WndProc, $hWnd, $iMsg, $wParam, $lParam)

            $iX = _WinAPI_GetClientWidth($hWnd) + 2
            $iY = 2
            $iWidth = _WinAPI_GetWindowWidth($hWnd) - _WinAPI_GetClientWidth($hWnd) - 4
            $iHeight = _WinAPI_GetClientHeight($hWnd)

            Local $iY_Thumbtmp = $iY_Thumb

            ;Set the Range
            SetInRange($i_Thumb_Height, 15, $i_TrackHeight)
            SetInRange($iY_Thumbtmp, 0, $i_TrackHeight - $i_Thumb_Height)

            If Not $blTop And Not $blBottom _ ;not initialized
                    Or ($iY_Thumbtmp = $iY_Thumb _ ;in the range
                    And ($blTop And $iY_Thumbtmp > 0 Or Not $blTop) _ ;not already at the top
                    And ($blBottom And $iY_Thumbtmp < ($i_TrackHeight - $i_Thumb_Height) Or Not $blBottom)) Then ;not already at the bottom

                $iY_Thumbtmp = _Iif($iY_Thumbtmp < 0, 0, $iY_Thumbtmp)
                Draw_ScrollBar($hGfx, $iX, $iY, $iWidth, $iHeight, 0xFF000000 + GUICtrlGetBkColor($hWnd, $iX - 2, $iHeight), $aRegion, $iY_Thumbtmp, $i_Thumb_Height)
            EndIf

            $iY_Thumb = $iY_Thumbtmp

            If $iY_Thumb = 0 Then
                $blTop = True
                $blBottom = False
            ElseIf $iY_Thumb = $i_TrackHeight - $i_Thumb_Height Then
                $blBottom = True
                $blTop = False
            EndIf

;~          Return $iRet
        Case $WM_NCHITTEST
            DllStructSetData($tPoint, 1, _WinAPI_LoWord($lParam))
            DllStructSetData($tPoint, 2, _WinAPI_HiWord($lParam))

            _WinAPI_ScreenToClient($hWnd, $tPoint)

            $tRect = Return_CLientRect($hWnd)

            If _WinAPI_PtInRect($tRect, $tPoint) Then Return $HTBORDER
        Case $WM_NCLBUTTONDOWN
            Local $tPoint2 = _WinAPI_GetMousePos(True, $hWnd)

            If _GDIPlus_RegionIsVisiblePoint($aRegion[0], DllStructGetData($tPoint2, 1) - _WinAPI_GetClientWidth($hWnd) - 2, DllStructGetData($tPoint2, 2) - 2, $hGfx) Then
                _WinAPI_PostMessage($hWnd, $WM_ARROWDOWN, $SB_LINEUP, 0)
            ElseIf _GDIPlus_RegionIsVisiblePoint($aRegion[1], DllStructGetData($tPoint2, 1) - _WinAPI_GetClientWidth($hWnd) - 2, DllStructGetData($tPoint2, 2) - 2, $hGfx) Then
                _WinAPI_PostMessage($hWnd, $WM_ARROWDOWN, $SB_LINEDOWN, 1)
            ElseIf _GDIPlus_RegionIsVisiblePoint($aRegion[2], DllStructGetData($tPoint2, 1) - _WinAPI_GetClientWidth($hWnd) - 2, DllStructGetData($tPoint2, 2) - 2, $hGfx) Then
                _WinAPI_PostMessage($hWnd, $WM_THUMBMOVE, 0, 0)
            Else
                $tRect = Return_CLientRect($hWnd)

                If _WinAPI_PtInRect($tRect, $tPoint2) Then
                    $iY_Thumb = DllStructGetData($tPoint2, 2) - (($i_Thumb_Height / 2) + ($iWidth_VSCROLL - 2))
                    $iLine_Scroll = Floor(($iY_Thumb / $iPixel_Per_Line_Scale))
                    $iLine_Scroll_Count = $iLine_Scroll - _GUICtrlEdit_GetFirstVisibleLine($hWnd)

                    _SendMessage($hWnd, $EM_LINESCROLL, 0, $iLine_Scroll_Count)
                    _SendMessage($hWnd, $WM_NCPAINT, 0, 0)
                EndIf
            EndIf
        Case $WM_SIZING, $WM_SIZE, $WM_CHAR, $WM_UNDO, $EM_UNDO, $WM_HOTKEY
            _WinAPI_PostMessage($hWnd, $WM_UPDATETHUMB, 0, 0)
        Case $WM_KEYDOWN
            Switch $wParam
                Case $VK_DOWN, $VK_UP, $VK_PRIOR, $VK_NEXT ;Down
;~                  $iRet = _WinAPI_CallWindowProc($___pOld_WndProc, $hWnd, $iMsg, $wParam, $lParam)

                    _SendMessage($hWnd, $WM_UPDATETHUMB, 0, 0)

;~                  Return $iRet
                Case $VK_END, $VK_HOME
                    If _IsPressed("11") Then ;CTRL Pressed
                        _SendMessage($hWnd, $WM_VSCROLL, _WinAPI_MakeLong($SB_BOTTOM + $VK_END - $wParam, 0))

                        $iY_Thumb = _Iif($wParam = $VK_END, $i_TrackHeight - $i_Thumb_Height, 0)

                        ;Redraw the window, _WinAPI_RedrawWindow didn't work
                        _SendMessage($hWnd, $WM_NCPAINT, 0, 0)
                    EndIf
            EndSwitch
        Case $WM_MOUSEWHEEL
            $iDelta = _WinAPI_HiWord($wParam)
            $iCount = Abs($iDelta) / 120

            For $i = 1 To $iCount
                _SendMessage($hWnd, $WM_ARROWDOWN, _Iif($iDelta > 0, $SB_LINEUP, $SB_LINEDOWN), -$iDelta)
            Next
        Case $WM_UPDATETHUMB
            ;Calculate the required vars
            $i_LineCount = _GUICtrlEdit_GetLineCount($hWnd)
            $i_ScrollBarHeight = _WinAPI_GetClientHeight($hWnd)
            $i_LineHeight = GetLineHeight($hWnd)
            $iMax_LineVisible = Floor($i_ScrollBarHeight / $i_LineHeight)
            $i_PageHeight = $i_LineCount * $i_LineHeight
            $i_TrackHeight = $i_ScrollBarHeight - (2 * ($iWidth_VSCROLL - 2))
            $i_CurLine = _GUICtrlEdit_GetFirstVisibleLine($hWnd)

            ;Set the Thumb size
            $i_Thumb_Height = $i_TrackHeight * ($iMax_LineVisible * $i_LineHeight / $i_PageHeight)

            ;Set the Scale
            $iPixel_Per_Line_Scale = ($i_TrackHeight - $i_Thumb_Height) / ($i_LineCount - $iMax_LineVisible)

            ;Set the Thumb Pos
            $iY_Thumb = (($i_CurLine / ($i_LineCount - $iMax_LineVisible)) * ($i_TrackHeight - $i_Thumb_Height))

            ;Redraw the window, _Winapi_RedrawWindow didn't work
            _SendMessage($hWnd, $WM_NCPAINT, 0, 0)
        Case $WM_THUMBMOVE
            $iLine_InPage = _WinAPI_GetClientHeight($hWnd) / GetLineHeight($hWnd)
            $Y_Offset = _WinAPI_GetMousePosY(True, $hWnd) - $iY_Thumb
            $iY_Thumb_Prev = $iY_Thumb

            While _IsPressed("01")
                $Mouse_Y = _WinAPI_GetMousePosY(True, $hWnd)
                $iY_Thumb = $Mouse_Y - $Y_Offset

                $iLine_Scroll = Floor(($iY_Thumb / $iPixel_Per_Line_Scale))
                $iLine_Scroll_Count = $iLine_Scroll - _GUICtrlEdit_GetFirstVisibleLine($hWnd)
                _SendMessage($hWnd, $EM_LINESCROLL, 0, $iLine_Scroll_Count)
                _SendMessage($hWnd, $WM_NCPAINT, 0, 0)

                $iY_Thumb_Prev = $iY_Thumb

                Sleep(10)
            WEnd
        Case $WM_ARROWDOWN
            ;lParam = +ve : Down Arrow lParam = -ve : Up Arrow
            Local $iDirection = $wParam
            If $wParam = 0 Then $iDirection = _Iif($lParam > 0, $SB_LINEDOWN, $SB_LINEUP)
            _GUICtrlEdit_Scroll($hWnd, $iDirection)

            $iY_Thumb = _Iif($lParam > 0, $iY_Thumb + $iPixel_Per_Line_Scale, $iY_Thumb - $iPixel_Per_Line_Scale)

            _SendMessage($hWnd, $WM_NCPAINT, 0, 0)

            ;Continuous dragging
            Static $i_Start_Drag = False

            If _IsPressed("01") And $i_Start_Drag = False Then
                $iTimer = TimerInit()

                While _IsPressed("01")
                    If TimerDiff($iTimer) >= $iDoubleClickTime Then
                        $i_Start_Drag = True
                        ExitLoop
                    EndIf

                    Sleep(10)
                WEnd
            EndIf

            If _IsPressed("01") Then
                Sleep(15)
                _WinAPI_PostMessage($hWnd, $WM_ARROWDOWN, $wParam, $lParam)
            Else
                $i_Start_Drag = False
            EndIf
    EndSwitch

    ; Pass to the Original Window Procedure.
    Return _WinAPI_CallWindowProc($___pOld_WndProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_New_WndProc

Func Draw_ScrollBar($hGfx, $iX, $iY, $iWidth, $iHeight, $iBkColor, ByRef $aRegion, $iThumb_Y, $iThumb_Height)
    $hPath = _GDIPlus_PathCreate() ;Our Path

    $hFont = _GDIPlus_FontCreate($_hFamily, $iWidth_VSCROLL / 2 - 1, 2)

    ;Image Containing the Scroll Bar
    $hBmp = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
    $hGfx_Bmp = _GDIPlus_ImageGetGraphicsContext($hBmp)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx_Bmp, 2)
    _GDIPlus_GraphicsClear($hGfx_Bmp, $iBkColor) ;Set Bkcolor of the Bmp to that of the Edit

    #cs - Doesn't work as expected
        ;Invalidate and erase the part of the edit containing ScrollBar.
        $tRect = Return_CLientRect($hWnd, $iX, $iY, $iX + $iWidth, $iY + $iHeight)
        _WinAPI_RedrawWindow($hWnd, $tRect, 0, BitOR($RDW_INVALIDATE, $RDW_ERASE))
    #ce

    ;Top Button
    TopBtn_Path($hPath, 0, 1, $iWidth_VSCROLL - 2)
    $aRegion[0] = _GDIPlus_RegionCreateFromPath($hPath)
    _Gdiplus_GraphicsFillPath($hGfx_Bmp, $hPath) ;The Curve part

    _Gdiplus_PathReset($hPath)

    ;Bottom Button
    TopBtn_Path($hPath, 0, $iHeight - $iWidth_VSCROLL + 1, $iWidth_VSCROLL - 2)
    _PathRotate($hPath, 180)
    $aRegion[1] = _GDIPlus_RegionCreateFromPath($hPath)
    _Gdiplus_GraphicsFillPath($hGfx_Bmp, $hPath)

    _Gdiplus_PathReset($hPath)

    ;Thumb
    ThumbBtn_Path($hPath, 0, $iWidth_VSCROLL - 2 + $iThumb_Y, $iThumb_Height, $iWidth_VSCROLL - 2)
    $aRegion[2] = _GDIPlus_RegionCreateFromPath($hPath)
    _Gdiplus_GraphicsFillPath($hGfx_Bmp, $hPath)

    ;Draw something more
    $iSide = $iWidth / 2 - 2
    _GDIPlus_GraphicsDrawArc($hGfx_Bmp, $iWidth / 2 - $iSide, $iWidth_VSCROLL - 2 + $iThumb_Y + $iThumb_Height / 2 - $iSide, 2 * $iSide, 2 * $iSide, 51, 180, $_hPen)
    $iSide = $iWidth / 3 - 2
    _GDIPlus_GraphicsDrawArc($hGfx_Bmp, $iWidth / 2 - $iSide, $iWidth_VSCROLL - 2 + $iThumb_Y + $iThumb_Height / 2 - $iSide, 2 * $iSide, 2 * $iSide, 230, 110, $_hPen)

    ;Arrows
    $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGfx_Bmp, ChrW(217), $hFont, $tLayout, $_hFormat)
    _GDIPlus_GraphicsDrawStringEx($hGfx_Bmp, ChrW(217), $hFont, $aInfo[0], $_hFormat, $_hBrush) ;Up Arrow

    $tLayout = _GDIPlus_RectFCreate(0, $iHeight - ($iWidth_VSCROLL - 2) / 2, 0, 0)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGfx_Bmp, ChrW(218), $hFont, $tLayout, $_hFormat)
    _GDIPlus_GraphicsDrawStringEx($hGfx_Bmp, ChrW(218), $hFont, $aInfo[0], $_hFormat, $_hBrush) ;Down Arrow

    ;Draw the image on the GUI
    _GDIPlus_GraphicsDrawImage($hGfx, $hBmp, $iX, $iY)

    ;Mem Release
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_FontDispose($hFont)

    _GDIPlus_GraphicsDispose($hGfx_Bmp)
    _GDIPlus_ImageDispose($hBmp)

    Return 1
EndFunc   ;==>Draw_ScrollBar

Func SetInRange(ByRef $iVar, $iMin, $iMax)
    $iVar = _Iif($iVar < $iMin, $iMin, $iVar)
    $iVar = _Iif($iVar > $iMax, $iMax, $iVar)
EndFunc   ;==>SetInRange

Func Return_CLientRect($hWnd, $iX = -1, $iY = -1, $iWidth = -1, $iHeight = -1)
    $tRect = DllStructCreate($tagRECT)

    If $iX = -1 And $iY = -1 And $iWidth = -1 And $iHeight = -1 Then
        DllStructSetData($tRect, 1, _WinAPI_GetClientWidth($hWnd) + 2)
        DllStructSetData($tRect, 2, 2)
        DllStructSetData($tRect, 3, _WinAPI_GetWindowWidth($hWnd) - 2)
        DllStructSetData($tRect, 4, _WinAPI_GetClientHeight($hWnd))
    Else
        DllStructSetData($tRect, 1, $iX)
        DllStructSetData($tRect, 2, $iY)
        DllStructSetData($tRect, 3, $iX + $iWidth)
        DllStructSetData($tRect, 4, $iY + $iHeight)
    EndIf

    Return $tRect
EndFunc   ;==>Return_CLientRect

Func GetCurLineIndex($hEdit)
    $aSel = _GUICtrlEdit_GetSel($hEdit)
    If $aSel[0] = $aSel[1] Then
        Return _GUICtrlEdit_LineFromChar($hEdit)
    Else
        _GUICtrlEdit_SetSel($hEdit, -1, -1)
        $iRet = _GUICtrlEdit_LineFromChar($hEdit)
        _GUICtrlEdit_SetSel($hEdit, $aSel[0], $aSel[1])
        Return $iRet
    EndIf
EndFunc   ;==>GetCurLineIndex

;Thanks to Guinness - http://www.autoitscript.com/forum/topic/125684-guictrlgetbkcolor-get-the-background-color-of-a-control/
Func GUICtrlGetBkColor($hWnd, $iX = 0, $iY = 0) ;Modified - PXL
    If IsHWnd($hWnd) = 0 Then $hWnd = GUICtrlGetHandle($hWnd)
    Local $hDC = _WinAPI_GetDC($hWnd)
    Local $iColor = _WinAPI_GetPixel($hDC, $iX, $iY)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    Return $iColor
EndFunc   ;==>GUICtrlGetBkColor

;Thanks to UEZ - http://www.autoitscript.com/forum/topic/150160-solved-gdi-path-transform-rotate/#entry1072071
Func _PathRotate($hPath, $iAngle) ;Modified - PXL
    $aBounds = _GdiPLus_PathGetWorldBounds($hPath)
    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $aBounds[0] + $aBounds[2] / 2, $aBounds[1] + $aBounds[3] / 2)
    _GDIPlus_MatrixRotate($hMatrix, $iAngle)
    _GDIPlus_MatrixTranslate($hMatrix, -($aBounds[0] + $aBounds[2] / 2), -($aBounds[1] + $aBounds[3] / 2))
    _GDIPlus_PathTransform($hPath, $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)
EndFunc   ;==>_PathRotate

Func GetLineHeight($hEdit)
    ; Create DC
    $hDC = _WinAPI_GetDC($hEdit)
    $_hFont = _SendMessage($hEdit, $WM_GETFONT) ; $WM_GetFont
    $hPrev_Font = _WinAPI_SelectObject($hDC, $_hFont)

    Local $tSize = DllStructCreate("int;int")

    DllCall("gdi32.dll", "bool", "GetTextExtentPoint32W", "handle", $hDC, "wstr", "¤", "int", 1, "ptr", DllStructGetPtr($tSize))

    _WinAPI_SelectObject($hDC, $hPrev_Font)
    _WinAPI_ReleaseDC($hEdit, $hDC)

    Return DllStructGetData($tSize, 2)
EndFunc   ;==>GetLineHeight

I don't know why the scrollbar is not visible on the start up, however the idea is here.

Draw the scrollbar only if there is a move, this can be much improved.

Br, FireFox.

 

OS : Win XP SP2 (32 bits) / Win 7 SP1 (64 bits) / Win 8 (64 bits) | Autoit version: latest stable / beta.
Hardware : Intel(R) Core(TM) i5-2400 CPU @ 3.10Ghz / 8 GiB RAM DDR3.

My UDFs : Skype UDF | TrayIconEx UDF | GUI Panel UDF | Excel XML UDF | Is_Pressed_UDF

My Projects : YouTube Multi-downloader | FTP Easy-UP | Lock'n | WinKill | AVICapture | Skype TM | Tap Maker | ShellNew | Scriptner | Const Replacer | FT_Pocket | Chrome theme maker

My Examples : Capture toolIP Camera | Crosshair | Draw Captured Region | Picture Screensaver | Jscreenfix | Drivetemp | Picture viewer

My Snippets : Basic TCP | Systray_GetIconIndex | Intercept End task | Winpcap various | Advanced HotKeySet | Transparent Edit control

 

Link to post
Share on other sites
:blink:

 

OS : Win XP SP2 (32 bits) / Win 7 SP1 (64 bits) / Win 8 (64 bits) | Autoit version: latest stable / beta.
Hardware : Intel(R) Core(TM) i5-2400 CPU @ 3.10Ghz / 8 GiB RAM DDR3.

My UDFs : Skype UDF | TrayIconEx UDF | GUI Panel UDF | Excel XML UDF | Is_Pressed_UDF

My Projects : YouTube Multi-downloader | FTP Easy-UP | Lock'n | WinKill | AVICapture | Skype TM | Tap Maker | ShellNew | Scriptner | Const Replacer | FT_Pocket | Chrome theme maker

My Examples : Capture toolIP Camera | Crosshair | Draw Captured Region | Picture Screensaver | Jscreenfix | Drivetemp | Picture viewer

My Snippets : Basic TCP | Systray_GetIconIndex | Intercept End task | Winpcap various | Advanced HotKeySet | Transparent Edit control

 

Link to post
Share on other sites

tony, this topic has no relation with marquee

I guess it would be better if we would just draw the required part that is if the user clicks the thumb, the thumb is only updated rather than the whole bitmap.

The graphics object could be updated in every resize message. Lets find out where it goes

Thanks for the suggestion firefox.

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to post
Share on other sites
  • 2 weeks later...

Updated the example with a PIC control.

Increased the sleep in the ThumbMove,

made the local constants as global variables

CPU usage is reduced by 25%

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By UEZ
      I wrote a dll and the wrapper to convert non-animated WebP images to a GDI/GDI+ format / encode any GDI+ supported image to WebP format for use in Autoit.
      What is WebP?
      You can find more information about WebP and WebP tools / source codes here: https://developers.google.com/speed/webp
      Maybe useful for one or the other... 🙂
      WebP.au3:
      ;Version 0.3.0 build 2022-05-07 beta #include-once #include <GDIPlus.au3> Enum $WEBP_PRESET_DEFAULT = 0, _ ; default preset. $WEBP_PRESET_PICTURE, _ ; digital picture, like portrait, inner shot $WEBP_PRESET_PHOTO, _ ; outdoor photograph, with natural lighting $WEBP_PRESET_DRAWING, _ ; hand or line drawing, with high-contrast details $WEBP_PRESET_ICON, _ ; small-sized colorful images $WEBP_PRESET_TEXT ; text-like ; #FUNCTION# ==================================================================================================================== ; Name ..........: WebP_Ver ; Description ...: Displays the DLL version information ; Syntax ........: WebP_Ver([$sPath2DLL = ""]) ; Parameters ....: $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir ; Return values .: None ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func WebP_Ver($sPath2DLL = "") Local $sDLL = Path2DLL($sPath2DLL) If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found DllCall($sDLL, "none", "WebP_DLL_Version") Return True EndFunc ;==>WebP_Ver ; #FUNCTION# ==================================================================================================================== ; Name ..........: WebP_BitmapGetInfo ; Description ...: Gets some rudimentary information about the WebP image ; Syntax ........: WebP_BitmapGetInfo($sFilename[, $sPath2DLL = ""]) ; Parameters ....: $sFilename - file to load ; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir ; Return values .: Struct ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: https://developers.google.com/speed/webp ; Example .......: No ; =============================================================================================================================== Func WebP_BitmapGetInfo($sFilename, $sPath2DLL = "") Local $sDLL = Path2DLL($sPath2DLL) If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found If Not FileExists($sFilename) Then Return SetError(2, 0, 0) ;file not found Local $iFileSize = FileGetSize($sFilename), $nBytes Local $tBuffer = DllStructCreate("struct;byte bin[" & $iFileSize & "];endstruct") Local Const $hFile = _WinAPI_CreateFile($sFilename, 2, 2) _WinAPI_ReadFile($hFile, $tBuffer, $iFileSize, $nBytes) _WinAPI_CloseHandle($hFile) If Int(BinaryMid($tBuffer.bin, 1, 4)) <> 1179011410 Or Int(BinaryMid($tBuffer.bin, 9, 6)) <> 88331643929943 Then Return SetError(3, 0, 0) ;header must contain RIFF and WEBPVP Local $tWebPBitstreamFeatures = DllStructCreate("struct;long width; long height; long has_alpha; long has_animation; long format; ulong pad[5];endstruct") Local $iReturn = DllCall($sDLL, "long", "WebP_BitmapGetInfo", "struct*", $tBuffer, "uint", $iFileSize, "struct*", $tWebPBitstreamFeatures) If $iReturn = 0 Then Return SetError(4, 0, 0) Return $tWebPBitstreamFeatures EndFunc ;==>WebP_BitmapGetInfo ; #FUNCTION# ==================================================================================================================== ; Name ..........: WebP_BitmapCreateGDIp ; Description ...: Converts (decodes) a WebP image from disk to a GDI / GDI+ bitmap handle ; Syntax ........: WebP_BitmasFilename[, $bGDIImage = False[, $sPath2DLL = ""]]) ; Parameters ....: $sFilename - file to load ; $bGDIImage - [optional] a boolean value. Default is False (GDIPlus bitmap handle). If True then output is GDI bitmap handle ; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir ; Return values .: GDI / GDIPlus bitmap handle ; Author ........: UEZ ; Modified ......: ; Remarks .......: Currently only WebP images are supported - no animated WebP images yet! ; Related .......: ; Link ..........: https://developers.google.com/speed/webp ; Example .......: No ; =============================================================================================================================== Func WebP_BitmapCreateGDIp($sFilename, $bGDIImage = False, $sPath2DLL = "") Local $sDLL = Path2DLL($sPath2DLL) If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found If Not FileExists($sFilename) Then Return SetError(2, 0, 0) ;file not found Local $iFileSize = FileGetSize($sFilename), $nBytes Local $tBuffer = DllStructCreate("byte bin[" & $iFileSize & "]") Local Const $hFile = _WinAPI_CreateFile($sFilename, 2, 2) _WinAPI_ReadFile($hFile, $tBuffer, $iFileSize, $nBytes) _WinAPI_CloseHandle($hFile) If Int(BinaryMid($tBuffer.bin, 1, 4)) <> 1179011410 Or Int(BinaryMid($tBuffer.bin, 9, 6)) <> 88331643929943 Then Return SetError(3, 0, 0) ;header must contain RIFF and WEBPVP Local Const $hBitmap = DllCall($sDLL, "ptr", "WebP_BitmapCreateGDIp", "struct*", $tBuffer, "uint", $iFileSize, "boolean", $bGDIImage)[0] If $hBitmap = 0 Then Return SetError(4, 0, 0) Return $hBitmap EndFunc ;==>WebP_BitmapCreateGDIp ; #FUNCTION# ==================================================================================================================== ; Name ..........: WebP_BitmapCreateGDIpFromMem ; Description ...: Converts (decodes) a WebP image from memory to a GDI / GDI+ bitmap handle ; Syntax ........: WebP_BitmapCreateGDIpFromMem($tBuffer[, $iBufferSize = 0[, $bGDIImage = False[, $sPath2DLL = ""]]]) ; Parameters ....: $tBuffer - a dll struct with WebP binary data as content or pointer to the memory data ; $iBufferSize - the size of the binary data (file size) ; $bGDIImage - [optional] a boolean value. Default is False (GDIPlus bitmap handle). If True then output is GDI bitmap handle ; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir ; Return values .: GDI / GDIPlus bitmap handle ; Author ........: UEZ ; Modified ......: ; Remarks .......: Currently only WebP images are supported - no animated WebP images yet! ; Related .......: ; Link ..........: https://developers.google.com/speed/webp ; Example .......: No ; =============================================================================================================================== Func WebP_BitmapCreateGDIpFromMem($tBuffer, $iBufferSize = 0, $bGDIImage = False, $sPath2DLL = "") Local $sDLL = Path2DLL($sPath2DLL) If Not FileExists($sDLL) Then Return SetError(1, 0, 0) ;DLL not found If $iBufferSize = 0 Then Return SetError(2, 0, 0) Local $binMem If IsPtr($tBuffer) Then Local $tMem = DllStructCreate("byte bin[" & $iBufferSize & "]", $tBuffer) $binMem = $tMem.bin Else $binMem = DllStructGetData($tBuffer, 1) EndIf If Int(BinaryMid($binMem, 1, 4)) <> 1179011410 Or Int(BinaryMid($binMem, 9, 6)) <> 88331643929943 Then Return SetError(3, 0, 0) ;header must contain RIFF and WEBPVP Local Const $hBitmap = DllCall($sDLL, "ptr", "WebP_BitmapCreateGDIp", "struct*", $tBuffer, "uint", $iBufferSize, "bool", $bGDIImage)[0] If $hBitmap = 0 Then Return SetError(4, 0, 0) Return $hBitmap EndFunc ;==>WebP_BitmapCreateGDIpFromMem ; #FUNCTION# ==================================================================================================================== ; Name ..........: WebP_CreateWebPLossySimpleFromBitmap ; Description ...: Converts a bitmap to WebP lossy image and save it to HD ; Syntax ........: WebP_CreateWebPLossySimpleFromBitmap($sFilename, $hBitmap[, $iQuality = 75[, $sPath2DLL = ""]]) ; Parameters ....: $sFilename - file to load ; $hBitmap - GDIPlus bitmap handle ; $iQuality - [optional] an integer value. Default is 75. Valid range is 0 - 100. ; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir. ; Return values .: 0 for failure, 1 for success. ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: https://developers.google.com/speed/webp ; Example .......: No ; =============================================================================================================================== Func WebP_CreateWebPLossySimpleFromBitmap($sFilename, $hBitmap, $iQuality = 75, $sPath2DLL = "") If $sFilename = "" Then Return SetError(1, 0, 0) Local $sDLL = Path2DLL($sPath2DLL) If Not FileExists($sDLL) Then Return SetError(2, 0, 0) ;DLL not found Local $iReturn = DllCall($sDLL, "long", "WebP_CreateWebPLossySimpleFromBitmap", "str", $sFilename, "ptr", $hBitmap, "float", $iQuality)[0] If $iReturn = 0 Then Return SetError(3, 0, 0) Return 1 EndFunc ;==>WebP_CreateWebPLossySimpleFromBitmap ; #FUNCTION# ==================================================================================================================== ; Name ..........: WebP_CreateWebPLosslessSimpleFromBitmap ; Description ...: Converts a bitmap to WebP lossless image and save it to HD ; Syntax ........: WebP_CreateWebPLosslessSimpleFromBitmap($sFilename, $hBitmap[, $sPath2DLL = ""]) ; Parameters ....: $sFilename - file to load ; $hBitmap - GDIPlus bitmap handle ; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir. ; Return values .: 0 for failure, 1 for success. ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: https://developers.google.com/speed/webp ; Example .......: No ; =============================================================================================================================== Func WebP_CreateWebPLosslessSimpleFromBitmap($sFilename, $hBitmap, $sPath2DLL = "") If $sFilename = "" Then Return SetError(1, 0, 0) Local $sDLL = Path2DLL($sPath2DLL) If Not FileExists($sDLL) Then Return SetError(2, 0, 0) ;DLL not found Local $iReturn = DllCall($sDLL, "long", "WebP_CreateWebPLosslessSimpleFromBitmap", "str", $sFilename, "ptr", $hBitmap)[0] If $iReturn = 0 Then Return SetError(3, 0, 0) Return 1 EndFunc ;==>WebP_CreateWebPLosslessSimpleFromBitmap ; #FUNCTION# ==================================================================================================================== ; Name ..........: WebP_CreateWebPAdvancedFromBitmap ; Description ...: Converts a bitmap to WebP lossy / lossless image and save it to HD ; Syntax ........: WebP_CreateWebPAdvancedFromBitmap($sFilename, $hBitmap[, $WebPPreset = $WEBP_PRESET_DEFAULT[, $lossless = 0[, ; $quality = 75.0[, $method = 4[, $sns_strength = 50[, $filter_sharpness = 0[, $filter_strength = 60[, ; $pass = 1[, $level = 6[, $sPath2DLL = ""]]]]]]]]]]) ; Parameters ....: $sFilename - file to load ; $hBitmap - GDIPlus bitmap handle ; $WebPPreset - [optional] an unknown value. Default is $WEBP_PRESET_DEFAULT. ; $lossless - [optional] an unknown value. Default is 0. 0 for lossy encoding / 1 for lossless.. ; $quality - [optional] an unknown value. Default is 75.0. Valid range is 0 - 100. ; $method - [optional] a map. Default is 4. Valid range is 0 - 6 (0=fast, 6=slower-better). ; $sns_strength - [optional] a string value. Default is 50. Spatial Noise Shaping. 0=off, 100=maximum ; $filter_sharpness - [optional] a floating point value. Default is 0. Range: [0 = off .. 7 = least sharp] ; $filter_strength - [optional] a floating point value. Default is 60. Range: [0 = off .. 100 = strongest] ; $pass - [optional] a pointer value. Default is 1. Number of entropy-analysis passes (in [1..10]). ; $level - [optional] an unknown value. Default is 6. Between 0 (fastest, lowest compression) and 9 (slower, best compression) only valid for lossless = 1! ; $near_lossless - [optional] an unknown value. Default is 100. Near lossless encoding [0 = max loss .. 100 = off (default)]. ; $alpha_compression - [optional] an unknown value. Default is 1. Algorithm for encoding the alpha plane (0 = none,1 = compressed with WebP lossless). Default is 1. ; $alpha_filtering - [optional] an unknown value. Default is 1. Predictive filtering method for alpha plane.0: none, 1: fast, 2: best. Default if 1. ; $alpha_quality - [optional] an unknown value. Default is 100. Between 0 (smallest size) and 100 (lossless). Default is 100. ; $target_size - [optional] an unknown value. Default is 0. If non-zero, set the desired target size in bytes. ; $NoSave - [optional] an unknown value. Default is False. ; $pMem - [optional] a string value. Default is Null. If $NoSave = True then the pointer to the memory which holds the data will be returned. ; $sPath2DLL - [optional] a string value. Default is "". Path to WebP dll if not in script dir. ; Return values .: negative value for failure, 1 for success or the struct with information (pointers, size) if $NoSave = True ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: https://developers.google.com/speed/webp ; Example .......: No ; =============================================================================================================================== Func WebP_CreateWebPAdvancedFromBitmap($sFilename, $hBitmap, $WebPPreset = $WEBP_PRESET_DEFAULT, $lossless = 0, $quality = 75.0, $method = 4, $sns_strength = 50, _ $filter_sharpness = 0, $filter_strength = 60, $pass = 1, $level = 6, $near_lossless = 100, $alpha_compression = 1, $alpha_filtering = 1, $alpha_quality = 100, _ $target_size = 0, $NoSave = False, $sPath2DLL = "") If $sFilename = "" And Not $NoSave Then Return SetError(1, 0, 0) Local $sDLL = Path2DLL($sPath2DLL) If Not FileExists($sDLL) Then Return SetError(2, 0, 0) ;DLL not found Local $tMem = DllStructCreate("struct;ptr pPic; ptr pWriter; ptr pMemData; uint memsize;endstruct") Local $iReturn = DllCall($sDLL, "long", "WebP_CreateWebPAdvancedFromBitmap", _ "str", $sFilename, _ ;Webp filename "ptr", $hBitmap, _ ;handle to GDI+ bitmap "long", $WebPPreset, _ ;WebPPreset "long", $lossless, _ ;lossless "float", $quality, _ ;quality "long", $method, _ ;method "long", $sns_strength, _ ;sns_strength "long", $filter_sharpness, _ ;filter_sharpness "long", $filter_strength, _ ;filter_strength "long", $pass, _ ;pass "long", $level, _ ;level "long", $near_lossless, _ ;near_lossless "long", $alpha_compression, _ ;alpha_compression "long", $alpha_filtering, _ ;alpha_filtering "long", $alpha_quality, _ ;alpha_quality "long", $target_size, _ ;target_size "bool", $NoSave, _ ; "struct*", $tMem)[0] If $iReturn < 0 Then Return SetError(3, 0, $iReturn) If $NoSave And $tMem.memsize = 0 Then SetError(4, 0, 0) Return $NoSave ? $tMem : $iReturn EndFunc ;==>WebP_CreateWebPAdvancedFromBitmap Func WebP_FreeUp(ByRef $tMem, $sPath2DLL = "") Local $sDLL = Path2DLL($sPath2DLL) If Not FileExists($sDLL) Then Return SetError(2, 0, 0) ;DLL not found Local $iReturn = DllCall($sDLL, "long", "WebP_FreeUp", "struct*", $tMem)[0] Return $iReturn EndFunc ; #INTERNAL_USE_ONLY#============================================================================================================ ; Name...........: Path2DLL ; Description ...: Return the path to the _WebP_x??.dll ; Author ........: UEZ ; Modified.......: ; Remarks .......: This function is used internally by WebP.au3 ; =============================================================================================================================== Func Path2DLL($sPath2DLL = "") Return $sPath2DLL ? $sPath2DLL : @ScriptDir & (@AutoItX64 ? "\_WebP_x64.dll" : "\_WebP_x86.dll") EndFunc ;==>Path2DLL  
      WebP Advanced Encoder GUI:

      ;Coded by UEZ build 2022-05-15 #AutoIt3Wrapper_UseX64=y #AutoIt3Wrapper_Res_HiDpi=y #AutoIt3Wrapper_Version=p #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe ;/rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #include <Array.au3> #include <ComboConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <GuiStatusBar.au3> #include <SliderConstants.au3> #include <StaticConstants.au3> #include <WinAPISysWin.au3> #include <WindowsConstants.au3> #include "WebP.au3" _GDIPlus_Startup() #Region GUI Global Const $SC_DRAGMOVE = 0xF012 Global Const $hGUI = GUICreate("WAE GUI v0.80 Beta", 322, 615, @DesktopWidth - 330, -1, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_APPWINDOW)) GUISetFont(10, 400, 0, "Arial Narrow") Global Const $Title = GUICtrlCreateLabel("WebP Advanced Encoder GUI", 5, 8, 310, 41) GUICtrlSetFont(-1, 21, 400, 0, "Arial Narrow") Global Const $icLoad = GUICtrlCreateIcon(@SystemDir & "\shell32.dll", -127, 8, 60, 32, 32, BitOR($GUI_SS_DEFAULT_ICON, $WS_BORDER)) GUICtrlSetTip(-1, "Load a GDI+ supported image") Global Const $icSave = GUICtrlCreateIcon(@SystemDir & "\shell32.dll", -259, 56, 60, 32, 32, BitOR($GUI_SS_DEFAULT_ICON, $WS_BORDER)) GUICtrlSetTip(-1, "Save compressed image in WebP format.") GUICtrlCreateLabel("", 0, 106, 324, 2, $SS_ETCHEDHORZ) Global Const $lbPresets = GUICtrlCreateLabel("Presets", 10, 125, 39, 20) Global Const $cbPreset = GUICtrlCreateCombo("Default", 120, 120, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL)) GUICtrlSetData(-1, "Picture|Photo|Graph|Text") Global Const $chkbLossless = GUICtrlCreateCheckbox("Lossless", 120, 152, 97, 17) GUICtrlSetTip(-1, "Enable lossless compression. Default: lossy.") Global Const $lbEncoding = GUICtrlCreateLabel("Encoding", 10, 152, 48, 20) Global Const $lbQuality = GUICtrlCreateLabel("Quality", 10, 176, 36, 20) Global Const $slQuality = GUICtrlCreateSlider(116, 176, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, 75) GUICtrlSetTip(-1, "Between 0 and 100. 0 gives the smallest size and 100 the largest.") Global Const $ipQuality = GUICtrlCreateInput("", 274, 172, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slQuality)) Global Const $lbMethod = GUICtrlCreateLabel("Method", 10, 210, 39, 20) Global Const $slMethod = GUICtrlCreateSlider(116, 210, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 6, 0) GUICtrlSetData(-1, 4) GUICtrlSetTip(-1, "Quality/speed trade-off (0=fast, 6=slower-better.") Global Const $ipMethod = GUICtrlCreateInput("", 274, 206, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slMethod)) Global Const $lbSNS_Strength = GUICtrlCreateLabel("SNS-Strength", 10, 242, 66, 20) Global Const $slSNS_Strength = GUICtrlCreateSlider(116, 244, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, 50) GUICtrlSetTip(-1, "Spatial Noise Shaping. 0=off, 100=maximum.") Global Const $ipSSN = GUICtrlCreateInput("", 274, 240, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slSNS_Strength)) Global Const $lbFilterSharpness = GUICtrlCreateLabel("Filter Sharpness", 10, 274, 81, 20) Global Const $slFilter_Sharpness = GUICtrlCreateSlider(116, 278, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 7, 0) GUICtrlSetTip(-1, "Range: [0 = off .. 7 = least sharp].") Global Const $ipFilter_Sharpness = GUICtrlCreateInput("", 274, 274, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slFilter_Sharpness)) Global Const $lbFilter_Strength = GUICtrlCreateLabel("Filter Strenght", 010, 304, 69, 20) Global Const $slFilter_Strength = GUICtrlCreateSlider(116, 312, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, 60) GUICtrlSetTip(-1, "Range: [0 = off .. 100 = strongest]") Global Const $ipFilter_Strength = GUICtrlCreateInput("", 274, 308, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slFilter_Strength)) Global Const $lbPass = GUICtrlCreateLabel("Pass", 10, 344, 27, 20) Global Const $slPass = GUICtrlCreateSlider(116, 346, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 10, 1) GUICtrlSetData(-1, 6) GUICtrlSetTip(-1, "Number of entropy-analysis passes (in [1..10]).") Global Const $ipPass = GUICtrlCreateInput("", 274, 342, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slPass)) Global Const $lbLevel = GUICtrlCreateLabel("Level", 10, 377, 30, 20) Global Const $slLevel = GUICtrlCreateSlider(116, 380, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 9, 0) GUICtrlSetData(-1, 6) GUICtrlSetTip(-1, "Switch on lossless compression mode with the specified level between 0 and 9, with level 0 being the fastest, 9 being the slowest.") Global Const $ipLevel = GUICtrlCreateInput("", 274, 376, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slLevel)) Global Const $lbAlpha_Compression = GUICtrlCreateLabel("Alpha Compression", 10, 410, 96, 20) Global Const $chkbAlpha_Compression = GUICtrlCreateCheckbox("Enable", 120, 410, 97, 17) GUICtrlSetState(-1, $GUI_CHECKED) Global Const $lbAlpha_Filtering = GUICtrlCreateLabel("Alpha Filtering", 10, 444, 71, 20) Global Const $slAlpha_Filtering = GUICtrlCreateSlider(114, 448, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 2, 0) GUICtrlSetData(-1, 1) GUICtrlSetTip(-1, "Predictive filtering method for alpha plane. 0: none, 1: fast, 2: best. Default if 1.") Global Const $ipAlpha_Filtering = GUICtrlCreateInput("", 274, 444, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slAlpha_Filtering)) Global Const $lbAlpha_Quality = GUICtrlCreateLabel("Alpha Quality", 8, 482, 66, 20) Global Const $slAlpha_Quality = GUICtrlCreateSlider(114, 482, 158, 21, BitOR($GUI_SS_DEFAULT_SLIDER, $TBS_ENABLESELRANGE)) GUICtrlSetLimit(-1, 100, 0) GUICtrlSetData(-1, 100) GUICtrlSetTip(-1, "Between 0 (smallest size) and 100 (lossless).") Global Const $ipAlpha_Quality = GUICtrlCreateInput("", 274, 478, 28, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY)) GUICtrlSetData(-1, GUICtrlRead($slAlpha_Quality)) Global Const $lbTarget_Size = GUICtrlCreateLabel("Target Size", 10, 518, 58, 20) Global Const $ipTarget_Size = GUICtrlCreateInput("0", 120, 516, 121, 24, $ES_NUMBER) GUICtrlSetTip(-1, "If non-zero, set the desired target size in bytes (lossy mode only!).") Global Const $btnShow = GUICtrlCreateButton("Show Original Image", 10, 552, 123, 25) GUICtrlSetTip(-1, "Press lmb and hold it to display original image.") Global Const $btnApply = GUICtrlCreateButton("Apply Settings", 188, 552, 123, 25) Global Const $StatusBar = _GUICtrlStatusBar_Create($hGUI) _GUICtrlStatusBar_SetText($StatusBar, "Welcome to 'WebP Advanced Encoder GUI' ٩(●̮̮̃•̃)۶") Global Const $hGUI_Image = GUICreate("", 0, 0, -1, -1, $WS_EX_TOOLWINDOW, $WS_EX_APPWINDOW, $hGUI) Global Const $iPic_WebP = GUICtrlCreatePic("", 0, 0, 0, 0) Global Const $dw = _WinAPI_GetSystemMetrics($SM_CXDLGFRAME), $dh = _WinAPI_GetSystemMetrics($SM_CYDLGFRAME) + _WinAPI_GetSystemMetrics($SM_CYSIZE) + 1 GUISetState(@SW_SHOW, $hGUI) GUISetState(@SW_HIDE, $hGUI_Image) Global Const $iDummy_Load = GUICtrlCreateDummy() Global $sFile, $hImage, $hImage_GDI, $hHBitmap, $pMemData, $pMemData_Size, $tMem, $mp, $sFileSave, $hFile, $nBytes, $nBytes GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES") GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN") #EndRegion GUI While 1 $mp = GUIGetCursorInfo($hGUI) If $hImage And $mp[2] And $mp[4] = $btnShow Then _WinAPI_DeleteObject(GUICtrlSendMsg($iPic_WebP, $STM_SETIMAGE, $IMAGE_BITMAP, $hImage_GDI)) While $mp[2] $mp = GUIGetCursorInfo($hGUI) Sleep(10) WEnd _WinAPI_DeleteObject(GUICtrlSendMsg($iPic_WebP, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap)) EndIf $aGUIGetMsg = GUIGetMsg(1) Switch $aGUIGetMsg[1] Case $hGUI Switch $aGUIGetMsg[0] Case $GUI_EVENT_CLOSE If IsDllStruct($tMem) Then WebP_FreeUp($tMem) If $hImage Then _GDIPlus_ImageDispose($hImage) If $hHBitmap Then _WinAPI_DeleteObject($hHBitmap) If $hImage_GDI Then _WinAPI_DeleteObject($hImage_GDI) If $hGUI_Image Then GUIDelete($hGUI_Image) _GDIPlus_Shutdown() GUIDelete($hGUI_Image) GUIDelete($hGUI) Exit Case $btnApply If $hImage Then CompressAndDisplay($hImage) Case $icLoad $sFile = FileOpenDialog("Select an image to compress", "", "Images (*.jpg;*.bmp;*.png;*.gif;*.tif;*webp)") If @error Then ContinueLoop LoadImage($sFile) Case $iDummy_Load LoadImage($sFile) Case $icSave If $hImage Then $sFileSave = FileSaveDialog("Save WebP Image", "", "WebP Image (*.webp)", BitOR($FD_PATHMUSTEXIST, $FD_PROMPTOVERWRITE), "", $hGUI) If @error Then ContinueLoop $hFile = _WinAPI_CreateFile($sFileSave, 1) $iResult = _WinAPI_WriteFile($hFile, $tMem.pMemData, $tMem.memsize, $nBytes) _WinAPI_CloseHandle($hFile) If Not $iResult Then MsgBox($MB_ICONERROR, "ERROR", "Unable to save WebP image to disk!", 30, $hGUI) Else MsgBox($MB_ICONINFORMATION, "Information", "WebP image successfully save to disk", 10, $hGUI) EndIf EndIf Case $slAlpha_Filtering GUICtrlSetData($ipAlpha_Filtering, GUICtrlRead($slAlpha_Filtering)) Case $slAlpha_Quality GUICtrlSetData($ipAlpha_Quality, GUICtrlRead($slAlpha_Quality)) Case $slFilter_Sharpness GUICtrlSetData($ipFilter_Sharpness, GUICtrlRead($slFilter_Sharpness)) Case $slFilter_Strength GUICtrlSetData($ipFilter_Strength, GUICtrlRead($slFilter_Strength)) Case $slLevel GUICtrlSetData($ipLevel, GUICtrlRead($slLevel)) Case $slMethod GUICtrlSetData($ipMethod, GUICtrlRead($slMethod)) Case $slPass GUICtrlSetData($ipPass, GUICtrlRead($slPass)) Case $slQuality GUICtrlSetData($ipQuality, GUICtrlRead($slQuality)) Case $slSNS_Strength GUICtrlSetData($ipSSN, GUICtrlRead($slSNS_Strength)) EndSwitch Case $hGUI_Image Switch $aGUIGetMsg[0] Case $GUI_EVENT_CLOSE EndSwitch EndSwitch WEnd Func LoadImage($sFile) If StringRight($sFile, 5) = ".webp" Then If $hImage Then _GDIPlus_ImageDispose($hImage) If $hImage_GDI Then _WinAPI_DeleteObject($hImage_GDI) $hImage = WebP_BitmapCreateGDIp($sFile) If @error Or $hImage = 0 Then Return MsgBox($MB_ICONERROR, "ERROR", "Unable to decode WebP image!", 30, $hGUI) EndIf Else If $hImage Then _GDIPlus_ImageDispose($hImage) If $hImage_GDI Then _WinAPI_DeleteObject($hImage_GDI) $hImage = _GDIPlus_ImageLoadFromFile($sFile) If @error Or $hImage = 0 Then Return MsgBox($MB_ICONERROR, "ERROR", "Unknown image format!", 30, $hGUI) EndIf EndIf $hImage_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) CompressAndDisplay($hImage) EndFunc ;==>LoadImage Func CompressAndDisplay($hImage) Local Const $aDim = _GDIPlus_ImageGetDimension($hImage) If $hHBitmap Then _WinAPI_DeleteObject($hHBitmap) $pMemData = 0 $pMemData_Size = 0 Local $iPreset = 0 Switch GUICtrlRead($cbPreset) Case "Default" $iPreset = 0 Case "Picture" $iPreset = 1 Case "Photo" $iPreset = 2 Case "Graph" $iPreset = 3 Case "Text" $iPreset = 4 EndSwitch If IsDllStruct($tMem) Then WebP_FreeUp($tMem) Local $fTimer = TimerInit(), $end $tMem = WebP_CreateWebPAdvancedFromBitmap("", $hImage, _ $iPreset, _ BitAND(GUICtrlRead($chkbLossless), $GUI_CHECKED), _ GUICtrlRead($slQuality), _ GUICtrlRead($slMethod), _ GUICtrlRead($slSNS_Strength), _ GUICtrlRead($slFilter_Sharpness), _ GUICtrlRead($slFilter_Strength), _ GUICtrlRead($slPass), _ GUICtrlRead($slLevel), _ 100, _ ;$near_lossless (0 - 100) BitAND(GUICtrlRead($chkbAlpha_Compression), $GUI_CHECKED), _ GUICtrlRead($slAlpha_Filtering), _ GUICtrlRead($slAlpha_Quality), _ GUICtrlRead($ipTarget_Size), _ True) ;hold the compressed image in memory only, no save to HD! $end = TimerDiff($fTimer) _GUICtrlStatusBar_SetText($StatusBar, "Compressed size: " & Round($tMem.memsize / 1024, 2) & " kb / encoded in " & Round($end, 2) & " ms.") $hHBitmap = WebP_BitmapCreateGDIpFromMem($tMem.pMemData, $tMem.memsize, True) If @error Then Return MsgBox($MB_ICONERROR, "ERROR", "Unable to compress image", 30, $hGUI) WinMove($hGUI_Image, "", (@DesktopWidth - $aDim[0]) / 2, (@DesktopHeight - $aDim[1]) / 2, _ $aDim[0] + $dw, _ $aDim[1] + $dh) WinSetTitle($hGUI_Image, "", StringRegExpReplace($sFile, ".+\\(.*)", "$1") & " / " & Round(FileGetSize($sFile) / 1024, 2) & " kb") GUICtrlSetPos($iPic_WebP, 0, 0, $aDim[0] - 1, $aDim[1] - 1) _WinAPI_DeleteObject(GUICtrlSendMsg($iPic_WebP, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap)) If WinGetState($hGUI_Image) <> $WIN_STATE_VISIBLE Then WinSetState($hGUI_Image, "", @SW_SHOW) WinActivate($hGUI) EndFunc ;==>CompressAndDisplay Func WM_DROPFILES($hWnd, $iMsg, $wParam, $lParam) Local $i = 1 Local $aFileList = _WinAPI_DragQueryFileEx($wParam) Do If StringInStr(FileGetAttrib($aFileList[$i]), "D") Then _ArrayDelete($aFileList, $i) Else $i += 1 EndIf Until $i = UBound($aFileList) $aFileList[0] = UBound($aFileList) - 1 $sFile = $aFileList[1] _WinAPI_DragFinish($wParam) ;~ GUICtrlSendToDummy($iDummy_Load) LoadImage($sFile) Return 0 EndFunc ;==>WM_DROPFILES# Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam) _SendMessage($hWnd, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0) EndFunc ;==>_WM_LBUTTONDOWN  
       
      Download 7-Zip archive for the UDF, DLLs and examples!
      WebP v0.3.0 build 2022-05-07 beta.7z
       
    • By ahha
      Under program control is there an easy way to move a slider (thumb) to the top or bottom?
      I am aware of Melba23's GUIScrollbars_Ex UDF (https://www.autoitscript.com/forum/topic/113723-scrollbars-made-easy-bugfix-version-2-may-21/) but I believe it's overkill for my simple needs.
      In a listview with a vertical scrollbar when the window is active one can hit Ctrl+Home to move the scrollbar slider (thumb) to the top and Ctrl+End to the bottom.
      One can also right click the slider and choose Scroll Here, Top, Bottom, Page UP, Page Down, Scroll Up, and Scroll Down.
      I must be doing something basically wrong but am stuck.  Move the thumb to the middle before clicking the Top button to test the code below (Bottom is not coded).  I've commented out other trys.  try #3 is a strange fail.
      Any comments on what I'm missing greatly appreciated as I'm stuck
      #AutoIt3Wrapper_run_debug_mode=Y #include <Debug.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <GuiScrollBars.au3> AutoItSetOption("MustDeclareVars", 1) ;v1b - cut out extraneous code Example() Exit Func Example() Local $i, $j, $x, $hGUI, $idListView, $bTop, $bBottom $hGUI = GUICreate("Scrollbar Question", 300, 400) ;get handle in case we need it later $idListView = GUICtrlCreateListView("Col 0", 10, 10, 280, 300) $bTop = GUICtrlCreateButton("Top", 10, 350, 60, 25) $bBottom = GUICtrlCreateButton("Bottom", 120, 350, 60, 25) ;Pause("$hGUI = '" & $hGUI &"'"& @CRLF & "$idListView = '" & $idListView &"'") For $i = 1 to 100 _GUICtrlListView_AddItem($idListView, $i) Next GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $bTop ;drag thumb to middle of scrollbar before clicking Top button ;try #1 - FAILS Opt("WinTitleMatchMode", 2) ;2 = Match any substring in the title $x = WinActivate("Scrollbar Question") ;not $idListview but main GUI $hGUI - neither working If $x <> $hGUI Then Pause("WinActivate FAILED") Send("^{HOME}") ;Ctrl+home ;try#2 - FAILS ;~ $x = WinActivate($hGUI) ;try Main GUI ;~ If $x <> $hGUI Then Pause("WinActivate FAILED") ;~ Send("^{HOME}") ;Ctrl+home ;try#3 - strange FAILS ;~ $x = WinActivate($idListview) ;try $idListview ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;strange it works BUT if I comment out this line it fails ;~ ;Sleep(1000) ;it's not a time delay issue ;~ Send("^{HOME}") ;Ctrl+home ;try#4 - same strange fail as #3 ;~ $x = WinActivate($idListview) ;try $idListview ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;~ Send("{UP 100}") ;try#5 - what the heck is going on? same strange fail as #3 ;$x = WinActivate($idListview) ;try $idListview ;~ $x = WinActivate($hGUI) ;try Main GUI ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;~ MouseWheel($MOUSE_WHEEL_UP, 100) ;_GUIScrollBars_ScrollWindow($hGUI, 0, 100) ;NO - moves the ListView window in the $hGUI ;_GUIScrollBars_ScrollWindow($idListview, 0, 100) ;does not seem to work ;_GUIScrollBars_SetScrollInfoPos($hGUI, $SB_VERT, 30) ;does not work ;_GUIScrollBars_SetScrollInfoPos($idListview, $SB_VERT, 30) ;does not work ;I'm doing something very basic wrong. I need help. Pause("Scrollbar thumb should be at Top") Case $bBottom Pause("In: Case $bBottom") Pause("Scroll bar should be at BOttom") EndSwitch WEnd GUIDelete($idListView) EndFunc ;Func Example() Func Pause($text="") MsgBox(262144, "DEBUG", "Paused: " & $text) EndFunc  
    • By Hermes
      Hi, I am struggling in setting the value of a textarea based on the value of clipboard (that contains a long web page source codes). If I use _WD_SetElementValue, it freezes after some time, or appears to be pressing tab and goes out of focus. I can also use send keys but i need the script to run in the background.
      Here is the full script:
      #Include "Chrome.au3" #Include "wd_core.au3" #Include "wd_helper.au3" #Include "WinHttp.au3" #include <MsgBoxConstants.au3> #include <WinAPIFiles.au3> #include <Array.au3> #include <AutoItConstants.au3> #include <WinAPIFiles.au3> #include <GDIPlus.au3> #include <Excel.au3> Local $sDesiredCapabilities, $sSession SetupChrome() _WD_Startup() $sSession = _WD_CreateSession($sDesiredCapabilities) _WD_LoadWait($sSession) _WD_Navigate($sSession, "http://demo.borland.com/testsite/stadyn_largepagewithimages.html") _WD_LoadWait($sSession) Global $sSource = _WD_GetSource($sSession) Local $Paste = ClipPut($sSource) Local $sData = ClipGet() Local $aArray = 0, _ $iOffset = 1 While 1 $aArray = StringRegExp($sData, '(?s)<p>.*</p>', $STR_REGEXPARRAYMATCH, $iOffset) If @error Then ExitLoop $iOffset = @extended For $i = 0 To UBound($aArray) - 1 Local $Paste = ClipPut($aArray[$i]) Local $sRegExData = ClipGet() ;MsgBox(0, "", "$sRegExData = " & $sRegExData) Next WEnd _WD_Navigate($sSession, "https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_textarea_placeholder") _WD_WaitElement($sSession, $_WD_LOCATOR_ByCSSSelector, "iframe#iframeResult") Local $sElement1 = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "iframe#iframeResult") _WD_FrameEnter($sSession, $sElement1) _WD_WaitElement($sSession, $_WD_LOCATOR_ByXPath, "//html/body/textarea") $textarea = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//html/body/textarea") _WD_ElementAction($sSession, $textarea, 'click') ;WD SetElementValue(SsSession, Stextarea, $sRegExData) <-- I can do this but the focus goes out, or the browser freezes _WD_FrameLeave($sSession) sleep(2000) Send("^v") _WD_LoadWait($sSession) _WD_Shutdown() Func SetupChrome() _WD_Option('Driver', 'chromedriver.exe') _WD_Option('Port', 9515) _WD_Option('DriverParams', '--log-path="' & @ScriptDir & '\chrome.log"') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true, "args":["start-maximized","disable-infobars"]}}}}' EndFunc ;==>SetupChrome Can someone help me please, or re-direct me to the right path? TIA!
    • By Hermes
      Hi, I am trying to select elements in print page (dialog window) for a specific web page. But when trying to do so, it looks like it does not allow me to do it.
      So far, this is what I have:
      _WD_WaitElement($sSession, $_WD_LOCATOR_ByCSSSelector, "body") Local $mainpagebody = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "body") _WD_HighlightElement($sSession, $mainpagebody, 2) _WD_WaitElement($sSession, $_WD_LOCATOR_ByCSSSelector, "img.print-button") Local $printbutton = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "img.print-button") _WD_ElementAction($sSession, $printbutton, 'click') _WD_LoadWait($sSession) Sleep(3000) _WD_WaitElement($sSession, $_WD_LOCATOR_ByCSSSelector, "body") Local $printpagebody = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "body") _WD_HighlightElement($sSession, $printpagebody, 2) The script above highlights the main web page "body" element, then clicks a tag to print a specific part of the page, then it will open a print page window where i am trying to highlight the body of that print page - but it looks like it is dropping from the session because it opens up another chrome page chrome://print.
       
      Below is the output log:
      __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/element; $sData={"using":"css selector","value":"body"} __WD_Post: StatusCode=200; ResponseText={"value":{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}}... _WD_FindElement: {"value":{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}} _WD_WaitElement ==> Success __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/element; $sData={"using":"css selector","value":"body"} __WD_Post: StatusCode=200; ResponseText={"value":{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}}... _WD_FindElement: {"value":{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}} __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/execute/sync; $sData={"script":"arguments[0].style='background: #FFFF66; border-radius: 5px; padding-left: 3px;'; return true;", "args":[{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}]} __WD_Post: StatusCode=200; ResponseText={"value":true}... _WD_ExecuteScript: {"value":true}... __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/element; $sData={"using":"css selector","value":"img.print-link"} __WD_Post: StatusCode=200; ResponseText={"value":{"element-6066-11e4-a52e-4f735466cecf":"eb9e4673-4dec-4d4c-be6a-b7967743394b"}}... _WD_FindElement: {"value":{"element-6066-11e4-a52e-4f735466cecf":"eb9e4673-4dec-4d4c-be6a-b7967743394b"}} _WD_WaitElement ==> Success __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/element; $sData={"using":"css selector","value":"img.print-link"} __WD_Post: StatusCode=200; ResponseText={"value":{"element-6066-11e4-a52e-4f735466cecf":"eb9e4673-4dec-4d4c-be6a-b7967743394b"}}... _WD_FindElement: {"value":{"element-6066-11e4-a52e-4f735466cecf":"eb9e4673-4dec-4d4c-be6a-b7967743394b"}} __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/element/eb9e4673-4dec-4d4c-be6a-b7967743394b/click; $sData={"id":"eb9e4673-4dec-4d4c-be6a-b7967743394b"} __WD_Post: StatusCode=200; ResponseText={"value":null}... _WD_ElementAction: {"value":null}... __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/execute/sync; $sData={"script":"arguments[0].style='background: #FFFF66; border-radius: 5px; padding-left: 3px;'; return true;", "args":[{"element-6066-11e4-a52e-4f735466cecf":"eb9e4673-4dec-4d4c-be6a-b7967743394b"}]} __WD_Post: StatusCode=200; ResponseText={"value":true}... _WD_ExecuteScript: {"value":true}... __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/execute/sync; $sData={"script":"return document.readyState", "args":[]} __WD_Post: StatusCode=500; ResponseText={"value":{"error":"script timeout","message":"script timeout\n (Session info: chrome=92.0.4515.107)... __WD_Post ==> Webdriver Exception: {"value":{"error":"script timeout","message":"script timeout\n (Session info: chrome=92.0.4515.107)","stacktrace":"Backtrace:\n\tOrdinal0 [0x00C63733+2504499]\n\tOrdinal0 [0x00BFC401+2081793]\n\tOrdinal0 [0x00B024F0+1058032]\n\tOrdinal0 [0x00B55685+1398405]\n\tOrdinal0 [0x00B45E83+1334915]\n\tOrdinal0 [0x00B54CDB+1395931]\n\tOrdinal0 [0x00B45D4B+1334603]\n\tOrdinal0 [0x00B222B4+1188532]\n\tOrdinal0 [0x00B23149+1192265]\n\tGetHandleVerifier [0x00DDFB8C+1512252]\n\tGetHandleVerifier [0x00E8B0DF+2214031]\n\tGetHandleVerifier [0x00CE4BC3+484211]\n\tGetHandleVerifier [0x00CE3E69+480793]\n\tOrdinal0 [0x00C0218D+2105741]\n\tOrdinal0 [0x00C066E8+2123496]\n\tOrdinal0 [0x00C06827+2123815]\n\tOrdinal0 [0x00C0FB73+2161523]\n\tBaseThreadInitThunk [0x75EB62C4+36]\n\tRtlSubscribeWnfStateChangeNotification [0x77C11B69+1081]\n\tRtlSubscribeWnfStateChangeNotification [0x77C11B34+1028]\n"}} _WD_ExecuteScript: {"value":{"error":"script timeout","message":"script timeout\n (Session info: chrome=92.0.4515.107)... _WD_ExecuteScript ==> Webdriver Exception: HTTP status = 500 _WD_LoadWait ==> Webdriver Exception __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/element; $sData={"using":"css selector","value":"body"} __WD_Post: StatusCode=200; ResponseText={"value":{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}}... _WD_FindElement: {"value":{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}} _WD_WaitElement ==> Success __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/element; $sData={"using":"css selector","value":"body"} __WD_Post: StatusCode=200; ResponseText={"value":{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}}... _WD_FindElement: {"value":{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}} __WD_Post: URL=HTTP://127.0.0.1:9515/session/cd08704233a965ccbaf9292e8692c3e4/execute/sync; $sData={"script":"arguments[0].style='background: #FFFF66; border-radius: 5px; padding-left: 3px;'; return true;", "args":[{"element-6066-11e4-a52e-4f735466cecf":"91a394f0-004c-480d-aedf-52e2b30233c6"}]} __WD_Post: StatusCode=200; ResponseText={"value":true}... _WD_ExecuteScript: {"value":true}...  
      Is it even possible to select elements in print page?

    • By walec
      Hello
      How can I export a sheet to pdf using the OOoCalc.au3 UDF?
      Thank you for any hints or possibly other solutions / functions.
×
×
  • Create New...