Jump to content
ModemJunki

Is it possible to create menu with no tab stops on the buttons?

Recommended Posts

ModemJunki

I'm having a hard time figuring out how to make a menu without any tab stops for the buttons.

I made a shell menu for BIOS flashing in WinPE and in it I don't want *any* buttons to be tab stopped. If I try to use GUICtrlSetStyle to remove the tab stops from all the buttons, the first button declared in the menu ends up the default (so the user could press the spacebar and the button is activated).

Melba23 posted some code like below a long time ago in this post but it seems to do the same thing as GUICtrlSetStyle does.

Any tips/help is appreciated.

_WinAPI_SetWindowLong(GUICtrlGetHandle(-1), $GWL_STYLE, BitAND(_WinAPI_GetWindowLong(GUICtrlGetHandle(-1), $GWL_STYLE), BitNOT($WS_TABSTOP)))
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>


Opt("GUICloseOnESC", 0) ; prevent user from pressing escape key and accidentally cancelling the GUI
HotKeySet("+!{ESC}", "_doCMD") ; shift-alt-escape for a command dialogue during GUI (lab/service use)

#include <Array.au3>
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

GLobal $s_Cmd1, $s_Cmd2, $s_Cmd3, $s_Cmd4, $s_Cmd5
$s_Debug = 0
$s_dbgArray = 0

Opt("GUICloseOnESC", 0) ; prevent user from pressing escape key and accidentally cancelling the GUI
HotKeySet("+!{ESC}", "_doCMD") ; shift-alt-escape for a command dialogue during GUI (lab/service use)

$MainMenu = GUICreate("Main BIOS Menu", 600, 400, -1, -1, 0, $WS_EX_TOPMOST)
$Button1 = GUICtrlCreateButton("1", 48, 64, 75, 25)
$Label1 = GUICtrlCreateLabel("One", 136, 68, 186, 20)
$Button2 = GUICtrlCreateButton("2", 48, 110, 75, 25)
$Label2 = GUICtrlCreateLabel("Two", 136, 113, 389, 20)
$Button3 = GUICtrlCreateButton("3", 48, 172, 75, 25)
$Label3 = GUICtrlCreateLabel("Three", 136, 176, 186, 20)
$Button4 = GUICtrlCreateButton("4", 48, 218, 75, 25)
$Label4 = GUICtrlCreateLabel("Four", 136, 221, 389, 20)
$Button5 = GUICtrlCreateButton("5", 48, 272, 75, 25)
$Label5 = GUICtrlCreateLabel("Five", 136, 274, 280, 20)
$Button6 = GUICtrlCreateButton("Cancel", 475, 340, 75, 25)
$Label6 = GUICtrlCreateLabel("Click to cancel the operations", 300, 345, 175, 20)
$Label0 = GUICtrlCreateLabel("Please choose one of the following 5 options:", 171, 16, 271, 20)
$Label7 = GUICtrlCreateLabel("Which system do you want to set up? [Press or click 1, 2, 3, 4 or use 5 to flash]", 78, 312, 456, 20)
$Group1 = GUICtrlCreateGroup("IVS", 36, 44, 513, 101)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("IAS", 36, 152, 513, 101)
GUICtrlCreateGroup("", -99, -99, 1, 1)

_WinAPI_SetWindowLong(GUICtrlGetHandle($Button1), $GWL_STYLE, BitAND(_WinAPI_GetWindowLong(GUICtrlGetHandle($Button1), $GWL_STYLE), BitNOT($WS_TABSTOP)))
_WinAPI_SetWindowLong(GUICtrlGetHandle($Button2), $GWL_STYLE, BitAND(_WinAPI_GetWindowLong(GUICtrlGetHandle($Button2), $GWL_STYLE), BitNOT($WS_TABSTOP)))
_WinAPI_SetWindowLong(GUICtrlGetHandle($Button3), $GWL_STYLE, BitAND(_WinAPI_GetWindowLong(GUICtrlGetHandle($Button3), $GWL_STYLE), BitNOT($WS_TABSTOP)))
_WinAPI_SetWindowLong(GUICtrlGetHandle($Button4), $GWL_STYLE, BitAND(_WinAPI_GetWindowLong(GUICtrlGetHandle($Button4), $GWL_STYLE), BitNOT($WS_TABSTOP)))
_WinAPI_SetWindowLong(GUICtrlGetHandle($Button5), $GWL_STYLE, BitAND(_WinAPI_GetWindowLong(GUICtrlGetHandle($Button5), $GWL_STYLE), BitNOT($WS_TABSTOP)))
_WinAPI_SetWindowLong(GUICtrlGetHandle($Button6), $GWL_STYLE, BitAND(_WinAPI_GetWindowLong(GUICtrlGetHandle($Button6), $GWL_STYLE), BitNOT($WS_TABSTOP)))

;~ GUICtrlSetStyle($Button1, 0)
;~ GUICtrlSetStyle($Button2, 0)
;~ GUICtrlSetStyle($Button3, 0)
;~ GUICtrlSetStyle($Button4, 0)
;~ GUICtrlSetStyle($Button5, 0)
;~ GUICtrlSetStyle($Button6, 0)
GUISetState(@SW_SHOW, $MainMenu)

While 1
    $nMsg = GUIGetMsg()
    Select
        Case $nMsg = $GUI_EVENT_CLOSE Or $nMsg = $Button6
            GUISetState(@SW_HIDE, $MainMenu)
            MsgBox(4096, "Cancel", "Operation cancelled. Please remove the media and click OK to reboot.")
            Exit
        Case $nMsg = $Button1 Or _IsPressed("31") Or _IsPressed("61") ; is the button, keyboard number, or keypad number pressed?
            _doRun(@ScriptDir & "\" & $s_Cmd1)
        Case $nMsg = $Button2 Or _IsPressed("32") Or _IsPressed("62")
            _doRun(@ScriptDir & "\" & $s_Cmd2)
        Case $nMsg = $Button3 Or _IsPressed("33") Or _IsPressed("63")
            _doRun(@ScriptDir & "\" & $s_Cmd3)
        Case $nMsg = $Button4 Or _IsPressed("34") Or _IsPressed("64")
            _doRun(@ScriptDir & "\" & $s_Cmd4)
        Case $nMsg = $Button5 Or _IsPressed("35") Or _IsPressed("65")
            _doRun(@ScriptDir & "\" & $s_Cmd5)
    EndSelect
WEnd

;~ ;=============================================================================
;~ ;==================================Functions==================================
;~ ;=============================================================================

;~ ;=============================================================================
;~ ; Run function for batch or executable files, hides main menu when running
;~ ;=============================================================================
Func _doRun($RunFile)
    GUISetState(@SW_HIDE, $MainMenu)
    RunWait(@ComSpec & " /c " & $RunFile)
    GUISetState(@SW_SHOW, $MainMenu)
EndFunc   ;==>_doRun

; --------------------------------------------------
; Run a command prompt for lab/field troubleshooting
; --------------------------------------------------
Func _doCMD()
    HotKeySet("+!{ESC}") ; deactivate hotkey to prvent spawning multiple cmd boxes with it
    GUISetState(@SW_HIDE, $MainMenu) ; hide the GUI
    RunWait(@ComSpec & " /c " & "cmd.exe", "", @SW_SHOW)
    GUISetState(@SW_SHOW, $MainMenu) ; bring the GUI back up
    HotKeySet("+!{ESC}", "_doCMD") ; reset the hotkey shift-alt-escape for a command dialogue (emergency use)
EndFunc   ;==>_doCMD

 

Edited by ModemJunki

Always carry a towel.

Share this post


Link to post
Share on other sites
Melba23

ModemJunki,

Either the _WinAPI_SetWindowLong or GUICtrlSetStyle code works for me to remove the TAB_STOP style:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Misc.au3>

Opt("GUICloseOnESC", 0) ; prevent user from pressing escape key and accidentally cancelling the GUI
HotKeySet("+!{ESC}", "_doCMD") ; shift-alt-escape for a command dialogue during GUI (lab/service use)

Global $aButton[6]
Global $aButtonData[6][2] = [["", ""], [1, "One"], [2, "Two"], [3, "Three"], [4, "Four"], [5, "Five"]]
Global $aCommand[6] = ["", "Command1", "Command2", "Command3", "Command4", "Command5"]

Local $hDLL = DllOpen("user32.dll")

$MainMenu = GUICreate("Main BIOS Menu", 600, 400, -1, -1, 0, $WS_EX_TOPMOST)

For $i = 1 To 5
    $aButton[$i] = GUICtrlCreateButton($aButtonData[$i][0], 48, 5 + (40 * $i), 75, 25)
    GUICtrlCreateLabel($aButtonData[$i][1], 136, 8 + (60 * $i), 186, 20)
    ;_WinAPI_SetWindowLong(GUICtrlGetHandle($aButton[$i]), $GWL_STYLE, BitAND(_WinAPI_GetWindowLong(GUICtrlGetHandle($aButton[$i]), $GWL_STYLE), BitNOT($WS_TABSTOP)))
    GUICtrlSetStyle($aButton[$i], 0)
Next
$Button6 = GUICtrlCreateButton("Cancel", 475, 340, 75, 25)
GUICtrlCreateLabel("Click to cancel the operations", 300, 345, 175, 20)
GUICtrlCreateLabel("Please choose one of the following 5 options:", 171, 16, 271, 20)
GUICtrlCreateLabel("Which system do you want to set up? [Press or click 1, 2, 3, 4 or use 5 to flash]", 78, 312, 456, 20)
$Group1 = GUICtrlCreateGroup("IVS", 36, 44, 513, 101)
$Group2 = GUICtrlCreateGroup("IAS", 36, 152, 513, 101)
GUICtrlCreateGroup("", -99, -99, 1, 1)

GUISetState(@SW_SHOW, $MainMenu)

While 1
    $nMsg = GUIGetMsg()
    Select
        Case $nMsg = $GUI_EVENT_CLOSE Or $nMsg = $Button6
            GUISetState(@SW_HIDE, $MainMenu)
            MsgBox(4096, "Cancel", "Operation cancelled. Please remove the media and click OK to reboot.")
            DllClose($hDLL)
            Exit
        Case Else
            For $i = 1 To 5
                $sKeyCode1 = String(30 + $i)
                $sKeyCode2 = String(60 + $i)
                If $nMsg = $aButton[$i] Or _IsPressed($sKeyCode1, $hDLL) Or _IsPressed($sKeyCode2, $hDLL) Then ; is the button, keyboard number, or keypad number pressed?
                    _doRun(@ScriptDir & "\" & $aCommand[$i])
                    ExitLoop
                EndIf
            Next
    EndSelect
WEnd

;~ ;=============================================================================
;~ ;==================================Functions==================================
;~ ;=============================================================================

;~ ;=============================================================================
;~ ; Run function for batch or executable files, hides main menu when running
;~ ;=============================================================================
Func _doRun($RunFile)
    GUISetState(@SW_HIDE, $MainMenu)
    RunWait(@ComSpec & " /c " & $RunFile)
    GUISetState(@SW_SHOW, $MainMenu)
EndFunc   ;==>_doRun

; --------------------------------------------------
; Run a command prompt for lab/field troubleshooting
; --------------------------------------------------
Func _doCMD()
    HotKeySet("+!{ESC}") ; deactivate hotkey to prvent spawning multiple cmd boxes with it
    GUISetState(@SW_HIDE, $MainMenu) ; hide the GUI
    RunWait(@ComSpec & " /c " & "cmd.exe", "", @SW_SHOW)
    GUISetState(@SW_SHOW, $MainMenu) ; bring the GUI back up
    HotKeySet("+!{ESC}", "_doCMD") ; reset the hotkey shift-alt-escape for a command dialogue (emergency use)
EndFunc   ;==>_doCMD

I also took the opportunity to tidy up the code a bit - you will need to polish up the button location algorithm, but I am sure you can see the benefit of using loops when you have multiple controls in a grid.

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______Open Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites
ModemJunki

Melba23,

The end result is that a button is still in focus (e.g., Cancel button is defaulted as tab stop). Its the safest option for cancel to be in focus but I would prefer that no button is focused as the spacebar activates the focused button. It seems this "nothing-in-focus" may not actually be possible in this way.

I suppose the workaround can either be to create a button with zero size (e.g., GUICtrlCreateButton("", 0, 0 , 0 ,0)) for the default focus or to have Cancel popup an "Are you sure you want to cancel this operation?" with an OK/Cancel dialogue. (After typing this I think perhaps both might be a good idea.)

Thanks for the assistance - the tip about using a loop for the controls looks like it will make maintaining this much easier.


Always carry a towel.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • Pagi
      By Pagi
       
      <a href="index.php=4143b27b41db0a40c499202865c3e24d" class="menuitem " target="\_self"> "Menu Item 1" </a>
      Can you tell me if it´s possible to click this menu button? If yes, how? Cause I have no idea, I think i should use _IETagNameGetCollection
    • nacerbaaziz
      By nacerbaaziz
      Hello
      I have an inquiry please
      when i use the control get focus
      it don't detect the menu item
      there are any Method to do that?
      i'll use that to make a custom screen reader in my program
      please help me to do that
      I am waiting for your answers
      greetings to you
      Thank you in advance
       
    • nacerbaaziz
      By nacerbaaziz

      Hello all
      I have a question please
      this  a question is about the context menu
      When i create a list box  Or combo box
      if i create a context menu for this list
      When i press the application key or the shortcut shift + f10
      the menu options is appear normally
      but When i create a List view
      if i create a context menu for this list
      When i press the application key or the shortcut shift + f10
      the menu options isn't appear
      But the right mouse button works normally
      I need a solution please because I deal with the screen readers users
      Unfortunately They can not use the mouse to navigate
      So I have to find a solution to activate keyboard shortcuts
      am waiting  for your help
    • SteveJM
      By SteveJM
      I have a working program currently driven largely through menu selections. I would like to add a toolbar where most of the tollbar button actions are basically the same as menu items, but quicker to access. I have been wading around in toolbar examples, MSDN pages etc, it's clearly going to be a bit of a slog to get everything right, including tooltips etc. I thought I would start with something simple to prove the principle.
      Using bits from the help file examples I have a small program that successfully displays a toolbar. However, what seemed like the most elegant way to deal with the button commands does not seem to work. My understanding was that a toolbar button fires a WM_COMMAND message, with the command Id set by the second parameter in the call to
      _GUICtrlToolbar_AddButton ( $hWnd, $iID, $iImage)
      so I though it would be a good idea to set this Id to the same value as my menu item Id; then it would run the same task which is what I wanted. This did not work. I am using message loop mode and would like to stick with this because some of my scripts run hardware at the same time as the gui; it is easier if I don't have to worry about code being interrupted with the hardware in an unknown state . So I added a handler for WM_COMMAND, with some cribbed display code to try and see why. The toolbar button defintely fired a WM_COMMAND message and the Id looked the same, so no explanation there.
      I guess the issue is with GUIGetMsg() which may be constructed to ignore all but a limited number of control handles, i.e. those made with the GuiCtrlCreate... commands; this is speculation.
      I would dearly love to find a tidy way to get around this. Having some controls handled in the message loop and some in a WM_COMMAND handler, performing the same task, feels ugly. I would be very grateful for further insight from someone experienced with handling a toolbar. Perhaps I should be trying to fire the menu item. I have attached a code snippet to try and illustrate the issue.
       
       
       
      ToolbarTrial.au3
    • GordonFreeman
      By GordonFreeman
      Hi, i searched some topics but cannot found a simple way to do that:
      #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> $Form1 = GUICreate("Form1", 615, 438, 192, 124) GUISetState(@SW_SHOW) ; I tried this but user reported that it work in 2006, not seems work actually $filemenu = GUICtrlCreateMenu ("&File") $fileitem = GUICtrlCreateMenuitem ("Open",$filemenu) GuiCtrlSetImage($fileitem, "shell32.dll", 4) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Also tried:
      #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> $Form1 = GUICreate("Form1", 615, 438, 192, 124) GUISetState(@SW_SHOW) $filemenu = TrayCreateMenu("&File") $fileitem = TrayCreateItem("Open",$filemenu) ;GuiCtrlSetImage($fileitem, "shell32.dll", 4) ;GuiCtrlSetImage(TrayItemGetHandle($fileitem), "shell32.dll", 4) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Well.. thanks in advance!
       
      Ok. I found this working example from Yashied. If i cannot find a simple then i will go with it
      #Include <GUIConstantsEx.au3> #Include <GUIMenu.au3> #Include <Constants.au3> #Include <WinAPI.au3> #Include <WindowsConstants.au3> Opt('MustDeclareVars', 1) Global $hMenu, $hForm, $hFile = 1000, $idNew, $idExit $hForm = GUICreate('Menu', 400, 300) $hFile = _GUICtrlMenu_CreateMenu() _GUICtrlMenu_InsertMenuItem ($hFile, 0, ' &Favorites', $idNew) _GUICtrlMenu_InsertMenuItem ($hFile, 1, '', 0) _GUICtrlMenu_InsertMenuItem($hFile, 2, ' E&xit', $idExit) $hMenu = _GUICtrlMenu_CreateMenu() _GUICtrlMenu_InsertMenuItem($hMenu, 0, '&File', 0, $hFile) _GUICtrlMenu_SetMenu($hForm, $hMenu) _GUICtrlMenu_SetItemBmp($hFile, 0, _CreateBitmapFromIcon(_WinAPI_GetSysColor($COLOR_MENU), @SystemDir & '\shell32.dll', 43, 16, 16)) _GUICtrlMenu_SetItemBmp($hFile, 2, _CreateBitmapFromIcon(_WinAPI_GetSysColor($COLOR_MENU), @SystemDir & '\shell32.dll', 27, 16, 16)) GUISetState() Do Until GUIGetMsg() = $GUI_EVENT_CLOSE Func _CreateBitmapFromIcon($iBackground, $sIcon, $iIndex, $iWidth, $iHeight) Local $hDC, $hBackDC, $hBackSv, $hIcon, $hBitmap $hDC = _WinAPI_GetDC(0) $hBackDC = _WinAPI_CreateCompatibleDC($hDC) $hBitmap = _WinAPI_CreateSolidBitmap(0, $iBackground, $iWidth, $iHeight) $hBackSv = _WinAPI_SelectObject($hBackDC, $hBitmap) $hIcon = _WinAPI_PrivateExtractIcon($sIcon, $iIndex, $iWidth, $iHeight) If Not @error Then _WinAPI_DrawIconEx($hBackDC, 0, 0, $hIcon, 0, 0, 0, 0, $DI_NORMAL) _WinAPI_DestroyIcon($hIcon) EndIf _WinAPI_SelectObject($hBackDC, $hBackSv) _WinAPI_ReleaseDC(0, $hDC) _WinAPI_DeleteDC($hBackDC) Return $hBitmap EndFunc ;==>_CreateBitmapFromIcon Func _WinAPI_PrivateExtractIcon($sIcon, $iIndex, $iWidth, $iHeight) Local $hIcon, $tIcon = DllStructCreate('hwnd'), $tID = DllStructCreate('hwnd') Local $Ret = DllCall('user32.dll', 'int', 'PrivateExtractIcons', 'str', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr', DllStructGetPtr($tIcon), 'ptr', DllStructGetPtr($tID), 'int', 1, 'int', 0) If (@error) Or ($Ret[0] = 0) Then Return SetError(1, 0, 0) EndIf $hIcon = DllStructGetData($tIcon, 1) If ($hIcon = Ptr(0)) Or (Not IsPtr($hIcon)) Then Return SetError(1, 0, 0) EndIf Return $hIcon EndFunc ;==>_WinAPI_PrivateExtractIcon Ok, i noticed that is a pain create submenu with _GUICtrlMenu_CreatePopup to do like in Tray, and Tray better located, then i need images/icon with Tray functions, some workaround?? 
×