windowsx.bi (Message Crackers and other macros)

Started by Paul Squires, May 05, 2016, 06:00:18 PM

Previous topic - Next topic

Paul Squires

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



Paul Squires
PlanetSquires Software