Flip menu check state

Category: Menus

Date: 02-16-2022

Return to Index


 
'When a user clicks a "CheckMark" style menu, here's how to flip the check state.
'as you can see, they are lots of ways to do it - here are 6 approaches.
'See the Menu Skeleton for a compilable example using Example#1
 
'Primary Code:
'I prefer the approach that uses a Global variable. This has two advantages -
'creating a variable whose value can be saved/restored in an INI file, and used
'elsewhere in the program to direct program flow according the whether the
'menu is checked or not.
gMenuItem& = gMenuItem& XOR 1     'flip between 0 and 1
Menu Set State hMenuOptions, ByCmd %IDM_MenuItem, gMenuItem& * 8
 
'Here are 5 other ways to do it.
'Credit: Michael Mattias, Charles Dietz, Scott Slater
 
'Example#1
'get the state (returns either 0 or 8)
Menu Get State hMenuOptions, ByCmd %ID_Backup To iReturn   'get the state
Menu Set State hMenuOptions, ByCmd %ID_Backup, ABS(IsFalse iReturn)*8  'flip the state
 
'Example#2
'this is the brute force approach
Menu Get State hMenuOptions, ByCmd %IDM_MenuITem To iReturn   'get the state
If iReturn = 0 Then
   Menu Set State hMenuOptions, ByCmd %IDM_MenuItem, 8  'flip the state
Else
   Menu Set State hMenuOptions, ByCmd %IDM_MenuItem, 0  'flip the state
End If
 
'Example#3 - idea from Michael Mattias
Menu Get State hMenuOptions, ByCmd %IDM_MenuITem To iReturn   'get the state
Menu Set State hMenuOptions, ByCmd %IDM_MenuItem, _
IIF&(iReturn AND %MF_CHECKED, %MF_UNCHECKED, %MF_CHECKED)  'flip the state
 
 
'Example#4 - idea from Charles Dietz
Menu Get State hMenuOptions, ByCmd %IDM_MenuITem To iReturn   'get the state
Menu Set State hMenuOptions, ByCmd %IDM_MenuItem, _
IIF&(iReturn = %MF_Checked, %MF_UNCHECKED, %MF_CHECKED)  'flip the state
 
 
'Example#5 - idea from Scott Slater
'0 state means all bits are zero  mask$ = 0
'8 state means all bits are zero except bit 3
'mask with both bits 1, all others zero, is 8+1 = 9
'9 could be replaced by %MF_Checked OR %MF_UnChecked
Menu Get State hMenuOptions, ByCmd %IDM_MenuITem To iReturn   'get the state
Menu Set State hMenuOptions, ByCmd %IDM_MenuItem, iReturn XOR 9  'flip the state of bit 0 and bit 3
'Menu Set State hMenuOptions, ByCmd %IDM_MenuItem, iReturn XOR (%MF_Checked Or %MF_Unchecked)  'alternate
 
 
'This compilable example creates an Option menu, with sub-menus.
'The two Option menus include code to toggle the checkmark state of the sub-menus
'The Callback code to respond to the menu clicks is also shown (puts menu name in the label)
 
'Compilable Example:  (Jose Includes)
#Compiler PBWin 9, PBWin 10
#Compile EXE
#Dim All
%Unicode=1
#Include "Win32api.inc"
%IDM_ConfirmDelete = 600  : %IDM_SavePosition = 601
%IDC_TextBox = 900
 
Global hDlg As DWord, hMenu As DWord, hMenuOptions As DWord
Global ConfirmDelete&, SavePosition&
 
Function PBMain()
   Dialog New Pixels, 0, "MRU Demo",300,300,300,200, %WS_OverlappedWindow To hDlg
   Control Add TextBox, hDlg, %IDC_TextBox, "  Selected menu item to toggle its state.", 30,30,240,125, %WS_Border
   Menu New Bar To hMenu
   Menu Attach hMenu, hDlg
   Menu New Popup To hMenuOptions
   Menu Add Popup, hMenu, "&Options", hMenuOptions, %MF_Enabled
   Menu Add String, hMenuOptions, "&Confirm Delete", %IDM_ConfirmDelete, %MF_Enabled
   Menu Add String, hMenuOptions, "&Save Position", %IDM_SavePosition, %MF_Enabled
   Dialog Show Modal hDlg Call DlgProc()
End Function
 
CallBack Function DlgProc() As Long
   Local temp$, iReturn&
   Select Case CB.Msg
      Case %WM_Command
         Select Case CB.Ctl
            Case %IDM_ConfirmDelete
               ConfirmDelete& = ConfirmDelete& XOR 1  'flips global variable state 0/1
               Menu Set State hMenuOptions, ByCmd %IDM_ConfirmDelete, ConfirmDelete&*8  'flip the menu checkstate
            Case %IDM_SavePosition
               SavePosition& = SavePosition& XOR 1    'flips global variable state 0/1
               Menu Set State hMenuOptions, ByCmd %IDM_SavePosition, SavePosition&*8  'flip the state
         End Select
   End Select
End Function
 
'gbs_00200
'Date: 03-10-2012


created by gbSnippets
http://www.garybeene.com/sw/gbsnippets.htm