Here is my code :
' Subclassing in a Dialog
$ filename "DlgSubclass.exe"
uses rtl32
'uses rtl64
'% review
uses dialogs
! SetWindowLong Lib "user32.dll" Alias "SetWindowLongA"(hwnd AS INT,nIndex AS INT,dwNewLong AS INT) as INT
! SetWindowLongPtr Lib "user32.dll" Alias "SetWindowLongA"(ByVal hWnd As Int,byVal nIndex As Int, ByVal dwNewLong As Int) As Int
! SetProp Lib "user32.dll" Alias "SetPropA" (ByVal hWnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
! GetProp Lib "user32.dll" Alias "GetPropA" (ByVal hWnd As Long, ByVal lpString As String) As Long
! CallWindowProc Lib "user32.dll" Alias "CallWindowProcA"(lpPrevWndFunc AS INT,hWnd AS INT,Msg AS INT,wParam AS INT,lParam AS INT) as INT
! RemoveProp Lib "user32.dll" Alias "RemovePropA" (ByVal hWnd As Long, ByVal lpString As String) As Long
% GWLP_WNDPROC= -4
% DS_3DLOOK 0x0004L
% DS_NOFAILCREATE 0x0010L
% DS_MODALFRAME 0x80L
% DS_CENTER = 2048
'Equates
% IDC_EDIT = 1001
% IDC_LABEL = 1002
sys hEdit
sys hLabel
int hDlg
'=================================
sub WinMain()
hDlg = Dialog( 0, 0, 302, 160, "Edit Subclass in a Dialog",
WS_POPUP | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_CLIPSIBLINGS | WS_VISIBLE | DS_MODALFRAME | DS_3DLOOK | DS_NOFAILCREATE | DS_SETFONT | DS_CENTER,
8, "MS Sans Serif",
WS_EX_CONTROLPARENT | WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR)
EDITTEXT("", IDC_EDIT, 8, 8, 217, 84,
WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | WS_VISIBLE | ES_WANTRETURN | ES_LEFT | WS_BORDER,
WS_EX_CLIENTEDGE)
LText( "", IDC_LABEL, 8, 110, 120, 24)
CreateModalDialog( null, @DlgProc, 0, 0) '<- missmatch here
'CreateModalDialog( sys hParent, sys *lpDialogProc, dwInitParam, lpdt) as sys
end sub
WinMain()
'=================================
function DlgProc( sys hDlg, uint uMsg, sys wParam, lParam ) as sys callback
hEdit = GetDlgItem(hDlg, IDC_EDIT)
hLabel = GetDlgItem(hDlg, IDC_LABEL)
select case uMsg
case WM_INITDIALOG
SetProp(hEdit, "OldEditProc", SetWindowLongPtr(hEdit, GWLP_WNDPROC, @EditProc))
case WM_CLOSE
'Remove control subclassing
'RemoveProp(hEdit, "OldEditProc", GetWindowLongPtr(hEdit, GWLP_WNDPROC, @EditProc))
RemoveProp( hEdit, "OldEditProc")
EndDialog( hDlg, null )
end select
return 0
end function
'======================================
' Subclass procedure for the Edit control to detect what ASCII values were key in
function EditProc(sys hDlg, uint wMsg, sys wParam, lParam) as sys callback
select case wMsg
case WM_KEYDOWN
SetWindowText (hLabel, "You have entered ASCII " str(wParam))
end select
return CallWindowProc(GetProp(hEdit, "OldEditProc"), hEdit, wMsg, wParam, lParam)
end function