Page 1 of 2
How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Thu Dec 10, 2015 11:00 am
by gurj
How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Code: Select all
;rewrite from:
; PopupMenu_BoldItem.pb
; English forum: http://www.purebasic.fr/english/viewtopic.php?p=70325#70325
; Author: GreenGiant (updated for PB 4.00 by edel)
; Date: 26. September 2004
; OS: Windows
; Demo: No
OpenWindow(0,0,0,400,400,"test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreatePopupMenu(0)
MenuItem(0,"Normal1")
MenuItem(1,"Normal2")
MenuItem(2,"Bold")
MenuItem(3,"Normal3")
bold.MENUITEMINFO
bold\cbSize=SizeOf(bold)
bold\fMask=#MIIM_TYPE
bold\fType=#MFT_MENUBARBREAK
;bold\dwItemData=?
SetMenuItemInfo_(MenuID(0),2,#True,bold)
Repeat
ev=WaitWindowEvent()
If ev=#WM_RBUTTONUP
DisplayPopupMenu(0,WindowID(0))
EndIf
Until ev=#PB_Event_CloseWindow
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Thu Dec 10, 2015 11:17 am
by RSBasic
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Thu Dec 10, 2015 11:40 am
by gurj
thanks RSBasic !
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Fri Dec 11, 2015 5:34 am
by kenmo
Great tip, I never knew you could do that...
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Fri Dec 11, 2015 5:59 am
by gurj
That link isn't a *.htm.
is *.pb:
Code: Select all
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(1,10,10,400,20,"Dr點ken Sie die rechte Maustaste, um das Popup-Men?zu 鰂fnen.",0)
If CreatePopupMenu(1)
For a=1 To 5
MenuItem(a,"Item "+Str(a))
Next
AppendMenu_(MenuID(1),#MF_MENUBARBREAK,6,"Item 6")
For a=7 To 10
MenuItem(a,"Item "+Str(a))
Next
EndIf
Repeat
EventID=WaitWindowEvent()
Select EventID
Case #WM_RBUTTONDOWN
DisplayPopupMenu(1,WindowID(0))
EndSelect
If EventID=#PB_Event_CloseWindow
Quit=1
EndIf
Until Quit=1
EndIf
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Fri Dec 11, 2015 8:31 am
by electrochrisso
That link isn't a *.htm.
is *.pb:
Yes, that way you can save the page from the browser save option to your computer, Chrome adds a txt extension at the end, probably because it do not know what it is, anyway you can just modify the name and put the pb extension instead of the txt and save it, but it is much easier just to copy the text from the page and paste it into PB.
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sat Mar 29, 2025 1:49 pm
by BarryG
Can #MF_MENUBARBREAK be used for an app's normal title area menu, instead of a popup menu? I tried and it didn't work.
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sat Mar 29, 2025 3:18 pm
by RASHAD
You can make the Menubar Multi Rows
Code: Select all
If OpenWindow(0, 100, 150, 195, 260, "PureBasic - Menu")
If CreateMenu(0, WindowID(0))
MenuTitle("File")
MenuItem( 1, "&Load...")
MenuItem( 2, "Save")
MenuItem( 3, "Save As...")
MenuBar()
OpenSubMenu("Recents")
MenuItem( 5, "Pure.png")
MenuItem( 6, "Basic.jpg")
OpenSubMenu("Even more !")
MenuItem( 12, "Yeah")
CloseSubMenu()
MenuItem( 13, "Rocks.tga")
CloseSubMenu()
MenuBar()
MenuItem( 7, "&Quit")
MenuTitle("Edition")
MenuItem( 8, "Cut")
MenuItem( 9, "Copy")
MenuItem(10, "Paste")
MenuTitle("?")
MenuItem(11, "About")
MenuItem(12, "Check/Uncheck Me")
For item = 4 To 10
MenuTitle("")
Next
MenuTitle("OVER")
MenuItem(13, "Over 1")
MenuItem(14, "Over 2")
EndIf
DisableMenuItem(0, 3, 1)
DisableMenuItem(0, 13, 1)
Repeat
Select WaitWindowEvent()
Case #PB_Event_Menu
Select EventMenu() ; To see which menu has been selected
Case 11 ; About
MessageRequester("About", "Cool Menu example", 0)
Case 14 ; Check/Uncheck Me
If GetMenuItemState(0,14) = 1 ; Checked
SetMenuItemState(0,14,0) ; So uncheck Me
Else ; Else
SetMenuItemState(0,14,1) ; Check Me
EndIf
Default
MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
EndIf
End
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sat Mar 29, 2025 3:41 pm
by RASHAD
Crazy idea
We can keep all windows active all time for good looking and the Window position too
Code: Select all
Procedure smCB()
ResizeWindow(1,WindowX(0)+100, WindowY(0)+30, 150, 40)
ResizeWindow(2,WindowX(0)+250, WindowY(0)+30, 150, 40)
EndProcedure
If OpenWindow(0, 0, 0, 500, 400, "PureBasic - Menu",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindow(1, WindowX(0)+100, WindowY(0)+30, 150, 40, "",#PB_Window_BorderLess,WindowID(0))
If CreateMenu(0, WindowID(1))
MenuTitle("File")
MenuItem( 1, "&Load...")
MenuItem( 2, "Save")
MenuItem( 3, "Save As...")
MenuBar()
OpenSubMenu("Recents")
MenuItem( 5, "Pure.png")
MenuItem( 6, "Basic.jpg")
OpenSubMenu("Even more !")
MenuItem( 12, "Yeah")
CloseSubMenu()
MenuItem( 13, "Rocks.tga")
CloseSubMenu()
MenuBar()
MenuItem( 7, "&Quit")
MenuTitle("Edition")
MenuItem( 8, "Cut")
MenuItem( 9, "Copy")
MenuItem(10, "Paste")
EndIf
OpenWindow(2, WindowX(0)+250, WindowY(0)+30, 150, 40, "",#PB_Window_BorderLess,WindowID(0))
If CreateMenu(1, WindowID(2))
MenuTitle("File")
MenuItem( 14, "&Load...")
MenuItem( 15, "Save")
MenuItem( 16, "Save As...")
MenuBar()
MenuTitle("Edition")
MenuItem( 17, "Cut")
MenuItem( 18, "Copy")
MenuItem( 19, "Paste")
EndIf
BindEvent(#PB_Event_MoveWindow,@smCB())
Repeat
Select WaitWindowEvent()
Case #PB_Event_Menu
Select EventMenu() ; To see which menu has been selected
Case 11 ; About
MessageRequester("About", "Cool Menu example", 0)
Case 14 ; Check/Uncheck Me
Debug "14"
Case 19
Debug "19"
Default
MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
EndIf
End
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sun Mar 30, 2025 2:51 am
by BarryG
I was hoping to have only one title bar menu which opens split like this when it drops down:
Not possible? I may have to fake it by opening a pop-up menu where the title menu is. The reason for my question is that my app's main title bar menu now has 30 menu items added to it, and I'd prefer to have two columns of 15 items instead, to look and work better on smaller desktops.
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sun Mar 30, 2025 11:33 am
by breeze4me
BarryG wrote: Sun Mar 30, 2025 2:51 am
I was hoping to have only one title bar menu which opens split like this when it drops down:
Not possible? I may have to fake it by opening a pop-up menu where the title menu is. The reason for my question is that my app's main title bar menu now has 30 menu items added to it, and I'd prefer to have two columns of 15 items instead, to look and work better on smaller desktops.
You can do this.
Code: Select all
If OpenWindow(0, 200, 200, 200, 100, "Menu Example")
If CreateMenu(0, WindowID(0))
MenuTitle("title1")
MenuItem(31, "Open" +Chr(9)+"Ctrl+O")
MenuItem(32, "Save" +Chr(9)+"Ctrl+S")
MenuItem(33, "Save as"+Chr(9)+"Ctrl+A")
MenuItem(34, "Close" +Chr(9)+"Ctrl+C")
MenuTitle("title2")
For i = 1 To 15
MenuItem(i, "item " + i)
Next
; Get the handle of the second menu title.
Define item.MENUITEMINFO
item\cbSize = SizeOf(MENUITEMINFO)
item\fMask = #MIIM_SUBMENU
GetMenuItemInfo_(MenuID(0), 1, #True, item)
If item\hSubMenu
AppendMenu_(item\hSubMenu, #MF_MENUBARBREAK, 16, "Item 16")
EndIf
For i = 17 To 30
MenuItem(i, "item " + i)
Next
MenuTitle("title3")
MenuItem(41, "Open" +Chr(9)+"Ctrl+O")
MenuItem(42, "Save" +Chr(9)+"Ctrl+S")
MenuItem(43, "Save as"+Chr(9)+"Ctrl+A")
MenuItem(44, "Close" +Chr(9)+"Ctrl+C")
EndIf
Repeat
e = WaitWindowEvent()
If e = #PB_Event_Menu
Debug EventMenu()
EndIf
Until e = #PB_Event_CloseWindow
EndIf
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sun Mar 30, 2025 11:58 am
by BarryG
Hi breezeforme.

Close, and it works perfectly for standard window menus, but I forgot to mention that I'm actually using an image menu. So your code below doesn't insert the menu item:
Code: Select all
If OpenWindow(0, 200, 200, 200, 100, "Menu Example")
CreateImage(0,16,16,24,#Red)
If CreateImageMenu(0, WindowID(0))
MenuTitle("title1")
MenuItem(31, "Open" +Chr(9)+"Ctrl+O")
MenuItem(32, "Save" +Chr(9)+"Ctrl+S")
MenuItem(33, "Save as"+Chr(9)+"Ctrl+A")
MenuItem(34, "Close" +Chr(9)+"Ctrl+C")
MenuTitle("title2")
For i = 1 To 15
MenuItem(i, "item " + i)
Next
; Get the handle of the second menu title.
Define item.MENUITEMINFO
item\cbSize = SizeOf(MENUITEMINFO)
item\fMask = #MIIM_SUBMENU
GetMenuItemInfo_(MenuID(0), 1, #True, item)
If item\hSubMenu
AppendMenu_(item\hSubMenu, #MF_MENUBARBREAK, 16, "Item 16") ; Doesn't appear in menu.
SetMenuItemBitmaps_(MenuID(0),16,#MF_BYPOSITION,ImageID(0),ImageID(0)) ; Doesn't help.
EndIf
For i = 17 To 30
MenuItem(i, "item " + i)
Next
MenuTitle("title3")
MenuItem(41, "Open" +Chr(9)+"Ctrl+O")
MenuItem(42, "Save" +Chr(9)+"Ctrl+S")
MenuItem(43, "Save as"+Chr(9)+"Ctrl+A")
MenuItem(44, "Close" +Chr(9)+"Ctrl+C")
EndIf
Repeat
e = WaitWindowEvent()
If e = #PB_Event_Menu
Debug EventMenu()
EndIf
Until e = #PB_Event_CloseWindow
EndIf
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sun Mar 30, 2025 12:44 pm
by mk-soft
Chr(9) = #TAB$
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sun Mar 30, 2025 12:53 pm
by breeze4me
BarryG wrote: Sun Mar 30, 2025 11:58 am
... using an image menu.
Code: Select all
UsePNGImageDecoder()
If OpenWindow(0, 200, 200, 200, 100, "Menu Example")
hImg = LoadImage(0, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png")
If CreateImageMenu(0, WindowID(0))
MenuTitle("title1")
MenuItem(31, "Open" +Chr(9)+"Ctrl+O")
MenuItem(32, "Save" +Chr(9)+"Ctrl+S")
MenuItem(33, "Save as"+Chr(9)+"Ctrl+A")
MenuItem(34, "Close" +Chr(9)+"Ctrl+C")
MenuTitle("title2")
For i = 1 To 30
If i = 16
MenuItem(i, "item " + i, hImg)
Else
MenuItem(i, "item " + i)
EndIf
Next
; Get the handle of the second menu title.
Define item.MENUITEMINFO
item\cbSize = SizeOf(MENUITEMINFO)
item\fMask = #MIIM_SUBMENU
GetMenuItemInfo_(MenuID(0), 1, #True, item)
If item\hSubMenu
hSubMenu = item\hSubMenu
FillMemory(@item, SizeOf(MENUITEMINFO))
item\cbSize = SizeOf(MENUITEMINFO)
item\fMask = #MIIM_FTYPE | #MIIM_ID| #MIIM_DATA
If GetMenuItemInfo_(hSubMenu, 15, #True, item)
item\fType | #MFT_MENUBARBREAK
SetMenuItemInfo_(hSubMenu, 15, #True, item)
EndIf
EndIf
MenuTitle("title3")
MenuItem(41, "Open" +Chr(9)+"Ctrl+O")
MenuItem(42, "Save" +Chr(9)+"Ctrl+S")
MenuItem(43, "Save as"+Chr(9)+"Ctrl+A")
MenuItem(44, "Close" +Chr(9)+"Ctrl+C")
EndIf
Repeat
e = WaitWindowEvent()
If e = #PB_Event_Menu
Debug EventMenu()
EndIf
Until e = #PB_Event_CloseWindow
EndIf
Re: How use #MFT_MENUBARBREAK for SetMenuItemInfo ?
Posted: Sat Apr 05, 2025 12:30 pm
by BarryG
Thanks again, breeze4me. Your example works perfectly by itself, but not in my real app, which I think is to do with it having a submenu.
Here's your code with how my app is doing it... if you can make the below split the submenu of title2 into two parts, I would be eternally grateful.
Code: Select all
UsePNGImageDecoder()
If OpenWindow(0, 600, 250, 200, 100, "Menu Example")
hImg = LoadImage(0, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png")
menu_app = CreateImageMenu(#PB_Any, WindowID(0))
If menu_app
MenuTitle("title1") ; Index 0
MenuItem(10, "10" +Chr(9)+"Ctrl+O")
MenuItem(11, "11" +Chr(9)+"Ctrl+S")
MenuItem(12, "12"+Chr(9)+"Ctrl+A")
MenuItem(13, "13" +Chr(9)+"Ctrl+C")
MenuTitle("title2") ; Index 1
MenuItem(14, "item 14")
OpenSubMenu("sub")
For i = 15 To 50
MenuItem(i, "item " + i, hImg) ; Want a split in the middle of these items.
Next
CloseSubMenu()
; Get the handle of the second menu title.
Define item.MENUITEMINFO
item\cbSize = SizeOf(MENUITEMINFO)
item\fMask = #MIIM_SUBMENU
GetMenuItemInfo_(MenuID(menu_app), 1, #True, item) ; 1 = Index 1
If item\hSubMenu
hSubMenu = item\hSubMenu
FillMemory(@item, SizeOf(MENUITEMINFO))
item\cbSize = SizeOf(MENUITEMINFO)
item\fMask = #MIIM_FTYPE | #MIIM_ID| #MIIM_DATA
split_point = (50 - 15) / 2
If GetMenuItemInfo_(hSubMenu, split_point, #True, item)
item\fType | #MFT_MENUBARBREAK
SetMenuItemInfo_(hSubMenu, split_point, #True, item)
EndIf
EndIf
MenuTitle("title3") ; Index 2
MenuItem(51, "51" +Chr(9)+"Ctrl+O")
MenuItem(52, "52" +Chr(9)+"Ctrl+O")
MenuItem(52, "53" +Chr(9)+"Ctrl+S")
EndIf
Repeat
e = WaitWindowEvent()
If e = #PB_Event_Menu
Debug EventMenu()
EndIf
Until e = #PB_Event_CloseWindow
EndIf