Jump to content

RAGrid grid custom control


Go to solution Solved by LarsJ,

Recommended Posts

Trying to get a working example from code by funkey:

Added declarations from cited references, but the control looks empty, without returning errors:

#cs ----------------------------------------------------------------------------
funkey, Feb 8, 2012
https://www.autoitscript.com/forum/topic/137333-ragriddll/?do=findComment&comment=961420

RaGrid download:
;KetilO, 2009
;http://www.asmcommunity.net/forums/topic/?id=29679

Code examples:
https://bcxbasiccoders.com/bcxusers/ian/Miscellaneous%20Code.html
   bcx_raGridWrappers.inc
https://maul-esel.github.io/FormsFramework/files/RaGrid/RaGrid-ahk.html
;https://www.purebasic.fr/english/viewtopic.php?t=47141
#ce ----------------------------------------------------------------------------

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Color.au3>

; #CONSTANTS# ===================================================================================================================
;gnozal, Aug 11, 2011
;https://www.purebasic.fr/english/viewtopic.php?t=47141
;http://www.pbosl.purearea.net/pbosl_examples.zip [in .\pbosl_examples\PBOSL4\EXAMPLES\PBOSL_CreateGadget\ ]

;Messages
Global Const $GM_ADDCOL         = $WM_USER + 1  ;wParam=0, lParam=lpCOLUMN
Global Const $GM_ADDROW         = $WM_USER + 2  ;wParam=0, lParam=lpROWDATA (can be NULL)
Global Const $GM_INSROW         = $WM_USER + 3  ;wParam=nRow, lParam=lpROWDATA (can be NULL)
Global Const $GM_DELROW         = $WM_USER + 4  ;wParam=nRow, lParam=0
Global Const $GM_MOVEROW        = $WM_USER + 5  ;wParam=nFromRow, lParam=nToRow
Global Const $GM_COMBOADDSTRING = $WM_USER + 6  ;wParam=nCol, lParam=lpszString
Global Const $GM_COMBOCLEAR     = $WM_USER + 7  ;wParam=nCol, lParam=0
Global Const $GM_GETCURSEL      = $WM_USER + 8  ;wParam=0, lParam=0
Global Const $GM_SETCURSEL      = $WM_USER + 9  ;wParam=nCol, lParam=nRow
Global Const $GM_GETCURCOL      = $WM_USER + 10 ;wParam=0, lParam=0
Global Const $GM_SETCURCOL      = $WM_USER + 11 ;wParam=nCol, lParam=0
Global Const $GM_GETCURROW      = $WM_USER + 12 ;wParam=0, lParam=0
Global Const $GM_SETCURROW      = $WM_USER + 13 ;wParam=nRow, lParam=0
Global Const $GM_GETCOLCOUNT    = $WM_USER + 14 ;wParam=0, lParam=0
Global Const $GM_GETROWCOUNT    = $WM_USER + 15 ;wParam=0, lParam=0
Global Const $GM_GETCELLDATA    = $WM_USER + 16 ;wParam=nRowCol, lParam=lpData
Global Const $GM_SETCELLDATA    = $WM_USER + 17 ;wParam=nRowCol, lParam=lpData (can be NULL)
Global Const $GM_GETCELLRECT    = $WM_USER + 18 ;wParam=nRowCol, lParam=lpRECT
Global Const $GM_SCROLLCELL     = $WM_USER + 19 ;wParam=0, lParam=0
Global Const $GM_GETBACKCOLOR   = $WM_USER + 20 ;wParam=0, lParam=0
Global Const $GM_SETBACKCOLOR   = $WM_USER + 21 ;wParam=nColor, lParam=0
Global Const $GM_GETGRIDCOLOR   = $WM_USER + 22 ;wParam=0, lParam=0
Global Const $GM_SETGRIDCOLOR   = $WM_USER + 23 ;wParam=nColor, lParam=0
Global Const $GM_GETTEXTCOLOR   = $WM_USER + 24 ;wParam=0, lParam=0
Global Const $GM_SETTEXTCOLOR   = $WM_USER + 25 ;wParam=nColor, lParam=0
Global Const $GM_ENTEREDIT      = $WM_USER + 26 ;wParam=nCol, lParam=nRow
Global Const $GM_ENDEDIT        = $WM_USER + 27 ;wParam=nRowCol, lParam=fCancel
Global Const $GM_GETCOLWIDTH    = $WM_USER + 28 ;wParam=nCol, lParam=0
Global Const $GM_SETCOLWIDTH    = $WM_USER + 29 ;wParam=nCol, lParam=nWidth
Global Const $GM_GETHDRHEIGHT   = $WM_USER + 30 ;wParam=0, lParam=0
Global Const $GM_SETHDRHEIGHT   = $WM_USER + 31 ;wParam=0, lParam=nHeight
Global Const $GM_GETROWHEIGHT   = $WM_USER + 32 ;wParam=0, lParam=0
Global Const $GM_SETROWHEIGHT   = $WM_USER + 33 ;wParam=0, lParam=nHeight
Global Const $GM_RESETCONTENT   = $WM_USER + 34 ;wParam=0, lParam=0
Global Const $GM_COLUMNSORT     = $WM_USER + 35 ;wParam=nCol, lParam=0=Ascending, 1=Descending, 2=Invert
Global Const $GM_GETHDRTEXT     = $WM_USER + 36 ;wParam=nCol, lParam=lpBuffer
Global Const $GM_SETHDRTEXT     = $WM_USER + 37 ;wParam=nCol, lParam=lpszText
Global Const $GM_GETCOLFORMAT   = $WM_USER + 38 ;wParam=nCol, lParam=lpBuffer
Global Const $GM_SETCOLFORMAT   = $WM_USER + 39 ;wParam=nCol, lParam=lpszText
Global Const $GM_CELLCONVERT    = $WM_USER + 40 ;wParam=nRowCol, lParam=lpBuffer
Global Const $GM_RESETCOLUMNS   = $WM_USER + 41 ;wParam=0, lParam=0
Global Const $GM_GETROWCOLOR    = $WM_USER + 42 ;wParam=nRow, lParam=lpROWCOLOR
Global Const $GM_SETROWCOLOR    = $WM_USER + 43 ;wParam=nRow, lParam=lpROWCOLOR
Global Const $GM_GETCOLDATA     = $WM_USER + 44 ;wParam=nCol, lParam=lpCOLUMN

;Column alignment
Global Const $GA_ALIGN_LEFT   = 0
Global Const $GA_ALIGN_CENTER = 1
Global Const $GA_ALIGN_RIGHT  = 2

;Column types
Global Const $TYPE_EDITTEXT = 0         ;String
Global Const $TYPE_EDITLONG = 1         ;Long
Global Const $TYPE_CHECKBOX = 2         ;Long
Global Const $TYPE_COMBOBOX = 3         ;Long
Global Const $TYPE_HOTKEY   = 4         ;Long
Global Const $TYPE_BUTTON   = 5         ;String
Global Const $TYPE_IMAGE    = 6         ;Long
Global Const $TYPE_DATE     = 7         ;Long
Global Const $TYPE_TIME     = 8         ;Long
Global Const $TYPE_USER     = 9         ;0=String, 1 to 512 bytes binary data
Global Const $TYPE_EDITBUTTON = 10      ;String

;Column sorting
Global Const $SORT_ASCENDING = 0
Global Const $SORT_DESCENDING = 1
Global Const $SORT_INVERT = 2

;Window styles
Global Const $STYLE_NOSEL       = 0x1
Global Const $STYLE_NOFOCUS     = 0x2
Global Const $STYLE_HGRIDLINES  = 0x4
Global Const $STYLE_VGRIDLINES  = 0x8
Global Const $STYLE_GRIDFRAME   = 0x10
Global Const $STYLE_NOCOLSIZE   = 0x20

Global Const $ODT_GRID = 6

;~ Global Const $PB_EventType_Grid_HeaderClick        = 1           ;User clicked header
;~ Global Const $PB_EventType_Grid_ButtonClick        = 2           ;Sendt when user clicks the button in a button cell
;~ Global Const $PB_EventType_Grid_CheckClick           = 3         ;Sendt when user double clicks the checkbox in a checkbox cell
;~ Global Const $PB_EventType_Grid_ImageClick           = 4         ;Sendt when user double clicks the image in an image cell
;~ Global Const $PB_EventType_Grid_BeforeSelChange  = 5         ;Sendt when user request a selection change
;~ Global Const $PB_EventType_Grid_AfterSelChange   = 6         ;Sendt after a selection change
;~ Global Const $PB_EventType_Grid_BeforeEdit         = 7           ;Sendt before the cell edit control shows
;~ Global Const $PB_EventType_Grid_AfterEdit            = 8         ;Sendt when the cell edit control is about to close
;~ Global Const $PB_EventType_Grid_BeforeUpdate       = 9           ;Sendt before a cell updates grid data
;~ Global Const $PB_EventType_Grid_AfterUpdate        = 10      ;Sendt after grid data has been updated
;~ Global Const $PB_EventType_Grid_UserConvert        = 11      ;Sendt when user cell needs to be converted.

;funkey, Feb 8, 2012
;https://www.autoitscript.com/forum/topic/137333-ragriddll/?do=findComment&comment=961420
Global Const $__RAGRIDCONSTANT_DEFAULT_GUI_FONT = 17
Global Const $GN_HEADERCLICK = 1 ;User clicked header
Global Const $GN_BUTTONCLICK = 2 ;Sendt when user clicks the button in a button cell
Global Const $GN_CHECKCLICK = 3 ;Sendt when user double clicks the checkbox in a checkbox cell
Global Const $GN_IMAGECLICK = 4 ;Sendt when user double clicks the image in an image cell
Global Const $GN_BEFORESELCHANGE = 5 ;Sendt when user request a selection change
Global Const $GN_AFTERSELCHANGE = 6 ;Sendt after a selection change
Global Const $GN_BEFOREEDIT = 7 ;Sendt before the cell edit control shows
Global Const $GN_AFTEREDIT = 8 ;Sendt when the cell edit control is about to close
Global Const $GN_BEFOREUPDATE = 9 ;Sendt before a cell updates grid data
Global Const $GN_AFTERUPDATE = 10 ;Sendt after grid data has been updated
Global Const $GN_USERCONVERT = 11 ;Sendt when user cell needs to be converted.

Global $Form
Global $hGrid
Global $hLib
Global $hFont
Global $lf = DllStructCreate($tagLOGFONT)
Global Const $IDC_GRID = 101
Global $hWndSaveFocus = 0
;take a little time to fill grid on startup with a large number
Global Const $iRows = 500

Main()

Func Main()
FormLoad()
If @error = 0 Then
   ;WinFlash($Form)
   GUIRegisterMsg($WM_NCACTIVATE, "MY_WM_COMMAND")
   GUIRegisterMsg($WM_NOTIFY, "MY_WM_COMMAND")
   GUIRegisterMsg($WM_DESTROY, "MY_WM_COMMAND")

   While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
         Case $GUI_EVENT_CLOSE
            ExitLoop
         ;Case $IDC_GRID
            ;WinFlash($Form)
      EndSwitch
   WEnd
   GUIRegisterMsg($WM_NCACTIVATE, "")
   GUIRegisterMsg($WM_NOTIFY, "")
   GUIRegisterMsg($WM_DESTROY, "")
EndIf
$lf =0
EndFunc   ;==>Main

Func FormLoad()
Local $wx = 700
Local $wh = 500
$Form = GUICreate("RAGrid Sample Program", $wx, $wh, 0, 0)
$hLib = DllOpen(@ScriptDir & "\RAGrid.dll")
If $hLib <> -1 Then
   Local $style = BitOR($WS_CHILD, $WS_VISIBLE, $STYLE_HGRIDLINES, $STYLE_VGRIDLINES, $STYLE_GRIDFRAME, $STYLE_NOSEL)
   $hGrid = _WinAPI_CreateWindowEx(0, "RAGRID", "", $style, 10, 10, $wx - 15, $wh - 35, $Form, $IDC_GRID)
   If $hGrid Then
      GridSetup($hGrid)
      ColorTheGrid($hGrid, $iRows)
   EndIf
Else
  MsgBox(266288, "Error", "RaGrid.dll failed to load")
  GUIDelete($Form)
  Return SetError(1, 0, 0)
EndIf
GUISetState(@SW_SHOW)
EndFunc   ;==>FormLoad

Func MY_WM_COMMAND($hWnd, $CBMSG, $wParam, $lParam)
Switch $CBMSG
   Case $WM_NCACTIVATE
      If Not $wParam Then ; Save control focus
         $hWndSaveFocus = _WinAPI_GetFocus()
      ElseIf $hWndSaveFocus Then ; Restore control focus
         _WinAPI_SetFocus($hWndSaveFocus)
         $hWndSaveFocus = 0
      EndIf
   Case $WM_NOTIFY ;  Process grid notifications
      Local $pnmh = DllStructCreate("GRIDNOTIFY", $lParam)
      If DllStructGetData($pnmh, "hwndFrom") = $hGrid Then
         Switch DllStructGetData($pnmh, "Code")
            Case $GN_HEADERCLICK ;    Sort the grid by column, invert sorting order
               _SendMessage($hGrid, $GM_COLUMNSORT, DllStructGetData($pnmh, "col"), $SORT_INVERT)
               ColorTheGrid($hGrid, $iRows)
         EndSwitch
      EndIf
   Case $WM_DESTROY
      _WinAPI_DeleteObject($hFont)
EndSwitch
EndFunc   ;==>MY_WM_COMMAND

Func GridSetup($hWnd)
Local $lpzhdrtext, $lpsz, $r, $c, $z
Local $col = DllStructCreate("double;double;double;double;double;double;double;double;double;double;double;double")
;Local $col = DllStructCreate("long;long;long;long;long;long;long;long;long;long;long;long")
If @error Then
   MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), Default, "Error in DllStructCreate, Code: " & @error)
EndIf

For $i = 1 To 5 ; Create and format 5 columns
   $lpzhdrtext = DllStructCreate("wchar")
   DllStructSetData($lpzhdrtext, 1, Chr(64 + $i))
   DllStructSetData($col, "colwt", 130)
   DllStructSetData($col, "lpszhdrtext", DllStructGetPtr($lpzhdrtext))
   DllStructSetData($col, "halign", $GA_ALIGN_CENTER)
   DllStructSetData($col, "calign", $GA_ALIGN_CENTER)
   DllStructSetData($col, "ctype", $TYPE_EDITTEXT)
   DllStructSetData($col, "ctextmax", 31)
   DllStructSetData($col, "lpszformat", 0)
   DllStructSetData($col, "himl", 0)
   DllStructSetData($col, "hdrflag", 0)
   _SendMessage($hWnd, $GM_ADDCOL, 0, DllStructGetPtr($col))
Next

DllStructSetData($lf, "Height", -12) ;  Our grid will use 10 point Arial font
DllStructSetData($lf, "FaceName", "Arial")
$hFont = _WinAPI_CreateFontIndirect($lf)
_SendMessage($hGrid, $WM_SETFONT, $hFont, 0)

For $i = 1 To $iRows ; Create 32,765 blank rows
   _SendMessage($hGrid, $GM_ADDROW, 0, 0)
Next

For $r = 0 To $iRows - 1; Fill our grid with some data
   For $c = 0 To 4
      $z = String(Random(0, $iRows))
      $lpsz = DllStructCreate("char[" & StringLen($z) + 1 & "]")
      DllStructSetData($lpsz, 1, $z)
      _SendMessage($hGrid, $GM_SETCELLDATA, _WinAPI_MakeLong($c, $r), DllStructGetPtr($lpsz))
   Next
Next
EndFunc   ;==>GridSetup

Func ColorTheGrid($hWnd, $Rows)
Local $grc = DllStructCreate("double;double")
;Local $grc = DllStructCreate("long;long")

DllStructSetData($grc, "backcolor", _MakeRGB(0, 240, 230))
DllStructSetData($grc, "textcolor", 0)
For $i = 0 To $Rows - 1 Step 2
   _SendMessage($hWnd, $GM_SETROWCOLOR, $i, DllStructGetPtr($grc))
Next
DllStructSetData($grc, "backcolor", _MakeRGB(255, 255, 255))
DllStructSetData($grc, "textcolor", 0)
For $i = 1 To $Rows Step 2
   _SendMessage($hWnd, $GM_SETROWCOLOR, $i, DllStructGetPtr($grc))
Next
$grc = 0
EndFunc   ;==>ColorTheGrid

Func _MakeRGB($b, $g, $r)
Local $aRGB[3]
$aRGB[0] = $r
$aRGB[1] = $g
$aRGB[2] = $b
Return _ColorSetRGB($aRGB)
EndFunc   ;==>_MakeRGB
Link to post
Share on other sites
Posted (edited)

Now i'm more interested in trying to understand these examples in the forum for XPTable grid control:

.NET GUI XPTABLE Assembly.au3
.NET CLR Danyfirex Examples.au3 /  _Example4() ;XPTable Example

 

Other references:

Using C# and VB Code in AutoIt through .NET Framework

https://www.autoitscript.com/forum/topic/190490-dotnetau3-udf-to-access-net-framework-from-autoit/

https://www.codeproject.com/Articles/11596/XPTable-NET-ListView-meets-Java-s-JTable

https://github.com/schoetbi/XPTable

https://www.codeproject.com/Articles/19289/XPTable-NET-ListView-Update

https://www.autoitscript.com/forum/topic/187334-using-net-libary-with-autoit-possible/

Edited by robertocm
Reference added suggested by LarsJ
Link to post
Share on other sites

You can also add Using C# and VB Code in AutoIt through .NET Framework to the list of references above.

However, an approach based on one of the options already mentioned is probably both cumbersome and time consuming.

An easier solution is to try to simulate a grid control with a listview: Replace the entire row selection with a single cell selection, make it possible to move the selected cell around the listview with the arrow keys and finally make it possible to edit the selected cell. The listview should be a virtual listview with an array as the data source, so that when you edit a listview cell you store the new value directly in the data source.

Link to post
Share on other sites

I was trying to simulate multi cell selection

(sorry for the approach: copy&paste + try&error)

#cs ----------------------------------------------------------------------------
References:

LarsJ, March 22 '17
https://www.autoitscript.com/forum/topic/187622-listview-scroll-event/?do=findComment&comment=1347555

UEZ, Aug 30 '11
https://www.autoitscript.com/forum/topic/132416-winapi-drawing-on-top/?do=findComment&comment=922661

Malkey, March 9 '12
https://www.autoitscript.com/forum/topic/135728-how-to-i-draw-one-rectangle-on-screen/?do=findComment&comment=969520

Melba23, Dec 17 '11
https://www.autoitscript.com/forum/topic/135728-how-to-i-draw-one-rectangle-on-screen/?do=findComment&comment=947685

Help File
GUICreate / Extended Style table / $WS_EX_LAYERED / Example 2

A string grid (like a spread sheet)
martin, May 2009
#ce ----------------------------------------------------------------------------

#include <GDIPlus.au3>
#include <WinAPIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiListView.au3>
#include <WinAPIShellEx.au3>
#Include <Misc.au3>

Opt("MustDeclareVars", 1)
Opt("TrayIconDebug", 1)
Opt("MouseCoordMode", 2)

Global $iFire = 0
Global $nMsg
Global $GuiSizeX = 350, $GuiSizeY = 450
Global $iLvWith = $GuiSizeX - 4, $iLvHeight = 300
Global $sSel, $iFirstRow, $iFirstCol, $iRowsCount, $iColsCount, $iRowHeight, $iColWith = 100
Global $aColNam[3] = ["A", "B", "C"]
Global $iX1, $iY1, $iX2, $iY2

Global $hMainGUI = GUICreate("Listview_scroll_event_subclassing_listview_LarsJ", $GuiSizeX, $GuiSizeY)
;GUISetFont(Default, Default, Default, "Segoe UI")
Global $idListview = GUICtrlCreateListView("", 2, 2, $iLvWith, $iLvHeight)
Global $hListView = GUICtrlGetHandle($idListview)
;GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)

For $i = 0 To 2
   _GUICtrlListView_AddColumn($idListview, $aColNam[$i], $iColWith)
Next

For $i = 0 To 100
   GUICtrlCreateListViewItem("a" & $i + 1 & "|b" & $i + 1 & "|c" & $i + 1, $idListview)
Next

Global $aRect = _GUICtrlListView_GetSubItemRect($idListview, 0, 0)
;MsgBox($MB_SYSTEMMODAL, "Information", StringFormat("Subitem Rectangle : [%d, %d, %d, %d]", $aRect[0], $aRect[1], $aRect[2], $aRect[3]))
$iRowHeight = $aRect[3] - $aRect[1]
$sSel = "A1"

Global $iLbRangeSel = GUICtrlCreateLabel("", 10, $iLvHeight + 80, $GuiSizeX - 20, 60, $SS_CENTER + $SS_CENTERIMAGE)
GUICtrlSetBkColor(-1, 0xD8D8D8)
GUICtrlSetColor(-1, 0x439467)
GUICtrlSetFont(-1, 16, Default, Default, "Segoe UI Light")
;GUICtrlSetCursor(-1, 0)

Global $RangeSel = GUICtrlCreateButton("Multi Cell Selection / Region / Drag Area", 10, $iLvHeight + 10, $GuiSizeX - 20, 60)
GUICtrlSetFont(-1, 10, Default, Default, "Segoe UI")
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetCursor(-1, 0)

;Help File / GUICreate / Extended Style table / $WS_EX_LAYERED: [... ] Note that this cannot be used for child windows.
;But in Example 2: Local $hChild = GUICreate("", 210, 72, 20, 15, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGUI)
Global $hChild = GUICreate("Child", $GuiSizeX, $GuiSizeY, 1, 1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TRANSPARENT, $WS_EX_MDICHILD), $hMainGUI)
;Global $hChild = GUICreate("Child", $GuiSizeX, $GuiSizeY, 1, 1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TRANSPARENT, $WS_EX_MDICHILD, $WS_EX_TOPMOST), $hMainGUI)

Global $aPos = WinGetPos($hChild)
Global $g_iX = $aPos[0]
Global $g_iY = $aPos[1]
;MsgBox($MB_SYSTEMMODAL, "", "X-Pos: " & $aPos[0] & @CRLF & "Y-Pos: " & $aPos[1])

_DrawRect($aRect[0], $aRect[1], $iColWith, $iRowHeight)
GUISetState(@SW_SHOW, $hChild)

;LarsJ, March 22 '17
;https://www.autoitscript.com/forum/topic/187622-listview-scroll-event/?do=findComment&comment=1347555
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState(@SW_SHOW, $hMainGUI)

Global $pListViewCallback = DllCallbackGetPtr( DllCallbackRegister( "ListViewCallback", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr" ) )
_WinAPI_SetWindowSubclass( $hListView, $pListViewCallback, 9999, 0 )

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $RangeSel
         _RangeSelect()
   EndSwitch
WEnd

_WinAPI_RemoveWindowSubclass( $hListView, $pListViewCallback, 9999 )

;Delete the previous GUIs and all controls.
GUIDelete($hMainGUI)
GUIDelete($hChild)

Func ListViewCallback( $hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData )
   Switch $iMsg
      Case $WM_VSCROLL
         ConsoleWrite("ListViewCallback WM_VSCROLL" & @CRLF)
   EndSwitch

   ; Call next function in subclass chain
   Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )[0]
   #forceref $iSubclassId, $pData
EndFunc

Func WM_VSCROLL($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    ConsoleWrite("WM_VSCROLL" & @CRLF)
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_EXITSIZEMOVE

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
   #forceref $hWnd, $iMsg, $wParam, $lParam
   Local $tInfo
   Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
   Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
   Local $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
   Local $iCode = DllStructGetData($tNMHDR, "Code")
   Switch $hWndFrom
      Case $hListView
         Switch $iCode
            Case $LVN_BEGINSCROLL
               $iFire += 1
               ConsoleWrite("LVN_BEGINSCROLL " & $iFire & @CRLF)
               ;GUISetState(@SW_HIDE, $hChild)
            Case $LVN_ENDSCROLL
               $iFire += 1
               ConsoleWrite("LVN_ENDSCROLL " & $iFire & @CRLF)
               ;GUISetState(@SW_SHOW, $hChild)
            Case $LVN_BEGINDRAG ; A drag-and-drop operation involving the left mouse button is being initiated
               $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
               _RangeSelect()
         EndSwitch
   EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

;Malkey, March 9 '12
;https://www.autoitscript.com/forum/topic/135728-how-to-i-draw-one-rectangle-on-screen/?do=findComment&comment=969520
Func _DrawRect($x, $y, $w, $h)
   Local $hBitmap, $hGraphic
   Local $hWnd, $hDC, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend, $hPen
   Local $iOpacity = 255

   _GDIPlus_Startup()
   $hWnd = _WinAPI_GetDC(0)
   $hDC = _WinAPI_CreateCompatibleDC($hWnd)
   $hBitmap = _WinAPI_CreateCompatibleBitmap($hWnd, $GuiSizeX, $GuiSizeY)
   _WinAPI_SelectObject($hDC, $hBitmap)
   $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC)

   $hPen = _GDIPlus_PenCreate(0xFF008000, 2)

   $tSize = DllStructCreate($tagSIZE)
   $pSize = DllStructGetPtr($tSize)
   DllStructSetData($tSize, "X", $iLvWith)
   DllStructSetData($tSize, "Y", $iLvHeight)
   $tSource = DllStructCreate($tagPOINT)
   $pSource = DllStructGetPtr($tSource)
   $tBlend = DllStructCreate($tagBLENDFUNCTION)
   $pBlend = DllStructGetPtr($tBlend)
   DllStructSetData($tBlend, "Alpha", $iOpacity)
   DllStructSetData($tBlend, "Format", 1)

   _GDIPlus_GraphicsDrawRect($hGraphic, $x, $y, $w, $h, $hPen) ; <-- Graphics to layered wimdow.
   _GDIPlus_GraphicsDrawRect($hGraphic, $x + $w - 1, $y + $h - 1, 2, 2, $hPen)
   _WinAPI_UpdateLayeredWindow($hChild, $hWnd, 0, $pSize, $hDC, $pSource, 0, $pBlend, $ULW_ALPHA)

   _GDIPlus_PenDispose($hPen)
   _GDIPlus_GraphicsDispose($hGraphic)
   _WinAPI_ReleaseDC(0, $hWnd)
   _WinAPI_DeleteObject($hBitmap)
   _WinAPI_DeleteDC($hDC)
   _GDIPlus_Shutdown()
EndFunc   ;==>_DrawRect

Func _RangeSelect()
   Mark_Rect()
   ;MsgBox($MB_SYSTEMMODAL, "", StringFormat("[%d, %d, %d, %d]", $iX1, $iY1, $iX2, $iY2))
   ;GUISetState(@SW_SHOW, $hChild)
   ;GUISetState(@SW_SHOW, $hMainGUI)

   $iFirstCol = Floor($iX1/$iColWith)
   $iFirstRow = Floor($iY1/$iRowHeight)
   $iX1 = $iFirstCol * $iColWith
   $iY1 = $iFirstRow * $iRowHeight
   $iColsCount = Ceiling(($iX2 - $iX1) / $iColWith)
   $iRowsCount = Ceiling(($iY2 - $iY1) / $iRowHeight)
   _DrawRect($iX1, $iY1, $iColsCount * $iColWith, $iRowsCount * $iRowHeight)
   $sSel = $aColNam[$iFirstCol] & $iFirstRow & ":" & $aColNam[$iFirstCol + $iColsCount - 1] & $iFirstRow + $iRowsCount - 1 & @TAB & $iRowsCount & "R x " & $iColsCount  & "C"
   ;MsgBox($MB_SYSTEMMODAL, "Selection", $sSel)
   GUICtrlSetData($iLbRangeSel, $sSel)
EndFunc

;Melba23, Dec 17 '11
;https://www.autoitscript.com/forum/topic/135728-how-to-i-draw-one-rectangle-on-screen/?do=findComment&comment=947685
Func Mark_Rect()
   Local $aMouse_Pos, $hMask, $hMaster_Mask, $iTemp
   Local $UserDLL = DllOpen("user32.dll")

   ; Create transparent GUI with Cross cursor
   Local $hCross_GUI = GUICreate("Test", $iLvWith, $iLvHeight, $g_iX, $g_iY, $WS_POPUP, $WS_EX_TOPMOST)
   ;Local $hCross_GUI = GUICreate("Test", @DesktopWidth, @DesktopHeight - 20, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
   WinSetTrans($hCross_GUI, "", 8)
   GUISetState(@SW_SHOW, $hCross_GUI)
   GUISetCursor(3, 1, $hCross_GUI)

   Local $hRectangle_GUI = GUICreate("", $iLvWith, $iLvHeight, $g_iX, $g_iY, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
   ;Local $hRectangle_GUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
   GUISetBkColor(0x008000)

   ; Wait until mouse button pressed
   While Not _IsPressed("01", $UserDLL)
      Sleep(10)
   WEnd

   ; Get first mouse position
   $aMouse_Pos = MouseGetPos()
   $iX1 = $aMouse_Pos[0]
   $iY1 = $aMouse_Pos[1]

   ; Draw rectangle while mouse button pressed
   While _IsPressed("01", $UserDLL)
      $aMouse_Pos = MouseGetPos()

      $hMaster_Mask = _WinAPI_CreateRectRgn(0, 0, 0, 0)
      $hMask = _WinAPI_CreateRectRgn($iX1,  $aMouse_Pos[1], $aMouse_Pos[0],  $aMouse_Pos[1] + 1) ; Bottom of rectangle
      _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
      _WinAPI_DeleteObject($hMask)
      $hMask = _WinAPI_CreateRectRgn($iX1, $iY1, $iX1 + 1, $aMouse_Pos[1]) ; Left of rectangle
      _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
      _WinAPI_DeleteObject($hMask)
      $hMask = _WinAPI_CreateRectRgn($iX1 + 1, $iY1 + 1, $aMouse_Pos[0], $iY1) ; Top of rectangle
      _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
      _WinAPI_DeleteObject($hMask)
      $hMask = _WinAPI_CreateRectRgn($aMouse_Pos[0], $iY1, $aMouse_Pos[0] + 1,  $aMouse_Pos[1]) ; Right of rectangle
      _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
      _WinAPI_DeleteObject($hMask)
      ; Set overall region
      _WinAPI_SetWindowRgn($hRectangle_GUI, $hMaster_Mask)

      If WinGetState($hRectangle_GUI) < 15 Then GUISetState()
      Sleep(10)
   WEnd

   ; Get second mouse position
   $iX2 = $aMouse_Pos[0]
   $iY2 = $aMouse_Pos[1]

   ; Set in correct order if required
   If $iX2 < $iX1 Then
      $iTemp = $iX1
      $iX1 = $iX2
      $iX2 = $iTemp
   EndIf
   If $iY2 < $iY1 Then
      $iTemp = $iY1
      $iY1 = $iY2
      $iY2 = $iTemp
   EndIf

   GUIDelete($hRectangle_GUI)
   GUIDelete($hCross_GUI)
   DllClose($UserDLL)
EndFunc   ;==>Mark_Rect

 

Link to post
Share on other sites

After reading this tutorial about Dlls by Andreas Karlsson

Seems that below fix code for RAGRID control would be working (tested on Windows XP, AutoIt 3.3.14.5)

#cs ----------------------------------------------------------------------------
funkey, Feb 8, 2012
https://www.autoitscript.com/forum/topic/137333-ragriddll/?do=findComment&comment=961420

RaGrid download:
;KetilO, 2009
;http://www.asmcommunity.net/forums/topic/?id=29679

Code examples:
http://c--sphinx.narod.ru/exampl_e.htm
https://maul-esel.github.io/FormsFramework/files/RaGrid/RaGrid-ahk.html
https://www.purebasic.fr/english/viewtopic.php?t=47141
https://bcxbasiccoders.com/bcxusers/ian/Miscellaneous%20Code.html
   bcx_raGridWrappers.inc
#ce ----------------------------------------------------------------------------

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Color.au3>

; #CONSTANTS# ===================================================================================================================
;gnozal, Aug 11, 2011
;https://www.purebasic.fr/english/viewtopic.php?t=47141
;http://www.pbosl.purearea.net/pbosl_examples.zip [in .\pbosl_examples\PBOSL4\EXAMPLES\PBOSL_CreateGadget\ ]

;Messages
Global Const $GM_ADDCOL         = $WM_USER + 1  ;wParam=0, lParam=lpCOLUMN
Global Const $GM_ADDROW         = $WM_USER + 2  ;wParam=0, lParam=lpROWDATA (can be NULL)
Global Const $GM_INSROW         = $WM_USER + 3  ;wParam=nRow, lParam=lpROWDATA (can be NULL)
Global Const $GM_DELROW         = $WM_USER + 4  ;wParam=nRow, lParam=0
Global Const $GM_MOVEROW        = $WM_USER + 5  ;wParam=nFromRow, lParam=nToRow
Global Const $GM_COMBOADDSTRING = $WM_USER + 6  ;wParam=nCol, lParam=lpszString
Global Const $GM_COMBOCLEAR     = $WM_USER + 7  ;wParam=nCol, lParam=0
Global Const $GM_GETCURSEL      = $WM_USER + 8  ;wParam=0, lParam=0
Global Const $GM_SETCURSEL      = $WM_USER + 9  ;wParam=nCol, lParam=nRow
Global Const $GM_GETCURCOL      = $WM_USER + 10 ;wParam=0, lParam=0
Global Const $GM_SETCURCOL      = $WM_USER + 11 ;wParam=nCol, lParam=0
Global Const $GM_GETCURROW      = $WM_USER + 12 ;wParam=0, lParam=0
Global Const $GM_SETCURROW      = $WM_USER + 13 ;wParam=nRow, lParam=0
Global Const $GM_GETCOLCOUNT    = $WM_USER + 14 ;wParam=0, lParam=0
Global Const $GM_GETROWCOUNT    = $WM_USER + 15 ;wParam=0, lParam=0
Global Const $GM_GETCELLDATA    = $WM_USER + 16 ;wParam=nRowCol, lParam=lpData
Global Const $GM_SETCELLDATA    = $WM_USER + 17 ;wParam=nRowCol, lParam=lpData (can be NULL)
Global Const $GM_GETCELLRECT    = $WM_USER + 18 ;wParam=nRowCol, lParam=lpRECT
Global Const $GM_SCROLLCELL     = $WM_USER + 19 ;wParam=0, lParam=0
Global Const $GM_GETBACKCOLOR   = $WM_USER + 20 ;wParam=0, lParam=0
Global Const $GM_SETBACKCOLOR   = $WM_USER + 21 ;wParam=nColor, lParam=0
Global Const $GM_GETGRIDCOLOR   = $WM_USER + 22 ;wParam=0, lParam=0
Global Const $GM_SETGRIDCOLOR   = $WM_USER + 23 ;wParam=nColor, lParam=0
Global Const $GM_GETTEXTCOLOR   = $WM_USER + 24 ;wParam=0, lParam=0
Global Const $GM_SETTEXTCOLOR   = $WM_USER + 25 ;wParam=nColor, lParam=0
Global Const $GM_ENTEREDIT      = $WM_USER + 26 ;wParam=nCol, lParam=nRow
Global Const $GM_ENDEDIT        = $WM_USER + 27 ;wParam=nRowCol, lParam=fCancel
Global Const $GM_GETCOLWIDTH    = $WM_USER + 28 ;wParam=nCol, lParam=0
Global Const $GM_SETCOLWIDTH    = $WM_USER + 29 ;wParam=nCol, lParam=nWidth
Global Const $GM_GETHDRHEIGHT   = $WM_USER + 30 ;wParam=0, lParam=0
Global Const $GM_SETHDRHEIGHT   = $WM_USER + 31 ;wParam=0, lParam=nHeight
Global Const $GM_GETROWHEIGHT   = $WM_USER + 32 ;wParam=0, lParam=0
Global Const $GM_SETROWHEIGHT   = $WM_USER + 33 ;wParam=0, lParam=nHeight
Global Const $GM_RESETCONTENT   = $WM_USER + 34 ;wParam=0, lParam=0
Global Const $GM_COLUMNSORT     = $WM_USER + 35 ;wParam=nCol, lParam=0=Ascending, 1=Descending, 2=Invert
Global Const $GM_GETHDRTEXT     = $WM_USER + 36 ;wParam=nCol, lParam=lpBuffer
Global Const $GM_SETHDRTEXT     = $WM_USER + 37 ;wParam=nCol, lParam=lpszText
Global Const $GM_GETCOLFORMAT   = $WM_USER + 38 ;wParam=nCol, lParam=lpBuffer
Global Const $GM_SETCOLFORMAT   = $WM_USER + 39 ;wParam=nCol, lParam=lpszText
Global Const $GM_CELLCONVERT    = $WM_USER + 40 ;wParam=nRowCol, lParam=lpBuffer
Global Const $GM_RESETCOLUMNS   = $WM_USER + 41 ;wParam=0, lParam=0
Global Const $GM_GETROWCOLOR    = $WM_USER + 42 ;wParam=nRow, lParam=lpROWCOLOR
Global Const $GM_SETROWCOLOR    = $WM_USER + 43 ;wParam=nRow, lParam=lpROWCOLOR
Global Const $GM_GETCOLDATA     = $WM_USER + 44 ;wParam=nCol, lParam=lpCOLUMN

;Column alignment
Global Const $GA_ALIGN_LEFT   = 0
Global Const $GA_ALIGN_CENTER = 1
Global Const $GA_ALIGN_RIGHT  = 2

;Column types
Global Const $TYPE_EDITTEXT = 0         ;String
Global Const $TYPE_EDITLONG = 1         ;Long
Global Const $TYPE_CHECKBOX = 2         ;Long
Global Const $TYPE_COMBOBOX = 3         ;Long
Global Const $TYPE_HOTKEY   = 4         ;Long
Global Const $TYPE_BUTTON   = 5         ;String
Global Const $TYPE_IMAGE    = 6         ;Long
Global Const $TYPE_DATE     = 7         ;Long
Global Const $TYPE_TIME     = 8         ;Long
Global Const $TYPE_USER     = 9         ;0=String, 1 to 512 bytes binary data
Global Const $TYPE_EDITBUTTON = 10      ;String

;Column sorting
Global Const $SORT_ASCENDING = 0
Global Const $SORT_DESCENDING = 1
Global Const $SORT_INVERT = 2

;Window styles
Global Const $STYLE_NOSEL       = 0x1
Global Const $STYLE_NOFOCUS     = 0x2
Global Const $STYLE_HGRIDLINES  = 0x4
Global Const $STYLE_VGRIDLINES  = 0x8
Global Const $STYLE_GRIDFRAME   = 0x10
Global Const $STYLE_NOCOLSIZE   = 0x20

Global Const $ODT_GRID = 6

;~ Global Const $PB_EventType_Grid_HeaderClick        = 1           ;User clicked header
;~ Global Const $PB_EventType_Grid_ButtonClick        = 2           ;Sendt when user clicks the button in a button cell
;~ Global Const $PB_EventType_Grid_CheckClick           = 3         ;Sendt when user double clicks the checkbox in a checkbox cell
;~ Global Const $PB_EventType_Grid_ImageClick           = 4         ;Sendt when user double clicks the image in an image cell
;~ Global Const $PB_EventType_Grid_BeforeSelChange  = 5         ;Sendt when user request a selection change
;~ Global Const $PB_EventType_Grid_AfterSelChange   = 6         ;Sendt after a selection change
;~ Global Const $PB_EventType_Grid_BeforeEdit         = 7           ;Sendt before the cell edit control shows
;~ Global Const $PB_EventType_Grid_AfterEdit            = 8         ;Sendt when the cell edit control is about to close
;~ Global Const $PB_EventType_Grid_BeforeUpdate       = 9           ;Sendt before a cell updates grid data
;~ Global Const $PB_EventType_Grid_AfterUpdate        = 10      ;Sendt after grid data has been updated
;~ Global Const $PB_EventType_Grid_UserConvert        = 11      ;Sendt when user cell needs to be converted.

;funkey, Feb 8, 2012
;https://www.autoitscript.com/forum/topic/137333-ragriddll/?do=findComment&comment=961420
Global Const $__RAGRIDCONSTANT_DEFAULT_GUI_FONT = 17
Global Const $GN_HEADERCLICK = 1 ;User clicked header
Global Const $GN_BUTTONCLICK = 2 ;Sendt when user clicks the button in a button cell
Global Const $GN_CHECKCLICK = 3 ;Sendt when user double clicks the checkbox in a checkbox cell
Global Const $GN_IMAGECLICK = 4 ;Sendt when user double clicks the image in an image cell
Global Const $GN_BEFORESELCHANGE = 5 ;Sendt when user request a selection change
Global Const $GN_AFTERSELCHANGE = 6 ;Sendt after a selection change
Global Const $GN_BEFOREEDIT = 7 ;Sendt before the cell edit control shows
Global Const $GN_AFTEREDIT = 8 ;Sendt when the cell edit control is about to close
Global Const $GN_BEFOREUPDATE = 9 ;Sendt before a cell updates grid data
Global Const $GN_AFTERUPDATE = 10 ;Sendt after grid data has been updated
Global Const $GN_USERCONVERT = 11 ;Sendt when user cell needs to be converted.

Global $Form
Global $hGrid
Global $hLib
Global $hFont
Global $lf = DllStructCreate($tagLOGFONT)
Global Const $IDC_GRID = 101
Global $hWndSaveFocus = 0
;take a little time to fill grid on startup with a large number
Global Const $iRows = 500

Main()

Func Main()
FormLoad()
If @error = 0 Then
   ;WinFlash($Form)
   GUIRegisterMsg($WM_NCACTIVATE, "MY_WM_COMMAND")
   GUIRegisterMsg($WM_NOTIFY, "MY_WM_COMMAND")
   GUIRegisterMsg($WM_DESTROY, "MY_WM_COMMAND")

   While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
         Case $GUI_EVENT_CLOSE
            ExitLoop
         ;Case $IDC_GRID
            ;WinFlash($Form)
      EndSwitch
   WEnd
   GUIRegisterMsg($WM_NCACTIVATE, "")
   GUIRegisterMsg($WM_NOTIFY, "")
   GUIRegisterMsg($WM_DESTROY, "")
EndIf
$lf = 0
EndFunc   ;==>Main

Func FormLoad()
Local $wx = 700
Local $wh = 500
$Form = GUICreate("RAGrid Sample Program", $wx, $wh, 0, 0)
$hLib = DllOpen(@ScriptDir & "\RAGrid.dll")
If $hLib <> -1 Then
   Local $style = BitOR($WS_CHILD, $WS_VISIBLE, $STYLE_HGRIDLINES, $STYLE_VGRIDLINES, $STYLE_GRIDFRAME, $STYLE_NOSEL)
   $hGrid = _WinAPI_CreateWindowEx($WS_EX_CLIENTEDGE, "RAGrid", "", $style, 10, 10, $wx - 15, $wh - 35, $Form, $IDC_GRID)
   If $hGrid Then
      GridSetup($hGrid)
      ColorTheGrid($hGrid, $iRows)
   EndIf
Else
  MsgBox(266288, "Error", "RaGrid.dll failed to load")
  GUIDelete($Form)
  Return SetError(1, 0, 0)
EndIf
GUISetState(@SW_SHOW)
EndFunc   ;==>FormLoad

Func MY_WM_COMMAND($hWnd, $CBMSG, $wParam, $lParam)
Switch $CBMSG
   Case $WM_NCACTIVATE
      If Not $wParam Then ; Save control focus
         $hWndSaveFocus = _WinAPI_GetFocus()
      ElseIf $hWndSaveFocus Then ; Restore control focus
         _WinAPI_SetFocus($hWndSaveFocus)
         $hWndSaveFocus = 0
      EndIf
   Case $WM_NOTIFY ;  Process grid notifications
      Local $pnmh = DllStructCreate("GRIDNOTIFY", $lParam)
      If DllStructGetData($pnmh, "hwndFrom") = $hGrid Then
         Switch DllStructGetData($pnmh, "Code")
            Case $GN_HEADERCLICK ;    Sort the grid by column, invert sorting order
               _SendMessage($hGrid, $GM_COLUMNSORT, DllStructGetData($pnmh, "col"), $SORT_INVERT)
               ColorTheGrid($hGrid, $iRows)
         EndSwitch
      EndIf
   Case $WM_DESTROY
      _WinAPI_DeleteObject($hFont)
EndSwitch
EndFunc   ;==>MY_WM_COMMAND

Func GridSetup($hWnd)
Local $lpzhdrtext, $lpsz, $r, $c, $z
Local $col = DllStructCreate("UINT colwt;UINT lpszhdrtext;UINT halign;UINT calign;UINT ctype;UINT ctextmax;UINT lpszformat;UINT himl;UINT hdrflag")
If @error Then
   MsgBox($MB_SYSTEMMODAL, "ERROR", "Error: " &  _WinAPI_GetLastErrorMessage())
   MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), Default, "Error in DllStructCreate, Code: " & @error)
EndIf

For $i = 1 To 5 ; Create and format 5 columns
   $lpzhdrtext = DllStructCreate("wchar[1]")
   ;$lpzhdrtext = DllStructCreate("char[1]")
   DllStructSetData($lpzhdrtext, 1, Chr(64 + $i))
   DllStructSetData($col, "colwt", 130)
   DllStructSetData($col, "lpszhdrtext", DllStructGetPtr($lpzhdrtext))
   DllStructSetData($col, "halign", $GA_ALIGN_CENTER)
   DllStructSetData($col, "calign", $GA_ALIGN_CENTER)
   DllStructSetData($col, "ctype", $TYPE_EDITTEXT)
   DllStructSetData($col, "ctextmax", 31)
   DllStructSetData($col, "lpszformat", 0)
   DllStructSetData($col, "himl", 0)
   DllStructSetData($col, "hdrflag", 0)
   _SendMessage($hWnd, $GM_ADDCOL, 0, DllStructGetPtr($col))
Next

DllStructSetData($lf, "Height", -12) ;  Our grid will use 10 point Arial font
If @error Then
   MsgBox($MB_SYSTEMMODAL, "ERROR", "Error: " &  _WinAPI_GetLastErrorMessage())
   MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), Default, "Error in DllStructCreate, Code: " & @error)
EndIf

DllStructSetData($lf, "FaceName", "SEGOE IU")
If @error Then
   MsgBox($MB_SYSTEMMODAL, "ERROR", "Error: " &  _WinAPI_GetLastErrorMessage())
   MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), Default, "Error in DllStructCreate, Code: " & @error)
EndIf

$hFont = _WinAPI_CreateFontIndirect($lf)
_SendMessage($hGrid, $WM_SETFONT, $hFont, 0)
If @error Then
   MsgBox($MB_SYSTEMMODAL, "ERROR", "Error: " &  _WinAPI_GetLastErrorMessage())
   MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), Default, "Error in DllStructCreate, Code: " & @error)
EndIf

For $i = 1 To $iRows ; Create 32,765 blank rows
   _SendMessage($hGrid, $GM_ADDROW, 0, 0)
Next

If @error Then
   MsgBox($MB_SYSTEMMODAL, "ERROR", "Error: " &  _WinAPI_GetLastErrorMessage())
   MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), Default, "Error in DllStructCreate, Code: " & @error)
EndIf

For $r = 0 To $iRows - 1; Fill our grid with some data
   For $c = 0 To 4
      $z = String(Random(0, $iRows))
      $lpsz = DllStructCreate("char[" & StringLen($z) + 1 & "]")
      DllStructSetData($lpsz, 1, $z)
      _SendMessage($hGrid, $GM_SETCELLDATA, _WinAPI_MakeLong($c, $r), DllStructGetPtr($lpsz))
   Next
Next
EndFunc   ;==>GridSetup

Func ColorTheGrid($hWnd, $Rows)
Local $grc = DllStructCreate("UINT backcolor;UINT textcolor")

DllStructSetData($grc, "backcolor", _MakeRGB(0, 240, 230))
DllStructSetData($grc, "textcolor", 0)
For $i = 0 To $Rows - 1 Step 2
   _SendMessage($hWnd, $GM_SETROWCOLOR, $i, DllStructGetPtr($grc))
Next
DllStructSetData($grc, "backcolor", _MakeRGB(255, 255, 255))
DllStructSetData($grc, "textcolor", 0)
For $i = 1 To $Rows Step 2
   _SendMessage($hWnd, $GM_SETROWCOLOR, $i, DllStructGetPtr($grc))
Next
$grc = 0
EndFunc   ;==>ColorTheGrid

Func _MakeRGB($b, $g, $r)
Local $aRGB[3]
$aRGB[0] = $r
$aRGB[1] = $g
$aRGB[2] = $b
Return _ColorSetRGB($aRGB)
EndFunc   ;==>_MakeRGB

 

Edited by robertocm
Link to post
Share on other sites

nice custom control
tried it on win10 and AutoIt 3.3.14.5,
i used ragrid.dll 2.0.1.5 downloaded from here:
https://web.archive.org/web/20131126104818/http://www.oby.ro/rad_asm/projects/projects.html
and also with ragrid.dll 2.0.1.6 downloaded from here:
https://www.zhaodll.co/plus/download2.php?aid=150211
and it seems to work with both.
it would be interesting to have a list of properties and methods.

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By DJ143
      I have a autoit exe file which is used in upload/browse file functionality.  This has been integrated with selenium framework and I am invoking the autoit exe using Java process and runtime. 
      Now the issue is when I run the scripts and invoke the autoit exe in local it works perfectly.  But when I use selenium grid or jenkins to run the scripts in another windows server it is not working.
      Can anyone please suggest any solution for this?
    • By t0nZ
      Often I need to create a panel to monitor a lot of things (users, files, items etc) so I use this piece of code to create a dynamic grid of buttons.
      The number of buttons is variable, and it's related to the size of the gui, the size of the buttons and the distance between buttons.
      Every "button" is a set of three with a real button stacked on the top of two labels, imagine reading a .CSV file or an array or a database and displaying all the things using the labels (Text and COLOR too) and clickin' on the relative button you can call further info on the item or call a particular function.
      So you can decide the number of the buttons, the width of the buttons, and also the distance  between buttons.
      It's quick and dirty, simple  and very improvable (I know..) so fell free to play with the code.
      ;TEST ;GOL-Grill ;Grill test/template ; (c) 2019 NSC ; V.0.6 #Region ;************ Includes ************ #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <StaticConstants.au3> #include <EditConstants.au3> #include <ProgressConstants.au3> #include <_GOLLOG.au3>; NSC first UDF #EndRegion ;************ Includes ************ Dim $agButton[1] Global $ButtonU, $rProgress, $form1, $labeltot, $ntotButtonS ; the number of buttons is variable based on the guisize, the button size and button distance, three examples.... ;Global $guiwidth = 850, $guiheight = 500, $buttonW = 150, $buttonHDistance = 10, $buttonVDistance = 20 ; SMALL GUI / BIG BUTTONS <- try it ! Global $guiwidth = 1500, $guiheight = 700, $buttonW = 90 , $buttonHDistance = 29, $buttonVDistance = 3; BIG GUI / SMALL BUTTONS ;Global $guiwidth = 1200, $guiheight = 800, $buttonW = 300, $buttonHDistance = 30, $buttonVDistance = 7; last two variables are horizontal and vertical distance between buttons Global $ver = "V.0.6" Gollog(">>>>> START") Dim $aResult[11] = [10, "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] ; this is an example, it can be an array, a DB, a .text file read in real time. Gui() Gollog("start analyzing...") Monitor() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE CLOSEClicked() Exit Case $ButtonU Monitor() Case Else For $i = 1 To $ntotButtonS If $nMsg = $agButton[$i] Then $Bhit = GUICtrlRead($agButton[$i]) infoB($Bhit) EndIf Next EndSwitch WEnd Func Gui() $form1 = GUICreate("Buttons on a grill " & $ver & " (c) NSC 2019", $guiwidth, $guiheight, 90, 10) $ButtonU = GUICtrlCreateButton("Update", 2, 2, 170, 50) $labeltot = GUICtrlCreateLabel("Total found", 5, 55) $Gollogedit = GUICtrlCreateEdit("", 2, $guiheight - 255, 180, 250, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN, $WS_BORDER)) $rProgress = GUICtrlCreateProgress($guiwidth - 18, 5, 16, $guiheight - 7, BitOR($PBS_SMOOTH, $PBS_VERTICAL, $WS_BORDER)) GUICtrlSetColor(-1, 0x00FF00) GUICtrlSetBkColor(-1, 0x000000) GUISetState(@SW_SHOW) EndFunc ;==>Gui Func Monitor() GUIDelete($form1) Gui() $leftSTART = 186 ;left align $topSTART = 5 ;start from top $lineDOWN = 45 + $buttonVDistance ; vertical line distance 45 is buttons very near $extraHSTEP = 3 ; extra line distance $buttonSEMIH = 15 ; height of one of the 3 vertical impiled semibuttons $separatorSEMIH = 2 ;vertical distance between 3 semibuttons $separatorW = 2 ;aux horizontal distance ;---------- derived measures $rightLIMIT = $guiwidth - 123 ; right limit befor Carriage Return $leftINCREMENT = $buttonHDistance + $buttonW ; horizontal increment button after button $leftSTEP = $leftSTART ;incremental horizontal $topSTEP = $topSTART ;incremental vertical $foundB = $aResult[0] GUICtrlSetData($labeltot, "Found n°" & $foundB) $ntotButtonS = 0 $nomorebuttons = 0 For $i = 1 To $foundB Local $itemFound = $aResult[$i] ;\TA1000 Gollog($itemFound) GUICtrlCreateGroup('', $leftSTEP, $topSTEP - 3, $buttonW + 3, 50) ;______first-----------------------------_______line___________________UNO________11111_____\\\\\\\\\\------------ Local $textbutton = "button n°" & $i _ArrayAdd($agButton, GUICtrlCreateButton($textbutton, $leftSTEP + $separatorSEMIH, $topSTEP + $extraHSTEP, $buttonW, $buttonSEMIH, $BS_flat)) GUICtrlSetBkColor(-1, 0xccffcc) ;green, sort of GUICtrlSetFont(-1, 7, -1, -1, 'verdana') GUICtrlSetColor(-1, 0x000000) ;___second__________line___________________DUE ________222222-------------------------------------------------------------------- Local $textLINE2 = $itemFound GUICtrlCreateLabel($textLINE2, $leftSTEP + $separatorW, $topSTEP + $buttonSEMIH + $separatorSEMIH, $buttonW, $buttonSEMIH, BitOR($SS_CENTER, $SS_CENTERIMAGE)) GUICtrlSetBkColor(-1, 0xD2D7A8) GUICtrlSetFont(-1, 7, -1, -1, 'verdana') GUICtrlSetColor(-1, 0x000000) ; __third______line________tre___________________________________________________________333333-3333333-333333333-333333-33333-33333-3333-------------------------------- Local $textLINE3 = "line3" GUICtrlCreateLabel($textLINE3, $leftSTEP + $separatorW, $topSTEP + $buttonSEMIH + $buttonSEMIH + $separatorSEMIH, $buttonW, $buttonSEMIH, BitOR($SS_CENTER, $SS_CENTERIMAGE)) ; NSC modify GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont(-1, 7, -1, -1, 'verdana') GUICtrlSetColor(-1, 0x000000) $ntotButtonS += 1 GUICtrlSetData($rProgress, (100 * $ntotButtonS / $foundB)) If $leftSTEP + $buttonW < $rightLIMIT Then ; $leftSTEP += $leftINCREMENT ;53 Else $leftSTEP = $leftSTART $topSTEP += $lineDOWN If $topSTEP >= $guiheight - 50 Then $nomorebuttons = 1 Gollog("displayed " & $ntotButtonS & " buttons") Gollog("NO more buttons !") EndIf EndIf Sleep(100) ; REMOVE is only for demo Next While $nomorebuttons = 0 ; draw empty buttons (nice to do) $ntotButtonS += 1 _ArrayAdd($agButton, GUICtrlCreateButton("B-" & $ntotButtonS, $leftSTEP + $separatorSEMIH, $topSTEP + $extraHSTEP, $buttonW, $buttonSEMIH, $BS_flat)) If $leftSTEP + $buttonW < $rightLIMIT Then ; $leftSTEP += $leftINCREMENT Else $leftSTEP = $leftSTART $topSTEP += $lineDOWN If $topSTEP >= $guiheight - 50 Then $nomorebuttons = 1 Gollog("displayed " & $ntotButtonS & " buttons") Gollog("NO more buttons !") EndIf EndIf WEnd GUISetState(@SW_SHOW) EndFunc ;==>Monitor Func infoB($Bhit) ; this function act on the pressed button, it's an example so assign the task you need. gollog("infoB -> " & $Bhit) EndFunc ;==>infoB Func CLOSEClicked() MsgBox(64, "exit", "program exiting", 1) Gollog("<---STOP") Exit EndFunc ;==>CLOSEClicked You will need also the Include from this post for the LOG (Gollog) instructions, but you can also just remove the gollog and the EDIT box.
      Look at the screenshot, It's from an APP made using this code.

      21/11/2019 V.0.6
      Script lightly updated with better management of buttons size and distance.
       
    • By mike2003
      Is it possible to combine this?

      like this
      #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> Example() Func Example() GUICreate("listview items", 220, 250, 100, 200, -1) ;~ Local $idListview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150, -1, $LVS_EX_GRIDLINES) Local $idListview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150, $LVS_LIST, $LVS_EX_GRIDLINES) Local $idItem1 = GUICtrlCreateListViewItem("item2|col22|col23", $idListview) Local $idItem2 = GUICtrlCreateListViewItem("item1|col12|col13", $idListview) Local $idItem3 = GUICtrlCreateListViewItem("item3|col32|col33", $idListview) GUISetState(@SW_SHOW) GUICtrlDelete($idItem1) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd EndFunc ;==>Example  
    • By Rowdy
      Hi
      Does anyone know how to retrieve the contents (row & column data) of a VB6 MSFlexGrid control using the AutoItx DLLs in a C# program?
      Thankyou
      Rowdy
    • By redrider81
      I have taken a look at GUICtrlCreateListView and the Table.UDF created by AndyBiochem (great job). I can't see any sign or mention of whether or not there is any way to build a table or grid view where the data in the boxes can be updated. I also don't see anywhere that says they are read only, so I am not sure. 
      Thanks to anyone who can confirm my assumption that it's not possible to edit any grid or table view in AutoIt.
×
×
  • Create New...