API Questions
#7
Can anyone figure out why the Windows Menu code here in the wiki: https://qb64phoenix.com/qb64wiki/index.p...ndows_Menu

does not work?

I went extensively through the Microsoft docs and found two things that may be a problem.

First, the UDT MENUITEMINFO:

TYPE MENUITEMINFO
    cbSize AS LONG
    fMask AS LONG
    fType AS LONG
    fState AS LONG
    wID AS LONG
    hSubMenu AS LONG
    hbmpChecked AS LONG
    hbmpUnchecked AS LONG
    dwItemData AS _OFFSET
    dwTypeData AS _OFFSET
    cch AS LONG
    'hbmpItem AS LONG <--- this not in original but specified in Microsoft docs.
END TYPE

seems to be missing hbmpItem (I added it above remmed out).

Second, the function DrawMenuBar is not used anywhere in the code to actually generate the menu. I'm wondering if somehow some of the code has been omitted during a copy/paste into this Wiki?

CreateMenu is returning a valid hMenu handle value. I believe the problem is with the first InsertMenuItemA function encountered, but according to what I've read in the docs it's structure appears fine.

Code: (Select All)
DEFLNG A-Z

CONST MIIM_STATE = &H1
CONST MIIM_ID = &H2
CONST MIIM_TYPE = &H10
CONST MFT_SEPARATOR = &H800
CONST MFT_STRING = &H0
CONST MFS_ENABLED = &H0
CONST MFS_CHECKED = &H8

CONST HWND_TOPMOST = -1
CONST HWND_NOTOPMOST = -2
CONST SWP_NOMOVE = &H2
CONST SWP_NOSIZE = &H1
'-----------------------------------------------------------------------------------

TYPE MENUITEMINFO
    cbSize AS LONG
    fMask AS LONG
    fType AS LONG
    fState AS LONG
    wID AS LONG
    hSubMenu AS LONG
    hbmpChecked AS LONG
    hbmpUnchecked AS LONG
    dwItemData AS _OFFSET
    dwTypeData AS _OFFSET
    cch AS LONG
END TYPE

DECLARE LIBRARY
    FUNCTION FindWindow& (BYVAL ClassName AS _OFFSET, WindowName$) ' To get hWnd handle
END DECLARE

DECLARE DYNAMIC LIBRARY "user32"
  FUNCTION CreateMenu& ()
  FUNCTION DrawMenuBar (BYVAL hWnd&)
  FUNCTION SetMenu& (BYVAL hWnd&, BYVAL hMenu&)
  FUNCTION InsertMenuItemA& (BYVAL hMenu&, BYVAL uItem&, BYVAL fByPosition&, BYVAL lpmii AS _OFFSET)
  FUNCTION GetMenuItemCount& (BYVAL hMenu&)
  FUNCTION GetMenuItemInfoA& (BYVAL hMenu&, BYVAL uItem&, BYVAL fByPosition&, BYVAL lpmii AS _OFFSET)
END DECLARE

DIM hWnd AS LONG
DIM hMenu AS LONG
DIM MenuItem AS MENUITEMINFO, BlankMenuItem AS MENUITEMINFO
DIM TypeData AS STRING * 1000

_TITLE "Menu bar API demo"
hWnd = _WINDOWHANDLE 'FindWindow(0, "Menu bar API demo" + CHR$(0))

hMenu = CreateMenu: BlankMenuItem.cbSize = LEN(BlankMenuItem)

COLOR 7, 1: CLS

'Add a separator bar
count = GetMenuItemCount(hMenu): PRINT "MenuItemCount:"; count
MenuItem = BlankMenuItem
MenuItem.fMask = MIIM_ID OR MIIM_TYPE
MenuItem.fType = MFT_SEPARATOR
MenuItem.wID = count
IF InsertMenuItemA(hMenu, count, 1, _OFFSET(MenuItem)) THEN PRINT "Successfully added menu item!" ELSE PRINT "Failed to add menu item!": END

'Add a button
MenuItem = BlankMenuItem
count = GetMenuItemCount(hMenu): PRINT "MenuItemCount:"; count
MenuItem.fMask = MIIM_STATE OR MIIM_ID OR MIIM_TYPE
MenuItem.fType = MFT_STRING
MenuItem.fState = MFS_ENABLED
MenuItem.wID = count
TypeData = "&Fire Laser!" + CHR$(0)
MenuItem.dwTypeData = _OFFSET(TypeData)
MenuItem.cch = LEN(MenuItem.dwTypeData)
MyButton = MenuItem.wID
IF InsertMenuItemA(hMenu, count, 1, _OFFSET(MenuItem)) THEN PRINT "Successfully added menu item!" ELSE PRINT "Failed to add menu item!": END

IF SetMenu(hWnd, hMenu) THEN PRINT "Successfully set menu!": PRINT "Menu handle is:"; hMenu ELSE PRINT "Failed to set menu!": END

DO: _LIMIT 70
    prev_state = new_state
    ok = GetMenuItemInfoA(hMenu, MyButton, 1, _OFFSET(MenuItem))
    new_state = MenuItem.fState AND 128
    IF prev_state = 0 AND new_state <> 0 THEN PRINT "Ouch! ";
LOOP WHILE INKEY$ = ""
Software and cathedrals are much the same — first we build them, then we pray.
QB64 Tutorial
Reply


Messages In This Thread
API Questions - by TerryRitchie - 08-18-2023, 07:35 PM
RE: API Questions - by SpriggsySpriggs - 08-18-2023, 07:51 PM
RE: API Questions - by TerryRitchie - 08-18-2023, 07:55 PM
RE: API Questions - by SMcNeill - 08-18-2023, 10:36 PM
RE: API Questions - by SMcNeill - 08-18-2023, 10:45 PM
RE: API Questions - by SpriggsySpriggs - 08-18-2023, 10:48 PM
RE: API Questions - by TerryRitchie - 08-19-2023, 02:06 AM
RE: API Questions - by SpriggsySpriggs - 08-19-2023, 04:32 AM
RE: API Questions - by TerryRitchie - 08-19-2023, 03:32 PM
RE: API Questions - by Dav - 08-19-2023, 03:48 PM
RE: API Questions - by TerryRitchie - 08-19-2023, 03:53 PM
RE: API Questions - by SpriggsySpriggs - 08-19-2023, 09:10 PM
RE: API Questions - by TerryRitchie - 08-19-2023, 09:45 PM
RE: API Questions - by Jack - 08-19-2023, 10:45 PM
RE: API Questions - by TerryRitchie - 08-19-2023, 11:06 PM
RE: API Questions - by a740g - 08-20-2023, 12:01 AM
RE: API Questions - by TerryRitchie - 08-20-2023, 05:47 PM
RE: API Questions - by SMcNeill - 08-20-2023, 06:04 PM
RE: API Questions - by a740g - 08-20-2023, 06:32 PM
RE: API Questions - by SMcNeill - 08-20-2023, 06:08 PM
RE: API Questions - by Jack - 08-20-2023, 06:15 PM
RE: API Questions - by a740g - 08-20-2023, 06:20 PM
RE: API Questions - by SMcNeill - 08-20-2023, 06:22 PM
RE: API Questions - by a740g - 08-20-2023, 06:23 PM
RE: API Questions - by SpriggsySpriggs - 08-20-2023, 11:10 PM



Users browsing this thread: 8 Guest(s)