Jump to content

Search the Community

Showing results for tags 'custom'.

More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


  • General
    • Announcements and Site News
    • Administration
  • AutoIt v3
    • AutoIt Help and Support
    • AutoIt Technical Discussion
    • AutoIt Example Scripts
  • Scripting and Development
    • Developer General Discussion
    • Language Specific Discussion
  • IT Administration
    • Operating System Deployment
    • Windows Client
    • Windows Server
    • Office


  • AutoIt Team
    • Beta
    • MVP
  • AutoIt
    • Automation
    • Databases and web connections
    • Data compression
    • Encryption and hash
    • Games
    • GUI Additions
    • Hardware
    • Information gathering
    • Internet protocol suite
    • Maths
    • Media
    • PDF
    • Security
    • Social Media and other Website API
    • Windows
  • Scripting and Development
  • IT Administration
    • Operating System Deployment
    • Windows Client
    • Windows Server
    • Office


  • Forum
  • AutoIt


  • Community Calendar

Found 4 results

  1. Custom Scrollbar

    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
  2. The Favorites Menu

    (The title of this example was originally "The Shell/Custom Favorites/Programs Menus".) This is an implementation of the Shell Favorites and Programs menus with the IShellMenu interface. The purpose of this menu system is to create a popup menu from a directory structure consisting of subfolders and internet or program links. The menu will look like the Favorites menu in Internet or Windows Explorer (as it looked when XP SP2 was released in August 2004). The IShellMenu interface can generally be used to create a menu from a directory structure. The menu items will be supplied with the same icons as the link files and they will be supplied with tooltips too. When you click a menu item the command associated with the internet or program link will be executed. The Favorites and Programs menus will create popup menus from the directory structures given by $CSIDL_FAVORITES, $CSIDL_PROGRAMS, $CSIDL_STARTMENU, $CSIDL_COMMON_PROGRAMS, $CSIDL_COMMON_STARTMENU. The Custom Favorites and Custom Programs menus can be used to create custom popup menus from custom directory structures. Note that the context (right click) menu is working in the Favorites menu. Update #4 2014-05-03: AutoIt 3.3.10 This example was created under 3.3.8 and based on APIConstants.au3 and WinAPIEx.au3 by Yashied. The original example runs under 3.3.10 without any changes at all. But a lot of unused constants and functions are included. In 3.3.10 the two UDFs are divided into several smaller UDFs. This makes it much easier to just include, what is needed. This update only includes the necessary UDFs. You find the new and old zip in bottom of the post. Update #3 2012-11-06: Programs menus Added the Programs menus from the directory structures given by $CSIDL_PROGRAMS, $CSIDL_STARTMENU, $CSIDL_COMMON_PROGRAMS, $CSIDL_COMMON_STARTMENU. To create a menu like the "All Programs" menu copy the two "Start Menu" folders (your own + "All Users") to the "Custom Programs 1" folder and overwrite the existing "Start Menu" folder. Then select the menu item "Custom Programs | Custom Programs 1". Update #2 2012-11-03: Custom Favorites menus If you are creating an AutoIt program and want to add a custom Favorites menu with relevant internet links all you have to do is to create a directory structure, add the subfolders (optional) and links and call the ShowFavsProgsMenu() function with a path to the directory. And you will get a menu that looks like and works like the Favorites menu in Internet Explorer. You can see two custom Favorites menus in the examples. Added two small directory structures to the zip to be used for the custom Favorites menus. Fixed an error: OleInitialize() is used to initialize COM in stead of CoInitialize() (necessary to make the Copy command in the context menu work). Update #1 2012-11-01: Window procedure Because a popup menu like the Favorites menu is modal, it's necessary to use some kind of a window procedure to catch the menu messages. When it's a popup menu it should be enough to have the window procedure running while the popup menu is displayed. In the original scripts the window procedure was created with these commands: $hNewWinProc = DllCallbackRegister( "NewWindowProc", "int", "hwnd;uint;wparam;lparam" ) ; New window procedure $hOldWinProc = _WinAPI_SetWindowLong( $hGui, $GWL_WNDPROC, DllCallbackGetPtr( $hNewWinProc ) ) ; Old window procedureThe procedure was started in the main script in the example and was running as long as the script was running. In this update the menu messages is catched with a hook procedure: $hFavMenuMsg = DllCallbackRegister( "FavMenuMsg", "long", "int;wparam;lparam" ) $hFavMenuMsgHook = _WinAPI_SetWindowsHookEx( $WH_MSGFILTER, DllCallbackGetPtr( $hFavMenuMsg ), 0, _WinAPI_GetCurrentThreadId() ) ; $WH_MSGFILTER installs a hook procedure that monitors messages generated as a ; result of an input event in a dialog box, message box, menu, or scroll bar.The procedure is started in the bottom of the ShowFavoritesMenu() function immediately after the Favorites menu is displayed on the screen, and the procedure is stopped when the menu disappears from the screen. Either because the menu is cancelled or a selection is made. (If you comment out these commands in ShellFavoritesMenu.au3 the Favorites menu will still show up. But the submenus will not be expanded if you keep the mouse steady over a submenu or use the arrow keys.) This hook procedure is much better than the original window procedure. It's much easier to integrate the Favorites menu in other programs when it isn't depending on a "global" window procedure. A "global" window procedure can also have some influence on the GUI (at least on XP, I think it's better on 7). In the original example you saw it clearly when the GUI lost focus. When the GUI got focus back the upper line of the edit box could be behind the toolbar. This is not a problem with a hook procedure only running when the Favorites menu is displayed. Added an example with a menu. Zip updated. First post 2012-10-30 This is an implementation of the Favorites menu primary with the IShellMenu interface but several other interfaces are used as well. The main function: Func ShowFavoritesMenu( $hWnd, $hMenu, $xCoord, $yCoord ) ; --- Create a menu band object and the IShellMenu interface --- Local $oIShellMenu, $pIShellMenu ; Create a menu band object and get a pointer to the IShellMenu interface CoCreateInstance( $tCLSID_MenuBand, $NULL, $CLSCTX_INPROC_SERVER, $tRIID_IShellMenu, $pIShellMenu ) $oIShellMenu = ObjCreateInterface( $pIShellMenu, $sIID_IShellMenu, $dtag_IShellMenu ) If Not IsObj( $oIShellMenu ) Then Return SetError(1,0,0) ; --- Initialize the interface --- If $oIShellMenu.Initialize( $NULL, -1, $ANCESTORDEFAULT, BitOR( $SMINIT_TOPLEVEL, $SMINIT_VERTICAL ) ) <> $S_OK Then Return SetError(2,0,0) ; --- Specify the folder for the menu band to browse --- ; Get a pointer to the IShellFolder interface for the desktop Local $pIShellFolder = $NULL, $oIShellFolderDesktop, $pIShellFolderDesktop, $pidlRel SHGetDesktopFolder( $pIShellFolderDesktop ) SHGetSpecialFolderLocation( $NULL, $CSIDL_FAVORITES, $pidlRel ) $oIShellFolderDesktop = ObjCreateInterface( $pIShellFolderDesktop, $sIID_IShellFolder, $dtag_IShellFolder ) $oIShellFolderDesktop.BindToObject( $pidlRel, $NULL, $tRIID_IShellFolder, $pIShellFolder ) If $pIShellFolder = $NULL Then Return SetError(3,0,0) ; Get the registry key with the "Order" value of the Favorites folder Local $hRegOrder = _WinAPI_RegOpenKey( $HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites", $KEY_READ ) If $hRegOrder = 0 Then Return SetError(4,0,0) ; Specify the folder for the menu band to browse If $oIShellMenu.SetShellFolder( $pIShellFolder, $pidlRel, $hRegOrder, BitOR( $SMSET_BOTTOM, $SMSET_USEBKICONEXTRACTION ) ) <> $S_OK Then Return SetError(5,0,0) _WinAPI_CoTaskMemFree( $pidlRel ) _WinAPI_RegCloseKey( $hRegOrder ) ; --- Append a static menu to the menu band --- If $oIShellMenu.SetMenu( $hMenu, $hWnd, $SMSET_TOP ) <> $S_OK Then Return SetError(6,0,0) ; --- Get access to IMenuPopup, IDeskBar and IDeskBand interfaces --- Local $pIMenuPopup, $pIDeskBar, $pIDeskBand ; The IMenuPopup interface If $pIShellMenu Then If $oIShellMenu.QueryInterface( $tRIID_IMenuPopup, $pIMenuPopup ) <> $S_OK Then Return SetError(7,0,0) EndIf ; The IDeskBar interface If $pIMenuPopup Then Local $oIMenuPopup = ObjCreateInterface( $pIMenuPopup, $sIID_IMenuPopup, $dtag_IMenuPopup ) If $oIMenuPopup.QueryInterface( $tRIID_IDeskBar, $pIDeskBar ) <> $S_OK Then Return SetError(8,0,0) EndIf ; The IDeskBand interface If $pIDeskBar Then Local $oIDeskBar = ObjCreateInterface( $pIDeskBar, $sIID_IDeskBar, $dtag_IDeskBar ) If $oIDeskBar.QueryInterface( $tRIID_IDeskBand, $pIDeskBand ) <> $S_OK Then Return SetError(9,0,0) EndIf ; --- Create a menu desk bar object and the IMenuPopup interface --- Local $oIUnknown, $pIUnknown, $oIMenuPopup, $pIMenuPopup ; Create a menu desk bar object and get a pointer to the IUnknown interface CoCreateInstance( $tCLSID_MenuDeskBar, $NULL, $CLSCTX_INPROC_SERVER, $tRIID_IUnknown, $pIUnknown ) $oIUnknown = ObjCreateInterface( $pIUnknown, $sIID_IUnknown, $dtag_IUnknown ) ; Create the IMenuPopup interface $oIUnknown.QueryInterface( $tRIID_IMenuPopup, $pIMenuPopup ) $oIMenuPopup = ObjCreateInterface( $pIMenuPopup, $sIID_IMenuPopup, $dtag_IMenuPopup ) If Not IsObj( $oIMenuPopup ) Then Return SetError(10,0,0) ; --- Create a menu band site object and the IBandSite interface --- Local $oIBandSite, $pIBandSite ; Create a menu band site object and get a pointer to the IBandSite interface CoCreateInstance( $tCLSID_MenuBandSite, $NULL, $CLSCTX_INPROC_SERVER, $tRIID_IBandSite, $pIBandSite ) $oIBandSite = ObjCreateInterface( $pIBandSite, $sIID_IBandSite, $dtag_IBandSite ) If Not IsObj( $oIBandSite ) Then Return SetError(11,0,0) ; --- Set the band site object as client for the desk bar object --- If $oIMenuPopup.SetClient( $pIBandSite ) <> $S_OK Then Return SetError(12,0,0) ; --- Add the desk band object to the band site object --- If $oIBandSite.AddBand( $pIDeskBand ) <> $S_OK Then Return SetError(13,0,0) ; --- Show the Favorites menu --- Local $tPOINT = DllStructCreate( $tagPOINT ) DllStructSetData( $tPOINT, "X", $xCoord ) DllStructSetData( $tPOINT, "Y", $yCoord ) Local $tRECT = DllStructCreate( $tagRECT ) DllStructSetData( $tRECT, "Left", $xCoord ) DllStructSetData( $tRECT, "Top", $yCoord+1 ) DllStructSetData( $tRECT, "Right", $xCoord ) DllStructSetData( $tRECT, "Bottom", $yCoord+1 ) $oIMenuPopup.Popup( $tPOINT, $tRECT, $MPPF_ALIGN_RIGHT ) ; --- Create the IMenuBand interface --- Local $oIDeskBand $oIDeskBand = ObjCreateInterface( $pIDeskBand, $sIID_IDeskBand, $dtag_IDeskBand ) $oIDeskBand.QueryInterface( $tRIID_IMenuBand, $pIMenuBand ) $oIMenuBand = ObjCreateInterface( $pIMenuBand, $sIID_IMenuBand, $dtag_IMenuBand ) If Not IsObj( $oIMenuBand ) Then Return SetError(14,0,0) ; $oIMenuBand and $pIMenuBand are global variables ; $oIMenuBand is used to handle the messages from the Favorites menu in the function below ; $pIMenuBand is used to test if the Favorites menu is open ($pIMenuBand <> $NULL) Return 0 EndFunc Example The zip contains the example as you can see in the picture. There are two versions of the example: A version based on a toolbar (ExShellFavsProgsMenus.au3), and a version based on a menu bar (ExShellFavsProgsMenus2.au3). The purpose of the text box is just to have something to put in the window. The zip contains also the ShellFavsProgsMenus.au3 UDF. This zip contains the original scripts for 3.3.8. You need APIConstants.au3 and WinAPIEx.au3 by Yashied. The UDFs are not included in the zip. The zip can be opened with 7-Zip. ShellFavsProgsMenus.zip This zip contains the updated scripts for 3.3.10. Only a matter of UDFs. These scripts will not run under 3.3.8. TheFavoritesMenu.7z Testet on XP 32 bit and Win 7 32/64 bit.
  3. Is there a way to change to a custom cursor? I found some examples that work with GUI but can not find anything that changes the cursor on my desktop without a gui.
  4. So i was in need of this custom udf Fastfind Melba23 showed me this great article on AutoIt wiki..http://www.autoitscript.com/wiki/Adding_UDFs_to_AutoIt_and_SciTE and i think i did like it said.. mostly anyway.. I downloaded and unzipped FastFind and placed all files in a new Folder i created in the AutoIt3 Folder The files i placed in the new Folder: <-- Named it FastFind Benchmark.au3 FastFind.au3 FastFind.dll FastFind_Demo.au3 FastFind.dll I think the Benchmark and FastFind_Demo are just examples.. But i don't think they will Hurt by being in there ? They don't have any Dll to them.. and Even though i am not shure about it.. i think you need the dll to include and call the Custom Files from that folder. Correct me if i am wrong So after placing the files in the new Folder, i started SciTE --> SciTE Config --> User Include Dir: C:Program Files (x86)AutoIt3FastFind Save+Apply So can i now #include <fastfind.au3> ? and you the build in functions? I have not tried this yet because i dont know how to use the custom UDF "syntax?"