Jump to content
Sign in to follow this  
PhoenixXL

Custom Scrollbar

Recommended Posts

PhoenixXL

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
  • Like 2

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.

Share this post


Link to post
Share on other sites
FireFox

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

 

Share this post


Link to post
Share on other sites
PhoenixXL

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.

Share this post


Link to post
Share on other sites
FireFox

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

 

Share this post


Link to post
Share on other sites
tonyatcodeleakers

Im pretty sure your looking for a marquee effect, melba made a decent one that i have used (works great as a mini console for errors)

Share this post


Link to post
Share on other sites
FireFox
: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

 

Share this post


Link to post
Share on other sites
PhoenixXL

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.

Share this post


Link to post
Share on other sites
PhoenixXL

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.

Share this post


Link to post
Share on other sites
mesale0077

very cool

Share this post


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
Sign in to follow this  

  • Similar Content

    • caramen
      By caramen
      I watched _OL_ItemSend&_OL_ItemFind&_OL_ItemCreate in OutlookEx UDF but hmmm
       
      Since it use the test environnement i cant get the orders of the mail creation
       
      Can someone make me win some time of reading all exemples script and lead me how to do one ?
      That whould be lovely.
      Gnight
    • UEZ
      By UEZ
      Here another example to mark the desktop to get the marked region for capturing. This example is not perfect and not very fast (room for improvements).
      ;coded by UEZ build 2018-09-25 beta #include <APISysConstants.au3> #include <Array.au3> #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <WinAPIGdi.au3> #include <WinAPISysWin.au3> #include <WindowsConstants.au3> Global $__g_hGUI_MarkArea, $__g_hGUI_Bg, $__g_iLabel_TL, $__g_iLabel_TM, $__g_iLabel_TR, $__g_iLabel_LM, $__g_iLabel_RM, $__g_iLabel_BL, $__g_iLabel_BM, _ $__g_iLabel_BR, $__g_iOldCursor, $__g_iW, $__g_iH, $__g_iColor_ResizeDots = 0xFFFFFF, $__g_iBorder = 4, $__g_bSelectionDone = False Global $aRect = _GDIPlus_MarkScreenRegionAnimated() _ArrayDisplay($aRect, "Marked area coordinates") Func _GDIPlus_MarkScreenRegionAnimated($bAnim = True) _GDIPlus_Startup() Local Const $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]") Local Const $aFullScreen = WinGetPos($hFullScreen) $__g_hGUI_Bg = GUICreate("", $aFullScreen[2], $aFullScreen[3], $aFullScreen[0], $aFullScreen[1], BitOR($WS_CLIPCHILDREN, $WS_POPUP), $WS_EX_TOPMOST) ;to avoid cursor flickering and for proper control read WinSetTrans($__g_hGUI_Bg, "", 0x01) $__g_hGUI_MarkArea = GUICreate("", 1, 1, -1, -1, $bAnim ? $WS_POPUP : BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED), $__g_hGUI_Bg) GUISetBkColor(0xABCDEF, $__g_hGUI_MarkArea) If Not $bAnim Then $__g_iColor_ResizeDots = 0xFF0000 $__g_iLabel_TL = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top left GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_TM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_TR = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top right GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_LM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;left mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_RM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;right mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BL = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom left GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BR = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom right GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) GUISetState(@SW_SHOWNA, $__g_hGUI_Bg) GUISetState(@SW_SHOW, $__g_hGUI_MarkArea) $__g_iOldCursor = MouseGetCursor() GUISetCursor(3, 1, $__g_hGUI_Bg) GUISetCursor(3, 1, $__g_hGUI_MarkArea) _WinAPI_SetLayeredWindowAttributes($__g_hGUI_MarkArea, 0xABCDEF, 0xF0) Local $aMPos, $aPrevMPos[2] = [MouseGetPos(0) + 1, MouseGetPos(1) + 1], $iID, $aCI, $iX, $iY, $aOldWinPos, $aOldMPos, $bMoved Do Switch GUIGetMsg() Case $GUI_EVENT_CLOSE If $bAnim Then GUIRegisterMsg($WM_TIMER, "") DllCall("user32.dll", "bool", "KillTimer", "hwnd", $__g_hGUI_MarkArea, "uint_ptr", $iID) GUIRegisterMsg($WM_ERASEBKGND, "") EndIf _GDIPlus_Shutdown() Local $aResult = WinGetPos($__g_hGUI_MarkArea) $aResult[2] = WinGetClientSize($__g_hGUI_MarkArea)[0] $aResult[3] = WinGetClientSize($__g_hGUI_MarkArea)[1] GUIDelete($__g_hGUI_MarkArea) GUIDelete($__g_hGUI_Bg) Return $aResult EndSwitch $aMPos = MouseGetPos() If ($aMPos[0] <> $aPrevMPos[0] Or $aMPos[1] <> $aPrevMPos[1]) And (Not $__g_bSelectionDone) Then WinMove($__g_hGUI_MarkArea, "", $aMPos[0], $aMPos[1]) $aPrevMPos = $aMPos EndIf $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) If $aCI[2] And (Not $__g_bSelectionDone) Then $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If $bAnim Then GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND") GUIRegisterMsg($WM_TIMER, "PlayBorderAnim") $iID = DllCall("User32.dll", "uint_ptr", "SetTimer", "hwnd", $__g_hGUI_MarkArea, "uint_ptr", 1, "uint", 50, "ptr", 0)[0] EndIf While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) $aMPos = MouseGetPos() $__g_iW = Abs($aMPos[0] - $aGUIStartPos[0]) + 1 $__g_iH = Abs($aMPos[1] - $aGUIStartPos[1]) + 1 If $aMPos[0] < $aGUIStartPos[0] Then $iX = $aMPos[0] Else $iX = $aGUIStartPos[0] EndIf If $aMPos[1] < $aGUIStartPos[1] Then $iY = $aMPos[1] Else $iY = $aGUIStartPos[1] EndIf WinMove($__g_hGUI_MarkArea, "", $iX, $iY, $__g_iW, $__g_iH) UpdateCtrlPos($bAnim) WEnd $__g_bSelectionDone = True GUISetCursor(3, 1, $__g_hGUI_MarkArea) ElseIf $aCI[3] And $__g_bSelectionDone Then $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If _WinAPI_PtInRectEx(MouseGetPos(0), MouseGetPos(1), $aGUIStartPos[0], $aGUIStartPos[1], $aGUIStartPos[0] + $aGUIStartPos[2], $aGUIStartPos[1] + $aGUIStartPos[3]) Then $aMPos = MouseGetPos() $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) While $aCI[3] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aGUIStartPos[0] - ($aMPos[0] - MouseGetPos(0)), $aGUIStartPos[1] - ($aMPos[1] - MouseGetPos(1)), $__g_iW, $__g_iH) GUISetCursor(0, 1, $__g_hGUI_Bg) GUISetCursor(0, 1, $__g_hGUI_MarkArea) WEnd GUISetCursor(3, 1, $__g_hGUI_Bg) GUISetCursor(3, 1, $__g_hGUI_MarkArea) EndIf EndIf If $__g_bSelectionDone Then $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) If @error Then ContinueLoop Switch $aCI[4] Case $__g_iLabel_TL GUISetCursor(12, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), MouseGetPos(1), $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BR GUISetCursor(12, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_TR GUISetCursor(10, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], MouseGetPos(1), $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BL GUISetCursor(10, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), $aOldWinPos[1], $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_LM GUISetCursor(13, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), $aOldWinPos[1], $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3]) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_RM GUISetCursor(13, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3]) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_TM GUISetCursor(11, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], MouseGetPos(1), $aOldWinPos[2], $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BM GUISetCursor(11, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2], $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case Else GUISetCursor(3, 1, $__g_hGUI_MarkArea) EndSwitch EndIf Until False EndFunc ;==>_GDIPlus_MarkScreenRegionAnimated Func UpdateCtrlPos($bAnim = True) Local Const $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If $__g_bSelectionDone And $bAnim Then GUIRegisterMsg($WM_TIMER, "") $__g_iW = $aGUIStartPos[2] $__g_iH = $aGUIStartPos[3] ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TL, 0, 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TM, ($__g_iW - $__g_iBorder) / 2, 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TR, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_LM, 0, ($__g_iH - $__g_iBorder) / 2, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_RM, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), ($__g_iH - $__g_iBorder) / 2, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BL, 0, ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BM, ($__g_iW - $__g_iBorder) / 2, ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BR, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) If $__g_bSelectionDone And $bAnim Then GUIRegisterMsg($WM_TIMER, "PlayBorderAnim") EndFunc ;==>UpdateCtrlPos Func PlayBorderAnim() Local $aWinPos = WinGetClientSize($__g_hGUI_MarkArea), $iW = $aWinPos[0], $iH = $aWinPos[1] Local Static $fOffset = 0 Local Const $iSize = $__g_iBorder / 2 Local Const $hDC = _WinAPI_GetDC($__g_hGUI_MarkArea) Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH) Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap) Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer) Local Const $hPen = _GDIPlus_PenCreate(0xFF0178D7, $iSize), $hPen2 = _GDIPlus_PenCreate(0xFFFFFFFF, $iSize), _ $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $__g_iColor_ResizeDots), $hPen3 = _GDIPlus_PenCreate(0xFF000000) _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLEDASHDOT) _GDIPlus_GraphicsClear($hCanvas, 0xFFABCDEF) ;for faster performance direct dll calls DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen2, "float", 1 + $iSize, "float", 1 + $iSize, "float", $iW - 2 * $iSize - 2, "float", $iH - 2 * $iSize - 2) DllCall($__g_hGDIPDll, "int", "GdipSetPenDashOffset", "handle", $hPen, "float", $fOffset) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen, "float", 1 + $iSize, "float", 1 + $iSize, "float", $iW - 2 * $iSize - 2, "float", $iH - 2 * $iSize - 2) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) / 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) / 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) / 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) / 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCCOPY) $fOffset += 0.5 _GDIPlus_GraphicsDispose($hCanvas) _WinAPI_SelectObject($hDC_backbuffer, $DC_obj) _WinAPI_DeleteDC($hDC_backbuffer) _WinAPI_DeleteObject($hHBitmap) _WinAPI_ReleaseDC($__g_hGUI_MarkArea, $hDC) _GDIPlus_PenDispose($hPen) _GDIPlus_PenDispose($hPen2) _GDIPlus_PenDispose($hPen3) _GDIPlus_BrushDispose($hBrush) EndFunc ;==>PlayBorderAnim Func WM_ERASEBKGND($hWnd, $iMsgm, $wParam, $lParam) ;suppress repainting to avoid flickering but causes some other side effects #forceref $iMsgm, $wParam, $lParam Local Const $hBrush = _WinAPI_CreateSolidBrush(0xEFCDAB) ;BGR format ;~ _WinAPI_RedrawWindow($__g_hGUI_MarkArea, 0, 0, BitOR($RDW_NOERASE, $RDW_NOCHILDREN, $RDW_NOFRAME, $RDW_VALIDATE)) _WinAPI_SetClassLongEx($__g_hGUI_MarkArea, $GCL_HBRBACKGROUND, $hBrush) _WinAPI_DeleteObject($hBrush) Return 0 EndFunc ;==>WM_ERASEBKGND  
      Just press the lmb and move your mouse. When lmb is released you can adjust the size of the window by dragging the white rectangle to any direction. Rmb will move the marked area.
      Press ESC to get the coordinates of the marked region.
      If you have any improvements, please post it here.
       
      Tested on Win10 x64 only.
       
    • Tersion
      By Tersion
      Here the this wiki page with list of available UDFs for data compression. For my tasks I only need ZIP support, so I started looking at pure AutoIt UDFs without any 3rd party dlls. And found out that most of available realizations uses standard ("native method") Windows dll - "zipfldr.dll". So for now I chose ZIP UDF by wraithdu. I've tested it on Windows 7 (x64) and it seem works fine. But here the comment from another topic where user says that Windows 10 discontinued support of "zipfldr.dll". Now I confused. I don't have around any Windows 10 machine to tested it. So maybe someone could confirm or deny that? Or maybe would better to switch to UDF with 7zip dll?
      I need an advice...
    • TheSaint
      By TheSaint
      Here is the bare bones of a UDF I have started work on.
      Mostly just a proof of concept at this stage, and still need to add some functions and dress the UDF up a bit ... to look like a UDF ... though it has my own distinct styling, especially as I have never really developed a UDF before now .... used plenty and modified plenty though. I've even invented my own UDF variable naming convention, which I am sure some of you will be aghast at. I work with what feels best for me, but others are free to adapt if they wish.
      The idea is to emulate the simplicity of INI files, but gain the benefits of SQL.
      Two scripts are provided.
      (1) The UDF, a work in progress - SimpleSQL_UDF.au3
      (2) An example or testing script - UDF_Test.au3
      Another first for me, is creating a 2D array from scratch, never done that before, that I can recall ... never had a need, and even for 1 dimension arrays, for a long time now, I have just used _StringSplit to create them. So I needed a bit of a refresher course, which my good buddy @TheDcoder assisted me with ... not without some angst I might add. LOL
      SimpleSQL_UDF.zip  (12 downloads previously)
      (I have now completed all the functions I intended to. My next update will be a big improvement, bringing things more inline with my latest INItoSQL DB program changes.)
      Program requires the sqlite3.dll, not included, but easily enough obtained.
      Hopefully the usage is self-evident ... just change the Job number variable in the UDF_Test.au3 file to check the existing functions out.
      Enjoy!
      P.S. This is also related to a new program I have just finished and uploaded - INItoSQL DB
    • badcoder123
      By badcoder123
      I was looking around the help file and I came across _GDIPlus_GraphicsDrawRect and _WinAPI_DrawLine and I seem to be having the same "problem" where every time it draws into a window and you lose or gain focus it has to redraw itself. Is there anyway around this? 
      #include <WindowsConstants.au3> #include <WinAPI.au3> #Include <GDIPlus.au3> _GDIPlus_Startup() Run("notepad.exe") $hWnd = WinWait("Untitled") $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd) $Color = 0xFFFF0000 $hPen = _GDIPlus_PenCreate($Color, 2) For $i = 1 To 10 _GDIPlus_GraphicsDrawRect($hGraphic, 200, 200, 25 ,25, $hPen) ToolTip($i) Sleep(1000) Next _WinAPI_RedrawWindow($hWnd, 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_PenDispose($hPen) _GDIPlus_Shutdown()  
×