Jump to content
NHD

Custom control don't work correctly

Recommended Posts

NHD

Hi,

I've been translated code from FreeBasic to AutoIt. And it didn't work correctly.

Please help me!

FreeBasic:

#Include Once "windows.bi"

#Define _RGB(r,g,b)  BGR(b,g,r)

CONST GRADIENT_FILL_RECT_H  =  0
CONST GRADIENT_FILL_RECT_V  =  1

Dim Shared hInstance As HINSTANCE

  ' This dll is located in Windows directory
DECLARE FUNCTION Gradientfill Lib "MSIMG32" ALIAS "GradientFill"           _
(hDC AS HDC, pVertex As PTRIVERTEX, dwNumVertex As Integer,pMesh AS PGRADIENT_RECT, dwNumMesh As Integer, dwMode  As Integer) As Integer

'********************************************************************
'     A FB Control Template  
'********************************************************************
Declare Function NiceButt(ByVal hWnd as HWND,byval Msg as UINT,byval wParam as WPARAM,byval lParam as LPARAM) as LRESULT 
Declare FUNCTION IsMouseOver (hWnd As HWND )As Integer
Declare SUB Draw_Gradient (hdc as HDC, x  As Integer, y  As integer, w  As integer, h  As Integer, r  As integer, g  As integer, b As integer)
Declare FUNCTION Register_NiceButt()As Integer

 ' 'Windows calls this function when the dll is loaded. 
/'Function DllMain alias "MAIN"(byval hModule as HMODULE,byval reason as Integer,byval lpReserved as LPVOID) as BOOL  

   Select case reason
      case DLL_PROCESS_ATTACH
         hInstance=hModule
         Register_NiceButt()
         MessageBox(GetActiveWindow(),"OK","OK",MB_OK)
         Return 0
      case DLL_PROCESS_DETACH
         '
   end select 
   return TRUE 

end function 
'/

FUNCTION Register_NiceButt()As Integer Export
DIM  wc AS WNDCLASSEX
DIM  szClassName As String
szClassName     =  "NiceButt"
wc.cbSize        =  SIZEOF(WNDCLASSEX)
wc.style         =  CS_HREDRAW OR CS_VREDRAW OR CS_GLOBALCLASS
wc.hInstance     =  GetmoduleHandle(0) 'hInstance
wc.hbrBackground =  Cast(HBRUSH,COLOR_BTNFACE+1)
wc.lpszClassName =  StrPtr(szClassName)
wc.lpfnWndProc   =  @NiceButt
wc.cbClsExtra    =  0
wc.cbWndExtra    =  0
wc.hIcon         =  0
wc.hCursor       =  0
wc.lpszMenuName  =  0
wc.hIconSm       =  0
FUNCTION         =  RegisterClassEx(@wc)
END FUNCTION

'********************************************************************
'                      Custom Control Procedure
'********************************************************************

Function NiceButt(ByVal hWnd as HWND,byval Msg as UINT,byval wParam as WPARAM,byval lParam as LPARAM) as LRESULT
STATIC  As Integer ButtDown,mouseover
STATIC Captured AS HWND

SELECT Case Msg

'**************************
  CASE WM_CREATE
'**************************

  DIM   Region AS HRGN
  DIM   Rct AS RECT
  DIM As Integer  x, y, w, h
  ButtDown = FALSE
  GetClientRect (hWnd,@Rct)      ' <<-- Get the size of our control
  x = Rct.left
  y = Rct.top
  w = Rct.right  - Rct.left
  h = Rct.bottom - Rct.top

  'Region = CreateRoundRectRgn(10,10,w,h, h * 0.90 , h * 0.90 )

  'SetWindowRgn (hWnd,Region,True)
  InvalidateRect(hWnd,0,0)
  'EXIT FUNCTION

' *******************
  CASE WM_PAINT
' *******************

  DIM   hDC       AS HDC
  DIM   ps        AS PAINTSTRUCT
  DIM   hPen      AS HPEN
  DIM   hBrush    AS HBRUSH
  DIM   hOldBrush AS HBRUSH
  DIM   Rct       AS RECT
  DIM   Size      AS SIZE
  DIM   T As ZString*2048
  DIM As Integer i
  DIM As Integer  XCtr
  DIM As Integer  YCtr
  DIM As Integer  x,y,w,h
  DIM As Integer  r,g,b

' *******************

  GetClientRect (hWnd,@Rct)      ' <<-- Get the size of our control
  x = Rct.left
  y = Rct.top
  w = Rct.right  - Rct.left
  h = Rct.bottom - Rct.top

  XCtr = (Rct.left + Rct.right)  / 2  ' Horizontal center of our ctrl
  YCtr = (Rct.top  + Rct.bottom) / 2  ' Vertical   center of our ctrl
  GetWindowText(hWnd,T ,255)          ' Grab a copy of control caption

'**********************************
'        Draw our control
'**********************************

  hDC = BeginPaint (hWnd, @ps)
  GetTextExtentPoint32(hDC, T , LEN(T),@Size)    ' Get caption size
  r = 30 : g = 90 : b = 90
  Draw_Gradient (hDC, x, y, w, h, r, g, b)
  SetBkMode (hDC,TRANSPARENT)

  IF ButtDown THEN
    SetTextColor(hDC,_RGB(255,0,0))
    TextOut(hDC, XCtr-(Size.cx/2)+1, YCtr-(Size.cy/2)+1,T,LEN(T))
  ELSE
    SetTextColor(hDC,_RGB(0,0,255))
    TextOut(hDC, XCtr-Size.cx/2, YCtr-Size.cy/2,T,LEN(T))
  END IF

  EndPaint (hWnd,@ps)
  'EXIT FUNCTION

'******************************
  CASE WM_LBUTTONUP
'******************************

  IF hWnd = Captured THEN
    DIM   hParent AS HWND
    ReleaseCapture()
    ButtDown = FALSE
    InvalidateRect(hWnd,0,0)
    hParent=GetParent(hWnd)
    SendMessage(hParent,WM_COMMAND,MAKELONG(GetWindowLong(hWnd,GWL_ID), BN_CLICKED),Cast(LONG,hWnd))
  END IF
  'EXIT FUNCTION

'******************************
  CASE WM_LBUTTONDOWN
'******************************

  SetCapture(hWnd)
  Captured = hWnd
  ButtDown = TRUE
  SetFocus (hWnd)
  InvalidateRect(hWnd,0,0)
  'EXIT FUNCTION

'******************************
  CASE WM_MOUSEMOVE
'******************************

  IF ButtDown THEN
    IF IsMouseOver(hWnd) THEN
      ButtDown = TRUE
      InvalidateRect(hWnd,0,0)
    ELSE
      ReleaseCapture()
      ButtDown = FALSE
      InvalidateRect(hWnd,0,0)
    END IF
  END IF
  'EXIT FUNCTION

'******************************
  CASE WM_MOVING
'******************************

  ReleaseCapture()
  ButtDown = FALSE
  InvalidateRect(hWnd,0,0)
  'EXIT FUNCTION

'******************************
  CASE WM_SIZE
'******************************

  ReleaseCapture()
  ButtDown = FALSE
  InvalidateRect(hWnd,0,0)
  'EXIT FUNCTION

END Select
Return DefWindowProc(hwnd,Msg,wparam,lparam)
END FUNCTION







SUB Draw_Gradient (hdc as HDC, x  As Integer, y  As integer, w  As integer, h  As Integer, r  As integer, g  As integer, b As integer)
DIM  Vert(2) AS TRIVERTEX
DIM   Rect    AS GRADIENT_RECT
'******************************************************
Vert (0).x      =    0
Vert (0).y      =    0
Vert (0).Red    =    65535-(65535-(r*256))
Vert (0).Green  =    65535-(65535-(g*256))
Vert (0).Blue   =    65535-(65535-(b*256))
Vert (0).Alpha  =    0
'******************************************************
Vert (1).x      =    w
Vert (1).y      =    h/2
Vert (1).Red    =    65535-(65535-(255*256))
Vert (1).Green  =    65535-(65535-(255*256))
Vert (1).Blue   =    65535-(65535-(255*256))
Vert (1).Alpha  =    0
'******************************************************
Rect.UpperLeft  =    0
Rect.LowerRight =    1
'******************************************************
Gradientfill(hdc,@Vert(0),2,@Rect,1,GRADIENT_FILL_RECT_V)
'******************************************************
Vert (0).x      =    0
Vert (0).y      =    h/2
Vert (0).Red    =    65535-(65535-(255*256))
Vert (0).Green  =    65535-(65535-(255*256))
Vert (0).Blue   =    65535-(65535-(255*256))
Vert (0).Alpha  =    0
'******************************************************
Vert (1).x      =    w
Vert (1).y      =    h
Vert (1).Red    =    65535-(65535-(r*256))
Vert (1).Green  =    65535-(65535-(g*256))
Vert (1).Blue   =    65535-(65535-(b*256))
Vert (1).Alpha  =    0
'******************************************************
Rect.UpperLeft  =    0
Rect.LowerRight =    1
'******************************************************
Gradientfill(hdc,@Vert(0),2,@Rect,1,GRADIENT_FILL_RECT_V)
END SUB

FUNCTION IsMouseOver (hWnd As HWND )As Integer
DIM  Rect As RECT
DIM  Pt   As POINT
GetWindowRect (hWnd, @Rect)
GetCursorPos(@Pt)
FUNCTION = PtInRect (@Rect, Pt)
END FUNCTION

 

AutoIt:

#include-once
#include <WinAPI.au3>
#include <WinAPIGdi.au3>
#include <WinAPISys.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;~ #Include <windows.bi>

Global Const $_tagRect              = "struct;long left;long top;long right;long bottom;endstruct"
Global Const $_tagSize              = "struct;long cx;long cy;endstruct"
Global Const $_tagGradient_Rect     = "struct;ulong UpperLeft;ulong LowerRight;endstruct"
Global Const $_tagPoint             = "struct;long x;long y;endstruct"
Global Const $_tagTrivertex         = "struct;long x;long y;int Red;int Greed;int Blue;int Alpha;endstruct"
Global Const $_tagPaintStruct       = "struct;handle hdc;bool fErase;long left;long top;long right;long bottom;bool fRestore;bool fIncUpdate;byte rgbReserved[32];endstruct"
Global Const $_tagWNDCLASSEX        = "struct;uint cbSize;uint style;ptr lpfnWndProc;int cbClsExtra;int cbWndExtra;ptr hInstance;ptr hIcon;" & _
                                    "ptr hCursor; ptr hbrBackground; ptr lpszMenuName;ptr lpszClassName;ptr hIconSm;endstruct"
Global Const $CS_VREDRAW            = 0x0001, $CS_HREDRAW =0x0002, $CS_GLOBALCLASS = 0x4000
Global Const $BN_CLICKED            = 0
;~ #Define _RGB(r,g,b)  BGR(b,g,r)

Global Const $GRADIENT_FILL_RECT_H  =  0
Global Const $GRADIENT_FILL_RECT_V  =  1

;~ Dim Shared hInstance As HINSTANCE

;~   ' This dll is located in Windows directory
;~ DECLARE FUNCTION Gradientfill Lib "MSIMG32" ALIAS "GradientFill"           _
;~ (hDC AS HDC, pVertex As PTRIVERTEX, dwNumVertex As Integer,pMesh AS PGRADIENT_RECT, dwNumMesh As Integer, dwMode  As Integer) As Integer

;~ '********************************************************************
;~ '     A FB Control Template
;~ '********************************************************************
;~ Declare Function NiceButt(ByVal hWnd as HWND,byval Msg as UINT,byval wParam as WPARAM,byval lParam as LPARAM) as LRESULT
;~ Declare FUNCTION IsMouseOver (hWnd As HWND )As Integer
;~ Declare SUB Draw_Gradient (hdc as HDC, x  As Integer, y  As integer, w  As integer, h  As Integer, r  As integer, g  As integer, b As integer)
;~ Declare FUNCTION Register_NiceButt()As Integer

#cs
 ' 'Windows calls this function when the dll is loaded.
/'Function DllMain alias "MAIN"(byval hModule as HMODULE,byval reason as Integer,byval lpReserved as LPVOID) as BOOL

   Select case reason
      case DLL_PROCESS_ATTACH
         hInstance=hModule
         Register_NiceButt()
         MessageBox(GetActiveWindow(),"OK","OK",MB_OK)
         Return 0
      case DLL_PROCESS_DETACH
         '
   end select
   return True

end function
'/
#ce



#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 437, 192, 124)

RegisterButton()
Global $Ctrl = _winapi_CreateWindowEx(0, "TestButton", "Test", BitOR($WS_VISIBLE, $WS_CHILD), 10, 10, 80, 30, $Form1)



ConsoleWrite(@CRLF & $Ctrl)
GUISetState(@SW_SHOW)

_WinAPI_UpdateWindow($Form1)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch
WEnd


Func RegisterButton()

    Local $hDll = DllCallbackRegister('TestButtonProc', 'lresult', 'hwnd;uint;wparam;lparam')

;~  DIM  wc AS WNDCLASSEX
;~  DIM  szClassName As String
    Local $sClass = "TestButton"
    Local $wc = DllStructCreate($_tagWNDCLASSEX & ';wchar szClassName[' & (StringLen($sClass) + 1) & ']')

;~  szClassName         =  "NiceButt"

;~  wc.cbSize           =  SIZEOF(WNDCLASSEX)
    $wc.cbSize          =  DllStructGetPtr($wc, 'szClassName') - DllStructGetPtr($wc)

;~  wc.style            =  CS_HREDRAW OR CS_VREDRAW OR CS_GLOBALCLASS
    $wc.style           =  BitOR($CS_HREDRAW, $CS_VREDRAW, $CS_GLOBALCLASS)

;~  wc.hInstance        =  GetmoduleHandle(0) 'hInstance
    $wc.hInstance       =  _WinAPI_GetModuleHandle(0)

;~  wc.hbrBackground    =  Cast(HBRUSH,COLOR_BTNFACE+1) ;///
    $wc.hbrBackground   =  _WinAPI_CreateSolidBrush(_WinAPI_GetSysColor($COLOR_BTNFACE))

;~  wc.lpszClassName    =  StrPtr(szClassName)
    $wc.lpszClassName   =  DllStructGetPtr($wc, 'szClassName')

;~  wc.lpfnWndProc      =  @NiceButt
    $wc.lpfnWndProc     =  DllCallbackGetPtr($hDll)

;~  wc.cbClsExtra       =  0
    $wc.cbClsExtra      =  0

;~  wc.cbWndExtra       =  0
    $wc.cbWndExtra      =  0

;~  wc.hIcon            =  0
    $wc.hIcon           =  0

;~  wc.hCursor          =  0
    $wc.hCursor         =  0

;~  wc.lpszMenuName     =  0
    $wc.lpszMenuName    =  0

;~  wc.hIconSm          =  0
    $wc.hIconSm         =  0

    $wc.szClassName     =  $sClass

;~  FUNCTION            =  RegisterClassEx(@wc)
    Local $aRet = _WinAPI_RegisterClassEx($wc)
    Return $aRet
;~ END FUNCTION
EndFunc

;********************************************************************
;                      Custom Control Procedure
;********************************************************************

;~ Function NiceButt(ByVal hWnd as HWND,byval Msg as UINT,byval wParam as WPARAM,byval lParam as LPARAM) as LRESULT
Func TestButtonProc($hWnd, $iMsg, $wParam, $lParam)
    Static $bBtnDown, $bMouseOver, $hCaptured

    Switch $iMsg
        Case $WM_CREATE
            Local $Rct = DllStructCreate($_tagRect)
            Local $iX, $iY, $iW, $iH
            $bBtnDown = False
            GetClientRect($hWnd, $Rct)

            $iX = $Rct.left
            $iY = $Rct.top
            $iW = $Rct.right - $Rct.left
            $iH = $Rct.bottom - $Rct.top

            InvalidateRect($hWnd, 0, False)
;~          EXIT FUNCTION
;~          Return 0

        Case $WM_PAINT
            Local $ps ;= DllStructCreate($_tagPaintStruct)
            Local $hPen, $hBrush, $hOldBrush
            Dim $Rct = DllStructCreate($_tagRect)
            Dim $Size = DllStructCreate($_tagSize)
            Dim $T = "", $i
            Dim $XCtr, $YCtr
            Dim $iX, $iY, $iW, $iH
            Dim $iR, $iG, $iB

            GetClientRect($hWnd, $Rct)

            $iX = $Rct.left
            $iY = $Rct.top
            $iW = $Rct.right  - $Rct.left
            $iH = $Rct.bottom - $Rct.top

            $XCtr = ($Rct.left + $Rct.right)  / 2
            $YCtr = ($Rct.top  + $Rct.bottom) / 2
;~          GetWindowText(hWnd,T ,255)          ' Grab a copy of control caption

;~          DllCall("user32.dll", "int", "GetWindowTextW", "hwnd", $hWnd, "LPTSTR ", $T, "int", 255) ; not work
            $T = "Test"
            ;**********************************
            ;        Draw our control
            ;**********************************

            Local $hDC = BeginPaint($hWnd, $ps)
;~          GetTextExtentPoint32(hDC, T , LEN(T),@Size)    ' Get caption size
            GetTextExtentPoint32($hDC, $T, StringLen($T), $Size)

            $iR = 30
            $iG = 90
            $iB = 90
            Draw_Gradient($hDC, $iX, $iY, $iW, $iH, $iR, $iG, $iB)
            SetBkMode($hDC, $TRANSPARENT)

            If $bBtnDown Then
;~              SetTextColor(hDC,_RGB(255,0,0))
                SetTextColor($hDC, Dec(0xFF0000))
                TextOut($hDC, $XCtr-($Size.cx/2)+1, $YCtr-($Size.cy/2)+1, $T)

            Else
;~              SetTextColor(hDC,_RGB(0,0,255))
                SetTextColor($hDC, Dec(0x0000FF))
                TextOut($hDC, $XCtr-$Size.cx/2, $YCtr-$Size.cy/2, $T)


            EndIf
            EndPaint($hWnd, $ps)

;~          EXIT FUNCTION
;~          Return 0

        Case $WM_LBUTTONUP
            If $hWnd = $hCaptured Then
                ReleaseCapture()
                $bBtnDown = False
                InvalidateRect($hWnd, 0, 0)
                Local $hParent = GetParent($hWnd)
;~              SendMessage(hParent,WM_COMMAND,MAKELONG(GetWindowLong(hWnd,GWL_ID), BN_CLICKED),Cast(LONG,hWnd))
                DllCall("user32.dll", "LRESULT", "SendMessageW", _
                        "hwnd",     $hParent, _
                        "uint",     $WM_COMMAND, _
                        "WPARAM",   _WinAPI_MakeLong(_WinAPI_GetWindowLong($hWnd, $GWL_ID), $BN_CLICKED), _
                        "LPARAM",   $hWnd)
            EndIf
;~          EXIT FUNCTION
            Return 0

        Case $WM_LBUTTONDOWN
            SetCapture($hWnd)
            $hCaptured = $hWnd
            $bBtnDown = True
            SetFocus($hWnd)
            InvalidateRect($hWnd, 0, False)

;~          EXIT FUNCTION
            Return 0

        Case $WM_MOUSEMOVE
            If $bBtnDown Then
                If IsMouseOver($hWnd) Then
                    $bBtnDown = True
                    InvalidateRect($hWnd, 0, False)
                ELSE
                    ReleaseCapture()
                    $bBtnDown = False
                    InvalidateRect($hWnd, 0, False)
                EndIf
            EndIf

;~          EXIT FUNCTION
;~          Return 0

        Case $WM_MOVING
            ReleaseCapture()
            $bBtnDown = False
            InvalidateRect($hWnd, 0, False)

;~          EXIT FUNCTION
;~          Return 0

        Case $WM_SIZE
            ReleaseCapture()
            $bBtnDown = False
            InvalidateRect($hWnd, 0, False)

;~          EXIT FUNCTION
;~          Return 0

    EndSwitch
;~  Return _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)
    Return DllCall("user32.dll", "lresult", "DefWindowProcW", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, _
            "lparam", $lParam)[0]
EndFunc

;~ SUB Draw_Gradient (hdc as HDC, x  As Integer, y  As integer, w  As integer, h  As Integer, r  As integer, g  As integer, b As integer)
Func Draw_Gradient($hDC, $iX, $iY, $iW, $iH, $iR, $iG, $iB)
;~  DIM  Vert(2) AS TRIVERTEX
    Local $Vert[2]
    $Vert[0] = DllStructCreate($_tagTrivertex)
    $Vert[1] = DllStructCreate($_tagTrivertex)
;~  DIM  Rect    AS GRADIENT_RECT
    Local $Rect = DllStructCreate($_tagGradient_Rect)

;~  Vert (0).x          =   0
    $Vert[0].x          =   0
;~  Vert (0).y          =   0
    $Vert[0].y          =   0
;~  Vert (0).Red        =   65535-(65535-(r*256))
    $Vert[0].Red        =   65535-(65535-($iR*256))
;~  Vert (0).Green      =   65535-(65535-(g*256))
    $Vert[0].Green      =   65535-(65535-($iG*256))
;~  Vert (0).Blue       =   65535-(65535-(b*256))
    $Vert[0].Blue       =   65535-(65535-($iB*256))
;~  Vert (0).Alpha      =   0
    $Vert[0].Alpha      =   0
;~ '******************************************************
;~  Vert (1).x          =    w
    $Vert[1].x          =    $iW
;~  Vert (1).y          =    h/2
    $Vert[1].y          =    $iH/2
;~  Vert (1).Red        =    65535-(65535-(255*256))
    $Vert[1].Red        =    65535-(65535-(255*256))
;~  Vert (1).Green      =    65535-(65535-(255*256))
    $Vert[1].Green      =    65535-(65535-(255*256))
;~  Vert (1).Blue       =    65535-(65535-(255*256))
    $Vert[1].Blue       =    65535-(65535-(255*256))
;~  Vert (1).Alpha      =    0
    $Vert[1].Alpha      =    0
;~ '******************************************************
;~  Rect.UpperLeft      =    0
    $Rect.UpperLeft     =    0
;~  Rect.LowerRight     =    1
    $Rect.LowerRight    =    1
;~ '******************************************************
;~  Gradientfill(hdc,@Vert(0),2,@Rect,1,GRADIENT_FILL_RECT_V)
    GradientFill($hDC, $Vert[0], 2, $Rect, 1, $GRADIENT_FILL_RECT_V)
;~ '******************************************************
;~  Vert (0).x          =    0
    $Vert[0].x          =    0
;~  Vert (0).y          =    h/2
    $Vert[0].y          =    $iH/2
;~  Vert (0).Red        =    65535-(65535-(255*256))
    $Vert[0].Red        =    65535-(65535-(255*256))
;~  Vert (0).Green      =    65535-(65535-(255*256))
    $Vert[0].Green      =    65535-(65535-(255*256))
;~  Vert (0).Blue       =    65535-(65535-(255*256))
    $Vert[0].Blue       =    65535-(65535-(255*256))
;~  Vert (0).Alpha      =    0
    $Vert[0].Alpha      =    0
;~ '******************************************************
;~  Vert (1).x          =    w
    $Vert[1].x          =    $iW
;~  Vert (1).y          =    h
    $Vert[1].y          =    $iH
;~  Vert (1).Red        =    65535-(65535-(r*256))
    $Vert[1].Red        =    65535-(65535-($iR*256))
;~  Vert (1).Green      =    65535-(65535-(g*256))
    $Vert[1].Green      =    65535-(65535-($iG*256))
;~  Vert (1).Blue       =    65535-(65535-(b*256))
    $Vert[1].Blue       =    65535-(65535-($iB*256))
;~  Vert (1).Alpha      =    0
    $Vert[1].Alpha      =    0
;~ '******************************************************
;~  Rect.UpperLeft      =    0
    $Rect.UpperLeft     =    0
;~  Rect.LowerRight     =    1
    $Rect.LowerRight    =    1
;~ '******************************************************
;~  Gradientfill(hdc,@Vert(0),2,@Rect,1,GRADIENT_FILL_RECT_V)
    GradientFill($hDC, $Vert[0], 2, $Rect, 1, $GRADIENT_FILL_RECT_V)
;~ END SUB
EndFunc

Func IsMouseOver($hWnd)
    Local $Rect = DllStructCreate($_tagRect)
    Local $Pt = DllStructCreate($_tagPoint)
    GetWindowRect ($hWnd, $Rect)
    GetCursorPos($Pt)
    Return PtInRect($Rect, $Pt)
EndFunc

Func _RGB($iR, $iG, $iB)
    Return ('0x' & Hex($iR, 2) & Hex($iG, 2) & Hex($iB, 2))
EndFunc

Func _BGR($iB, $iG, $iR)
    Return ('0x' & Hex($iB, 2) & Hex($iG, 2) & Hex($iR, 2))
EndFunc

Func InvalidateRect($hWnd, $tRECT = 0, $bErase = True)
    DllCall("user32.dll", "bool", "InvalidateRect", "hwnd", $hWnd, "struct*", $tRECT, "bool", $bErase)
EndFunc

Func SetFocus($hWnd)
    DllCall("user32.dll", "hwnd", "SetFocus", "hwnd", $hWnd)
EndFunc

Func PtInRect($tRect, $tPoint)
    Local $aRet = DllCall("user32.dll", "bool", "PtInRect", "ptr", DllStructGetPtr($tRect), "struct*", $tPoint)
    If IsArray($aRet) Then Return $aRet[0]
    Return False
EndFunc

Func GetWindowRect($hWnd, ByRef $tRect)
    DllCall("user32.dll", "bool", "GetWindowRect", "hwnd", $hWnd, "struct*", $tRect)
EndFunc

Func GetCursorPos(ByRef $tPoint)
    DllCall("user32.dll", "bool", "GetCursorPos", "struct*", $tPoint)
EndFunc

Func SetCapture($hWnd)
    DllCall("user32.dll", "hwnd", "SetCapture", "hwnd", $hWnd)
EndFunc

Func ReleaseCapture()
    DllCall("user32.dll", "bool", "ReleaseCapture")
EndFunc

Func SetTextColor($hDC, $iColor)
    DllCall("gdi32.dll", "INT", "SetTextColor", "handle", $hDC, "INT", $iColor)
EndFunc

Func BeginPaint($hWnd, ByRef $tPAINTSTRUCT)
    $tPAINTSTRUCT = DllStructCreate($tagPAINTSTRUCT)
    Local $aRet = DllCall('user32.dll', 'handle', 'BeginPaint', 'hwnd', $hWnd, 'struct*', $tPAINTSTRUCT)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aRet[0]
EndFunc

Func GetTextExtentPoint32($hDC, $sText, $iTextLen, ByRef $tSize)
    DllCall("gdi32.dll", "bool", "GetTextExtentPoint32W", "handle", $hDC, "wstr", $sText, "int", $iTextLen, "struct*", $tSize)
EndFunc

Func GradientFill($hDC, $tVertex, $nVertex, $tMesh, $nMesh, $ulMode)
    DllCall("Msimg32.dll", "BOOL", "GradientFill", _
            "handle",   $hDC, _
            "struct*",  $tVertex, _
            "ulong",    $nVertex, _
            "struct*",  $tMesh, _
            "ulong",    $nMesh, _
            "ulong",    $ulMode)
EndFunc

Func GetParent($hWnd)
    Local $aResult = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", $hWnd)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[0]
EndFunc

Func SetBkMode($hDC, $iBkMode)
    Local $aResult = DllCall("gdi32.dll", "int", "SetBkMode", "handle", $hDC, "int", $iBkMode)
    If @error Then Return SetError(@error, @extended, 0)

    Return $aResult[0]
EndFunc

Func EndPaint($hWnd, ByRef $tPAINTSTRUCT)
    Local $aRet = DllCall('user32.dll', 'bool', 'EndPaint', 'hwnd', $hWnd, 'struct*', $tPAINTSTRUCT)
    If @error Then Return SetError(@error, @extended, False)
    Return $aRet[0]
EndFunc

Func GetClientRect($hWnd, ByRef $tRect)
    Local $aRet = DllCall("user32.dll", "bool", "GetClientRect", "hwnd", $hWnd, "struct*", $tRect)
    If @error Or Not $aRet[0] Then Return SetError(@error + 10, @extended, 0)
    Return $tRect
EndFunc

Func TextOut($hDC, $iX, $iY, $sText, $iTextLen = Default)
    If $iTextLen = Default Then $iTextLen = StringLen($sText)
    DllCall('gdi32.dll', 'bool', 'TextOutW', 'handle', $hDC, 'int', $iX, 'int', $iY, 'wstr', $sText, 'int', $iTextLen)
EndFunc

 

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

  • Similar Content

    • ScriptJunky
      By ScriptJunky
      I noticed a lack of a constants file for _WinAPI_GetSystemMetrics() so I made this for anyone who wants to add it to their library. Enjoy!  (file attached below)
      #include-once ; #INDEX# ======================================================================================================================= ; Title .........: WinAPI GetSystemMetrics Constants ; AutoIt Version : 3.3.14.5 ; Language ......: English ; Description ...: Constants for _WinAPI_GetSystemMetrics(). ; Author(s) .....: ScriptJunky ; =============================================================================================================================== ; #CONSTANTS# =================================================================================================================== ; _WinAPI_GetSystemMetrics() Global Const $ARRANGE = 56 Global Const $CLEANBOOT = 67 Global Const $CMONITORS = 80 Global Const $CMOUSEBUTTONS = 43 Global Const $CONVERTIBLESLATEMODE = 0x2003 Global Const $CXBORDER = 5 Global Const $CXCURSOR = 13 Global Const $CXDLGFRAME = 7 Global Const $CXDOUBLECLK = 36 Global Const $CXDRAG = 68 Global Const $CXEDGE = 45 Global Const $CXFIXEDFRAME = 7 Global Const $CXFOCUSBORDER = 83 Global Const $CXFRAME = 32 Global Const $CXFULLSCREEN = 16 Global Const $CXHSCROLL = 21 Global Const $CXHTHUMB = 10 Global Const $CXICON = 11 Global Const $CXICONSPACING = 38 Global Const $CXMAXIMIZED = 61 Global Const $CXMAXTRACK = 59 Global Const $CXMENUCHECK = 71 Global Const $CXMENUSIZE = 54 Global Const $CXMIN = 28 Global Const $CXMINIMIZED = 57 Global Const $CXMINSPACING = 47 Global Const $CXMINTRACK = 34 Global Const $CXPADDEDBORDER = 92 Global Const $CXSCREEN = 0 Global Const $CXSIZE = 30 Global Const $CXSIZEFRAME = 32 Global Const $CXSMICON = 49 Global Const $CXSMSIZE = 52 Global Const $CXVIRTUALSCREEN = 78 Global Const $CXVSCROLL = 2 Global Const $CYBORDER = 6 Global Const $CYCAPTION = 4 Global Const $CYCURSOR = 14 Global Const $CYDLGFRAME = 8 Global Const $CYDOUBLECLK = 37 Global Const $CYDRAG = 69 Global Const $CYEDGE = 46 Global Const $CYFIXEDFRAME = 8 Global Const $CYFOCUSBORDER = 84 Global Const $CYFRAME = 33 Global Const $CYFULLSCREEN = 17 Global Const $CYHSCROLL = 3 Global Const $CYICON = 12 Global Const $CYICONSPACING = 39 Global Const $CYKANJIWINDOW = 18 Global Const $CYMAXIMIZED = 62 Global Const $CYMAXTRACK = 60 Global Const $CYMENU = 15 Global Const $CYMENUCHECK = 72 Global Const $CYMENUSIZE = 55 Global Const $CYMIN = 29 Global Const $CYMINIMIZED = 58 Global Const $CYMINSPACING = 48 Global Const $CYMINTRACK = 35 Global Const $CYSCREEN = 1 Global Const $CYSIZE = 31 Global Const $CYSIZEFRAME = 33 Global Const $CYSMCAPTION = 51 Global Const $CYSMICON = 50 Global Const $CYSMSIZE = 53 Global Const $CYVIRTUALSCREEN = 79 Global Const $CYVSCROLL = 20 Global Const $CYVTHUMB = 9 Global Const $DBCSENABLED = 42 Global Const $DEBUG = 22 Global Const $DIGITIZER = 94 Global Const $IMMENABLED = 82 Global Const $MAXIMUMTOUCHES = 95 Global Const $MEDIACENTER = 87 Global Const $MENUDROPALIGNMENT = 40 Global Const $MIDEASTENABLED = 74 Global Const $MOUSEPRESENT = 19 Global Const $MOUSEHORIZONTALWHEELPRESENT = 91 Global Const $MOUSEWHEELPRESENT = 75 Global Const $NETWORK = 63 Global Const $PENWINDOWS = 41 Global Const $REMOTECONTROL = 0x2001 Global Const $REMOTESESSION = 0x1000 Global Const $SAMEDISPLAYFORMAT = 81 Global Const $SECURE = 44 Global Const $SERVERR = 289 Global Const $SHOWSOUNDS = 70 Global Const $SHUTTINGDOWN = 0x2000 Global Const $SLOWMACHINE = 73 Global Const $STARTER = 88 Global Const $SWAPBUTTON = 23 Global Const $TABLETPC = 86 Global Const $XVIRTUALSCREEN = 76 Global Const $YVIRTUALSCREEN = 77  
      WinAPISystemMetricsConstants.au3
    • b9k
      By b9k
      Hi, I am stuck on a GUI problem and would like your help to solve it.
      I am trying to automate the SoundWire Server app to match my current system volume level while it is minimized to the notification area (so no clicking or stealing focus),
      I can already get the handle and alter the tracker position by sending a WM_SETPOS message, but somehow the actual volume is not changed: I think I need to do something else to trigger the event handler for the value change and propagate it correctly.
      This is the control summary from Au3 info:
      >>>> Window <<<< Title: SoundWire Server Class: #32770 Position: 441, 218 Size: 566, 429 Style: 0x94CA00C4 ExStyle: 0x00050101 Handle: 0x0000000000510E12 >>>> Control <<<< Class: msctls_trackbar32 Instance: 4 ClassnameNN: msctls_trackbar324 Name: Advanced (Class): [CLASS:msctls_trackbar32; INSTANCE:4] ID: 6002 Text: Position: 51, 222 Size: 47, 126 ControlClick Coords: 1, 101 Style: 0x5001000A ExStyle: 0x00000000 Handle: 0x00000000001234C8 >>>> Mouse <<<< Position: 496, 567 Cursor ID: 2 Color: 0xF0F0F0 >>>> StatusBar <<<< >>>> ToolsBar <<<< >>>> Visible Text <<<< Default multimedia device Tray on Start Static Server Address: 192.168.1.8 Status: Connected to B9K~OP3 Audio Output Audio Input Level Record to File Input Select: 44.1 kHz Minimize to Master Volume Mute >>>> Hidden Text <<<< Slider2 Mute OK Cancel Label Balance Slider1 Volume Front L/R Fr C/LFE Side L/R Back L/R
      I am attaching the program in question so you don't have to install it (i don't know if it is portable enough, tough): 

      SoundWire Server_files.zip

      Thanks in advance and I hope I didn't post in the wrong section
    • chacoya121
      By chacoya121
      can someone plz explain how WinAPI work and some example script plz
    • Bilgus
      By Bilgus
      So first things first the example in the help file for _WinApi_Enum_Windows has an error
      ;_ArrayDisplay($aResult, "_WinAPI_EnumWindows", Default, Default, Default, Default, "#|Handle|Class|Title|Text|Process") Should Be _ArrayDisplay($aResult, "_WinAPI_EnumWindows", Default, Default, Default, "Handle|Class|Title|Text|Process") Next is a bit of helpful info on LPCSTR in a callback function it needs  to be passed as a PTR
      DllCallbackRegister($sFUNCT, $sRETURN, "ptr") Finally on to my question
      I'd want to call EnumPropsEX and pass a string through lparam + append to it rather than declaring anything globally
      I can Come up with two ways to do this The second it a lot more code but possibly safer but the first way I think Should do
      1. From a bit of testing It seems AutoIt won't overflow a DllStruct?
      2. Are strings passed through DLL call guaranteed to be 'an ANSI string (a minimum of 65536 chars is allocated)' as the Helpfile clearly states?
      #include <Array.au3> #include <WinAPI.au3> Example() Func Example() Local $aWindows = _WinAPI_EnumWindows() Local $aResult[$aWindows[0][0]][6] For $i = 1 To $aWindows[0][0] $aResult[$i - 1][0] = "0x" & Hex($aWindows[$i][0], 8) $aResult[$i - 1][1] = $aWindows[$i][1] $aResult[$i - 1][2] = WinGetTitle($aWindows[$i][0]) $aResult[$i - 1][3] = WinGetText($aWindows[$i][0]) $aResult[$i - 1][4] = WinGetProcess($aWindows[$i][0]) $aResult[$i - 1][5] = _ArrayToString(EnumProps($aWindows[$i][0]), ", ", 1) Next _ArrayDisplay($aResult, "_WinAPI_EnumWindows", Default, Default, Default, "Handle|Class|Title|Text|Process|Properties") EndFunc ;==>Example Func EnumProps($hWnd, $vDLL = 'user32.dll') ; Create callback function. Local $iErr = 0 Local $aProps[1] = [0] Local $hCb = DllCallbackRegister('_PropEnumProcEx', 'int', 'hwnd;ptr;handle;ptr') ; Call EnumPropsEx Local $aRet = DllCall($vDLL, 'int', 'EnumPropsEx', 'HWND', $hWnd, 'ptr', DllCallbackGetPtr($hCb), 'str', "") If @error Or Not $aRet[0] Then $iErr = @error ConsoleWrite("EnumProps Error:" & $iErr & @CRLF) ElseIf $aRet[3] <> "" Then $aProps = StringSplit($aRet[3], ";") EndIf DllCallbackFree($hCb) Return SetError($iErr, 0, $aProps) EndFunc ;==>EnumProps Func _PropEnumProcEx($hWnd, $sProp, $hData, $pStr) Local $iSzStr = _WinAPI_StringLenA($sProp) + 1 ; + Null Char If $iSzStr > 1 Then Local $tProp = DllStructCreate('char[' & $iSzStr & ']', $sProp) Local $tRetn = DllStructCreate('char[65535]', $pStr) DllStructSetData($tRetn, 1, DllStructGetData($tRetn, 1) & DllStructGetData($tProp, 1) & ";") EndIf Return 1 EndFunc ;==>_PropEnumProcEx ;-------------------------------------------------------------------------------------------------------------- Func EnumProps2($hWnd, $iSzBuffer = 4096, $vDLL = 'user32.dll') ; Create callback function. Local $iErr = 0 Local $sProps Local $aProps[1] = [0] Local $hCb = DllCallbackRegister('_PropEnumProcEx', 'int', 'hwnd;ptr;handle;ptr') Local $tProps = DllStructCreate('int;int;char[' & $iSzBuffer & ']') DllStructSetData($tProps, 1, $iSzBuffer) ;BufferSz DllStructSetData($tProps, 2, $iSzBuffer) ;BufferRemaining ; Call EnumPropsEx Local $aRet = DllCall($vDLL, 'int', 'EnumPropsEx', 'HWND', $hWnd, 'ptr', DllCallbackGetPtr($hCb), 'ptr', DllStructGetPtr($tProps)) If @error Or Not $aRet[0] Then $iErr = @error DllStructSetData($tProps, 2, 0) EndIf DllCallbackFree($hCb) $sProps = DllStructGetData($tProps, 3) If DllStructGetData($tProps, 2) > 0 Then If $sProps <> "" Then $aProps = StringSplit(StringTrimRight($sProps, 1), ";") EndIf Else If Not $iErr Then $iErr = 6 ;buffer overflow Return SetError($iErr, -DllStructGetData($tProps, 2), $aProps) EndIf Return $aProps EndFunc ;==>EnumProps2 Func _PropEnumProcEx2($hWnd, $sProp, $hData, $ptProp) Local $iSzStr = _WinAPI_StringLenA($sProp) + 1 Local $tProp = DllStructCreate('char[' & $iSzStr & ']', $sProp) If $iSzStr > 1 Then Local $sRet = DllStructGetData($tProp, 1) Local $iSzBuffer = DllStructGetData(DllStructCreate('int', $ptProp), 1) Local $tRetn = DllStructCreate('int;int;char[' & $iSzBuffer & ']', $ptProp) DllStructSetData($tRetn, 2, DllStructGetData($tRetn, 2) - $iSzStr) If DllStructGetData($tRetn, 2) > 0 Then DllStructSetData($tRetn, 3, DllStructGetData($tRetn, 3) & $sRet & ";") EndIf EndIf Return 1 EndFunc ;==>_PropEnumProcEx2  
    • r0ash
      By r0ash
      Hey guys, MattDiesel over Stackoverflow mentioned this beautiful piece of code 
      #include <WindowsConstants.au3> #include <WinAPI.au3> Local $IDM_FONT = 33 Local $hWindow = WinGetHandle("Untitled - Notepad") _WinAPI_PostMessage($hWindow, $WM_COMMAND, $IDM_FONT, 0) Local $hFontWin = WinWait("Font") $select = ControlCommand($hFontWin, "", "ComboBox1", "GetCurrentSelection", "") WinClose($hFontWin) MsgBox(0,"", $select) I realized that _WinAPI_PostMessage can trigger menu click event, even if Notepad is minimized.
      How do we know what is the decimal value of *any menu item or sub-menu item*? How we know "Format > Font" menu-item is 33 as wParam to _WinAPI_PostMessage()? Have a look at snapshot.
      Regards.

×