PhoenixXL Posted May 1, 2013 Share Posted May 1, 2013 (edited) 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 expandcollapse popup#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 May 19, 2013 by PhoenixXL mesale0077 and Zaramot 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. Link to comment Share on other sites More sharing options...
FireFox Posted May 1, 2013 Share Posted May 1, 2013 (edited) 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 May 1, 2013 by FireFox Link to comment Share on other sites More sharing options...
PhoenixXL Posted May 3, 2013 Author Share Posted May 3, 2013 (edited) 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 May 3, 2013 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 comment Share on other sites More sharing options...
FireFox Posted May 4, 2013 Share Posted May 4, 2013 Here is a start : expandcollapse popup#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. Link to comment Share on other sites More sharing options...
tonyatcodeleakers Posted May 4, 2013 Share Posted May 4, 2013 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) Link to comment Share on other sites More sharing options...
FireFox Posted May 4, 2013 Share Posted May 4, 2013 Link to comment Share on other sites More sharing options...
PhoenixXL Posted May 5, 2013 Author Share Posted May 5, 2013 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 comment Share on other sites More sharing options...
PhoenixXL Posted May 19, 2013 Author Share Posted May 19, 2013 (edited) 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 May 19, 2013 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 comment Share on other sites More sharing options...
mesale0077 Posted May 19, 2013 Share Posted May 19, 2013 very cool Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now