Creating a menu from a resource

by Jon Ripley, June 2006

The normal method of creating a menu is to use the Windows API functions “CreateMenu”, “CreatePopupMenu” and “AppendMenu” to create a menu structure:

        SYS "CreatePopupMenu" TO m_file%
        SYS "AppendMenu", m_file%, 0, 100, "&New"+CHR$9+"Ctrl+N"
        SYS "AppendMenu", m_file%, 0, 101, "&Open"+CHR$9+"Ctrl+O"
        SYS "AppendMenu", m_file%, 0, 102, "&Save"+CHR$9+"Ctrl+S"
        SYS "AppendMenu", m_file%, 0, 103, "Save &As"+CHR$9+"Ctrl+A"
        SYS "AppendMenu", m_file%, 2048, 104, " "
        SYS "AppendMenu", m_file%, 0, 105, "E&xit"+CHR$9+"Alt+F4"
        SYS "CreateMenu" TO m_main%
        SYS "AppendMenu", m_main%, 16, m_file%, "&File"
        SYS "SetMenu", @hwnd%, m_main%
        SYS "DrawMenuBar", @hwnd%

However there may be circumstances when the menu has already been designed and its template is contained as a resource within a DLL or EXE file. In that case you can create the menu in your program using the resource data. The code example below creates a menu from the resource data for the BB4W IDE menu (in BBCWIN.EXE or BBCWDEM.EXE):

        REM Acquire handle to BBCWIN.EXE or BBCWDEM.EXE
        SYS "GetModuleHandle", 0 TO hmod%
 
        REM Load menu template into memory
        SYS "LoadMenu", hmod%, "BBCWIN" TO hmenu%
        SYS "LockResource", hmenu%
        REM Attach menu to main window
        SYS "SetMenu", @hwnd%, hmenu%
        REM Draw the menu
        SYS "DrawMenuBar", @hwnd%
 
        REM Your program goes here...
 
        REM Destroy the menu and free used memory
        SYS "DestroyMenu", hmenu% TO ret%

Naturally this code will only run within the BB4W IDE, because if compiled to an executable file the menu resource data will not be present.

To load the menu resource data from a different file (for example a DLL) then replace the call to “GetModuleHandle” with a call to “LoadLibrary” as follows:

        SYS "LoadLibrary", "EXAMPLE.DLL" TO hmod%