Guess who's back, Once again,
It's your friend outta Heartless Land...
Please do pardon my lame 2Pac reference rap :D!!
Issue #1:
According to MSDN, one can create a message only window using CreateWindow or CreateWindowEx by supplying HWND_MESSAGE to the hWndParent parameter. Googling HWND_MESSAGE shows that it's defined in "winuser.h" as (HWND)-3, which means that HWND_MESSAGE is -3 cast to HWND which in turn is defined as a pointer. Back to VB, I am still unsure whether to send CreateWindow -3 or VarPtr(-3).
Issue #2:
Full Code Link
1. Why is GetMyWndProc needed? What does it achieve?
2. Basically, this code subclasses the newly created button window (hwnd2) but never explicitly unsubclasses it. Does that mean that you shouldn't unsubclass a subclassed window that you created, or that you can omit subclassing, or is it simply wrong?
3. When creating a new window with a custom registered class, does linking it with your own WindProc function mean that this custom WindProc is now the default message handler for this class of windows (hence no need to subclass it later on)?
Thanks in advance.
It's your friend outta Heartless Land...
Please do pardon my lame 2Pac reference rap :D!!
Issue #1:
According to MSDN, one can create a message only window using CreateWindow or CreateWindowEx by supplying HWND_MESSAGE to the hWndParent parameter. Googling HWND_MESSAGE shows that it's defined in "winuser.h" as (HWND)-3, which means that HWND_MESSAGE is -3 cast to HWND which in turn is defined as a pointer. Back to VB, I am still unsure whether to send CreateWindow -3 or VarPtr(-3).
Issue #2:
Full Code Link
Code:
Dim hwnd2 As Long, hwnd3 As Long, old_proc As Long, new_proc As Long
Public Sub Main()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim lngTemp As Long
' Register class
If MyRegisterClass Then
' Window created?
If MyCreateWindow Then
' Change the button's procedures
' Point to new address
new_proc = GetMyWndProc(AddressOf ButtonProc)
old_proc = SetWindowLong(hwnd2, GWL_WNDPROC, new_proc)
' Message loop
MyMessageLoop
End If
' Unregister Class
MyUnregisterClass
End If
End Sub
Private Function MyRegisterClass() As Boolean
' WNDCLASS-structure
Dim wndcls As WNDCLASS
wndcls.style = CS_HREDRAW + CS_VREDRAW
wndcls.lpfnwndproc = GetMyWndProc(AddressOf MyWndProc)
wndcls.cbClsextra = 0
wndcls.cbWndExtra2 = 0
wndcls.hInstance = App.hInstance
wndcls.hIcon = 0
wndcls.hCursor = LoadCursor(0, IDC_ARROW)
wndcls.hbrBackground = COLOR_WINDOW
wndcls.lpszMenuName = 0
wndcls.lpszClassName = "myWindowClass"
' Register class
MyRegisterClass = (RegisterClass(wndcls) <> 0)
End Function
Private Sub MyUnregisterClass()
UnregisterClass "myWindowClass", App.hInstance
End Sub
Private Function MyCreateWindow() As Boolean
Dim hWnd As Long
' Create the window
hWnd = CreateWindowEx(0, "myWindowClass", "My Window", WS_OVERLAPPEDWINDOW, 0, 0, 400, 300, 0, 0, App.hInstance, ByVal 0&)
' The Button and Textbox are child windows
hwnd2 = CreateWindowEx(0, "Button", "My button", WS_CHILD, 50, 55, 100, 25, hWnd, 0, App.hInstance, ByVal 0&)
hwnd3 = CreateWindowEx(0, "edit", "My textbox", WS_CHILD, 50, 25, 100, 25, hWnd, 0, App.hInstance, ByVal 0&)
If hWnd <> 0 Then ShowWindow hWnd, SW_SHOWNORMAL
' Show them
ShowWindow hwnd2, SW_SHOWNORMAL
ShowWindow hwnd3, SW_SHOWNORMAL
' Go back
MyCreateWindow = (hWnd <> 0)
End Function
Private Function MyWndProc(ByVal hWnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case message
Case WM_DESTROY
' Destroy window
PostQuitMessage (0)
End Select
' calls the default window procedure
MyWndProc = DefWindowProc(hWnd, message, wParam, lParam)
End Function
Function GetMyWndProc(ByVal lWndProc As Long) As Long
GetMyWndProc = lWndProc
End Function
Private Sub MyMessageLoop()
Dim aMsg As Msg
Do While GetMessage(aMsg, 0, 0, 0)
DispatchMessage aMsg
Loop
End Sub
Private Function ButtonProc(ByVal hWnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim x As Integer
If (message = 533) Then
x = MsgBox("You clicked on the button", vbOKOnly)
End If
' calls the window procedure
ButtonProc = CallWindowProc(old_proc, hWnd, message, wParam, lParam)
End Function
2. Basically, this code subclasses the newly created button window (hwnd2) but never explicitly unsubclasses it. Does that mean that you shouldn't unsubclass a subclassed window that you created, or that you can omit subclassing, or is it simply wrong?
3. When creating a new window with a custom registered class, does linking it with your own WindProc function mean that this custom WindProc is now the default message handler for this class of windows (hence no need to subclass it later on)?
Thanks in advance.