Search the Community
Showing results for tags 'graphical'.
-
UDF provide graphical control based on static class. Button Progressbar v1.01. Fix on Syntax Error Checking Download Choose server where you will download: fxControl.zip - code.google.com (renamed from zettoControl_v1.02.zip) fxControl.zip - autoitscript.com The next version of this UDF will named as fxControl (Control Framework). Screenshot Sample Application using zettoControl Z-Compressor [link fixed] Clean PC Clean PC Source available in spoiler below 'Codice Sorgente' text, in that page. but download link: dead. Its still useful because at least the source are here while you able replace image file with what you have. zettoControl_v1.02.zip
-
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