The current windowsx.bi include file for FB v1.05 is not 100% converted correctly from its C source. Eventually the errors will be corrected but in the meantime I have posted a newer updated version of that file here (I have named the file windowsxx.bi so that it does not interfere with the original windowsx.bi).
Most of the changes involved adding the HANDLE_MSG macro and refactoring the various HANDLE_WM_* macros. There were also a few macros that failed because they used type definitions as macro parameters (eg. HPEN, HRGN, HFONT, HICON).
Using windowsxx.bi you can easily create message crackers as per this short example:
' //
' // Process WM_CREATE message for window/dialog: main
' //
Function main_OnCreate(ByVal HWnd As HWnd, ByVal lpCreateStructPtr As LPCREATESTRUCT) As BOOLEAN
' Message cracker macro expects a True to be returned for a successful
' OnCreate handler even though returning -1 from a standard WM_CREATE
' call would stop creating the window. This is just one of those Windows
' inconsistencies.
Return True
End Function
' //
' // Process WM_SIZE message for window/dialog: main
' //
Function main_OnSize(ByVal HWnd As HWnd, ByVal state As UINT, ByVal cx As Long, ByVal cy As Long) As LRESULT
Dim pWindow As CWindow Ptr
If state <> SIZE_MINIMIZED Then
' // Resize the button
pWindow = Cast(CWindow Ptr, GetWindowLongPtr(HWnd, 0))
pWindow->MoveWindow GetDlgItem(HWnd, IDCANCEL), pWindow->ClientWidth - 200, pWindow->ClientHeight - 90, 110, 23, CTRUE
End If
Function = 0
End Function
' //
' // Process WM_COMMAND message for window/dialog: main
' //
Function main_OnCommand(ByVal HWnd As HWnd, ByVal id As Long, ByVal hwndCtl As HWnd, ByVal codeNotify As UINT) As LRESULT
Select Case id
Case IDCANCEL
' If ESC key pressed, close the application sending an WM_CLOSE message
If codeNotify = BN_CLICKED Then
SendMessage HWnd, WM_CLOSE, 0, 0
End If
End Select
Function = 0
End Function
' //
' // Process WM_NOTIFY message for window/dialog: main
' //
Function main_OnNotify(ByVal HWnd As HWnd, ByVal id As Long, ByVal pNMHDR As NMHDR Ptr) As LRESULT
' Processs notify messages sent by the split button
'Dim pNmh As NMHDR Ptr = Cast(NMHDR Ptr, lParam)
If pNMHDR->idFrom = IDCANCEL And pNMHDR->code = BCN_DROPDOWN Then
Dim pDropDown As NMBCDROPDOWN Ptr = Cast(NMBCDROPDOWN Ptr, pNMHDR)
' // Get screen coordinates of the button
Dim pt As Point = (pDropdown->rcButton.Left, pDropDown->rcButton.bottom)
ClientToScreen(pNMHDR->hwndFrom, @pt)
' // Create a menu and add items
Dim hSplitMenu As HMENU = CreatePopupMenu
AppendMenuW(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND1, "Menu item 1")
AppendMenuW(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND2, "Menu item 2")
' // Display the menu
TrackPopupMenu(hSplitMenu, TPM_LEFTALIGN Or TPM_TOPALIGN, pt.x, pt.y, 0, HWnd, Null)
Return CTRUE
Exit Function
End If
Function = 0
End Function
' //
' // Process WM_DESTROY message for window/dialog: main
' //
Function main_OnDestroy(HWnd As HWnd) As LRESULT
ImageList_Destroy Cast(HIMAGELIST, SendMessageW(GetDlgItem(HWnd, IDCANCEL), TB_SETIMAGELIST, 0, 0))
PostQuitMessage(0)
Function = 0
End Function
' ========================================================================================
' Window procedure
' ========================================================================================
Function WndProc (ByVal HWnd As HWnd, ByVal uMsg As UINT, ByVal wParam As WPARAM, ByVal lParam As LPARAM) As LRESULT
Select Case uMsg
HANDLE_MSG (HWnd, WM_CREATE, main_OnCreate)
HANDLE_MSG (HWnd, WM_SIZE, main_OnSize)
HANDLE_MSG (HWnd, WM_DESTROY, main_OnDestroy)
HANDLE_MSG (HWnd, WM_COMMAND, main_OnCommand)
HANDLE_MSG (HWnd, WM_NOTIFY, main_OnNotify)
End Select
' for messages that we don't deal with
Function = DefWindowProcW(HWnd, uMsg, wParam, lParam)
End Function
' ========================================================================================
Here is the list of changes that I made to the original windowsx.bi
Modifications:
' - Types that cause macro to fail -
' HPEN
' HRGN
' HFONT
' HICON
' - Added macros -
' HANDLE_MSG
' - Modified macros -
' DeletePen
' SelectPen
' DeleteRgn
' DeleteFont
' SelectFont
' Static_SetIcon
' Static_GetIcon
' SetWindowFont & FORWARD_WM_SETFONT
' HANDLE_WM_COMPACTING
' HANDLE_WM_WININICHANGE
' HANDLE_WM_SYSCOLORCHANGE
' HANDLE_WM_PALETTEISCHANGING
' HANDLE_WM_PALETTECHANGED
' HANDLE_WM_FONTCHANGE
' HANDLE_WM_SPOOLERSTATUS
' HANDLE_WM_DEVMODECHANGE
' HANDLE_WM_TIMECHANGE
' HANDLE_WM_POWER
' HANDLE_WM_ENDSESSION
' HANDLE_WM_QUIT
' HANDLE_WM_DESTROY
' HANDLE_WM_NCDESTROY
' HANDLE_WM_SHOWWINDOW
' HANDLE_WM_SETREDRAW
' HANDLE_WM_ENABLE
' HANDLE_WM_SETTEXT
' HANDLE_WM_WINDOWPOSCHANGED
' HANDLE_WM_MOVE
' HANDLE_WM_SIZE
' HANDLE_WM_CLOSE
' HANDLE_WM_GETMINMAXINFO
' HANDLE_WM_PAINT
' HANDLE_WM_NCPAINT
' HANDLE_WM_DROPFILES
' HANDLE_WM_ACTIVATE
' HANDLE_WM_ACTIVATEAPP
' HANDLE_WM_SETFOCUS
' HANDLE_WM_KILLFOCUS
' HANDLE_WM_KEYDOWN
' HANDLE_WM_KEYUP
' HANDLE_WM_CHAR
' HANDLE_WM_DEADCHAR
' HANDLE_WM_SYSKEYDOWN
' HANDLE_WM_SYSKEYUP
' HANDLE_WM_SYSCHAR
' HANDLE_WM_SYSDEADCHAR
' HANDLE_WM_MOUSEMOVE
' HANDLE_WM_LBUTTONDOWN
' HANDLE_WM_LBUTTONDBLCLK
' HANDLE_WM_LBUTTONUP
' HANDLE_WM_RBUTTONDOWN
' HANDLE_WM_RBUTTONDBLCLK
' HANDLE_WM_RBUTTONUP
' HANDLE_WM_MBUTTONDOWN
' HANDLE_WM_MBUTTONDBLCLK
' HANDLE_WM_MBUTTONUP
' HANDLE_WM_MOUSEWHEEL
' HANDLE_WM_NCMOUSEMOVE
' HANDLE_WM_NCLBUTTONDOWN
' HANDLE_WM_NCLBUTTONDBLCLK
' HANDLE_WM_NCLBUTTONUP
' HANDLE_WM_NCRBUTTONDOWN
' HANDLE_WM_NCRBUTTONDBLCLK
' HANDLE_WM_NCRBUTTONUP
' HANDLE_WM_NCMBUTTONDOWN
' HANDLE_WM_NCMBUTTONDBLCLK
' HANDLE_WM_NCMBUTTONUP
' HANDLE_WM_CANCELMODE
' HANDLE_WM_TIMER
' HANDLE_WM_INITMENU
' HANDLE_WM_INITMENUPOPUP
' HANDLE_WM_MENUSELECT
' HANDLE_WM_COMMAND
' HANDLE_WM_HSCROLL
' HANDLE_WM_VSCROLL
' HANDLE_WM_CUT
' HANDLE_WM_COPY
' HANDLE_WM_PASTE
' HANDLE_WM_CLEAR
' HANDLE_WM_UNDO
' HANDLE_WM_RENDERALLFORMATS
' HANDLE_WM_DESTROYCLIPBOARD
' HANDLE_WM_DRAWCLIPBOARD
' HANDLE_WM_VSCROLLCLIPBOARD
' HANDLE_WM_HSCROLLCLIPBOARD
' HANDLE_WM_ASKCBFORMATNAME
' HANDLE_WM_CHANGECBCHAIN
' HANDLE_WM_SYSCOMMAND
' HANDLE_WM_MDIDESTROY
' HANDLE_WM_MDIACTIVATE
' HANDLE_WM_MDIRESTORE
' HANDLE_WM_MDIMAXIMIZE
' HANDLE_WM_MDIICONARRANGE
' HANDLE_WM_CHILDACTIVATE
' HANDLE_WM_PARENTNOTIFY
' HANDLE_WM_ENTERIDLE
' HANDLE_WM_SETFONT
' HANDLE_WM_DRAWITEM
' HANDLE_WM_MEASUREITEM
' HANDLE_WM_DELETEITEM
' HANDLE_WM_QUEUESYNC
' HANDLE_WM_COMMNOTIFY
' HANDLE_WM_DISPLAYCHANGE
' HANDLE_WM_CONTEXTMENU
' HANDLE_WM_COPYDATA
' HANDLE_WM_HOTKEY
' - Macros that still need to be looked at -
' HANDLE_WM_PAINTCLIPBOARD
' HANDLE_WM_SIZECLIPBOARD
' Edit_GetLine