Jump to content

RAGrid grid custom control


Go to solution Solved by LarsJ,

Recommended Posts

On 6/15/2021 at 12:09 PM, dmob said:

I found this GRIDNOTIFY structure defined in the RAGrid.inc file, but have NO idea how to define in AutoIt

Try something similar to this:

Global $tagGRIDNOTIFY = $tagNMHDR & ";UINT col;UINT row;UINT hwnd;ptr lpdata;UINT fcancel"

The example with some of the notifications working:

#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 $tagGRIDNOTIFY = $tagNMHDR & ";UINT col;UINT row;UINT hwnd;ptr lpdata;UINT fcancel"
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($tagGRIDNOTIFY, $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)
               ConsoleWrite("$GN_HEADERCLICK, Col: " & DllStructGetData($pnmh, "col") & @CRLF)
            Case $GN_BEFORESELCHANGE ;User request a selection change
               _SendMessage($hGrid, $GM_GETCURSEL, 0, 0)
               ConsoleWrite("$GN_BEFORESELCHANGE Row: " & DllStructGetData($pnmh, "row") & " Col: " & DllStructGetData($pnmh, "col") & @CRLF)
            Case $GN_AFTERSELCHANGE ;after a selection change
               ConsoleWrite("$GN_AFTERSELCHANGE" & @CRLF)
            Case $GN_BEFOREEDIT ;before the cell edit control shows
               ConsoleWrite("$GN_BEFOREEDIT" & @CRLF)
            Case $GN_AFTEREDIT ;when the cell edit control is about to close
               ConsoleWrite("$GN_AFTEREDIT Data:" & DllStructGetData($pnmh, "lpdata") & @CRLF) ;not working: not returning data
            Case $GN_BEFOREUPDATE ;before a cell updates grid data
               ConsoleWrite("$GN_BEFOREUPDATE" & @CRLF)
            Case $GN_AFTERUPDATE ;after grid data has been updated
               ConsoleWrite("$GN_AFTERUPDATE" & @CRLF)
         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

 

Link to comment
Share on other sites

Thank you @robertocm I had already worked it out and receiving messages. I was able to block specific column edit.

In your code, I think the $GN_AFTEREDIT isn't working coz lpdata is a pointer. I haven't gotten that far in my trial to

verify that, I'm still stuck trying to figure out the column format routine. The demo ASM code executes 3 headaches per minute :sweating:

I appreciate your help very much.

Edited by dmob
Link to comment
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
 Share

×
×
  • Create New...