Jump to content

Recommended Posts

Posted

I want to create a menu item and set the text to bold and the color to red, but I cannot find a UDF to do this.

I want to make calls something like this:

_GUICtrlMenu_SetItemFont($hMenu, $iIndex, $oFont)
_GUICtrlMenu_SetItemColor($hMenu, $iIndex, $iColor)

I want to make them UDFs so I don't have to add lots of code to the script that calls them.  I've seen some on-line content, but what I found needed add too much code to support it.

Here is my test code:

#include <GuiMenu.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <FontConstants.au3>

Opt('MustDeclareVars', 1)
Opt("GUICloseOnESC", 1) ; 1 = ESC closes GUI
Opt("GUIOnEventMode", 1) ; 1 = OnEvent mode
OnAutoItExitRegister("ExitStageLeft")

; The $aMenuItems[] array holds information about each menu item.
; Each element holds items that are separated by a '|'.  When each item is split
; into an array, the resulting array has this info:
;   [0] = The item's Menu ID (from the '_GUICtrlMenu_AddMenuItem' function call
;   [1] = The item's Font Number (0 = no special font; 1 = font #1, etc.))
;   [2] = The Item's Text Color value (0 = no special color, else: $COLOR_RED, $COLOR_BLUE, etc.)
;   [3] = The item's menu index value
;   [4] = The Item's Handler name
Global Enum $__MI_ID, $__MI_FONTNUM, $__MI_COLOR, $__MI_NDX, $__MI_HANDLER, $__MI_CNT
Global $aMenuItems

Global $iMemo, $aFonts[2]

Example()
exit

Func Example()
    Local $hGUI, $hFile, $hMain

    createFonts()

    $hGUI = GUICreate("Menu", 400, 300); Create the main GUI

    $aMenuItems = StringSplit("", "") ; Initialize the $aMenuItems[] array

    $hFile = _GUICtrlMenu_CreateMenu(); Create the File menu
    _myGUICtrlMenu_AddMenuItem($hFile, "&New", "handle_munuitem_New")
    _myGUICtrlMenu_AddMenuItem($hFile, "&Open", "handle_munuitem_Open")
    _myGUICtrlMenu_AddMenuItem($hFile, "")
    _myGUICtrlMenu_AddMenuItem($hFile, "I want this to be bold 12pt Red text", "handle_MenuItem_test", 0xFF0000, 1)
    _myGUICtrlMenu_AddMenuItem($hFile, "")
    _myGUICtrlMenu_AddMenuItem($hFile, "E&xit", "handle_munuitem_Exit")

    $hMain = _GUICtrlMenu_CreateMenu(); Create the Main menu
    _GUICtrlMenu_InsertMenuItem($hMain, 0, "&File", 0, $hFile)

    _GUICtrlMenu_SetMenu($hGUI, $hMain); Set the window menu

    ; Display the 'menu items' info array
    For $ndx = 0 To UBound($aMenuItems) - 1
        ConsoleWrite("+++: [" & $ndx & "] = " & $aMenuItems[$ndx] & @CRLF)
    Next

    $iMemo = GUICtrlCreateEdit("", 2, 2, 396, 276, 0); Create the memo control
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")

    GUISetState(@SW_SHOW)

    GUISetOnEvent($GUI_EVENT_CLOSE, "ExitStageLeft")
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    MemoWrite("Click on the File menu and " & @crlf & "select one of the menu items.")

    ; Loop until the user exits.
    while(1)
        sleep(100)
    WEnd
EndFunc   ;==>Example

; Add a menu item, then add its info to the $aMenuItems[] array
Func _myGUICtrlMenu_AddMenuItem($hMenu, $sTitle = "", $sHandler = "", $iColor = 0, $iFontnum = 0)
    Local $iIndex, $iCmdID, $ar[1], $fontnum, $str, $color

    $iIndex = _GUICtrlMenu_GetItemCount($hMenu)

    If ($sTitle <> "") Then
        $iCmdID = 1000 + $iIndex

        $iIndex = _GUICtrlMenu_AddMenuItem($hMenu, $sTitle, $iCmdID)

        If ($sHandler <> "") Then
            ; Create then populate a MenuItem info array
            ReDim $ar[$__MI_CNT]
            $ar[$__MI_ID] = $iCmdID
            $ar[$__MI_FONTNUM] = $iFontnum
            $ar[$__MI_COLOR] = $iColor
            $ar[$__MI_NDX] = $iIndex
            $ar[$__MI_HANDLER] = $sHandler

            $str = _ArrayToString($ar, "|", 0)
            _ArrayAdd($aMenuItems, $str)
            $aMenuItems[0] = UBound($aMenuItems) - 1

            If ($iFontnum > 0) And ($iFontnum <= UBound($aFonts)) Then
                _GUICtrlMenu_SetItemFont($hMenu, $iIndex, $aFonts[$iFontnum-1])
            EndIf

            If ($iColor <> 0) Then
                _GUICtrlMenu_SetItemColor($hMenu, $iIndex, $iColor)
            EndIf

            GUICtrlSetOnEvent($iCmdID, $sHandler)
        EndIf
    Else
        _GUICtrlMenu_AddMenuItem($hMenu, "") ; Add just a horizontal bar
    EndIf

EndFunc   ;==>_myGUICtrlMenu_AddMenuItem

; Handle menu commands
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $ilParam
    Local $id, $parts, $handler

    $id = _WinAPI_LoWord($iwParam)

    ; See if this ID is in the list of items in the $aMenuItems[] array
    For $ndx = 1 To UBound($aMenuItems) - 1
        $parts = StringSplit($aMenuItems[$ndx], "|", 2)
        If ($id = $parts[$__MI_ID]) Then
            MemoWrite("$id = " & $id)

            ; It is, so call the handler associated with it
            $handler = $parts[$__MI_HANDLER]
            Call($handler) ; Call the handler
            ExitLoop
        EndIf
    Next

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func handle_munuitem_New()
    MemoWrite("handle_munuitem_New")
EndFunc   ;==>handle_munuitem_New

Func handle_munuitem_Open()
    MemoWrite("handle_munuitem_Open")
EndFunc   ;==>handle_munuitem_Open

Func handle_MenuItem_test()
    MemoWrite("handle_MenuItem_test")
EndFunc   ;==>handle_MenuItem_test

Func handle_munuitem_Exit()
    MemoWrite("handle_munuitem_Exit")
EndFunc   ;==>handle_munuitem_Exit

Func ExitStageLeft()
    Exit (1)
EndFunc   ;==>ExitStageLeft

; Write message to memo
Func MemoWrite($sMessage)
    Local Static $cnt = 0
    $cnt += 1
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
    ConsoleWrite("+++: " & StringFormat("%2d: %s", $cnt, $sMessage) & @CRLF)
EndFunc   ;==>MemoWrite

Func createFonts()
    $aFonts[0] = _WinAPI_CreateFont(14, 0, 0, 0, $FW_NORMAL, _
            False, False, False, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, _
            $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, "MS Sans Serif")

    $aFonts[1] = _WinAPI_CreateFont(14, 0, 0, 0, $FW_BOLD)
EndFunc   ;==>createFonts

Here is a skeleton of the UDF functions:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; _GUICtrlMenu_SetItemColor() - Set the color for the text in a menu item.
;
; PARAMS: $hMenu  - The Handle of the menu the item's attached to
;         $iIndex - The menu item number
;         $iColor - The text color
;
; RETURNS: <nothing>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _GUICtrlMenu_SetItemColor($hMenu, $iIndex, $iColor)
    #forceref $hMenu, $iIndex, $iColor
    ConsoleWrite("+++: _GUICtrlMenu_SetItemColor(" & $hMenu & ", " & $iIndex & ", " & Hex($iColor) & ") entered" & @CRLF)

    ; TBD ... TBD ... TBD ...

EndFunc   ;==>_GUICtrlMenu_SetItemColor

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; _GUICtrlMenu_SetItemFont() - Set the font for the text in a menu item.
;
; PARAMS: $hMenu  - The Handle of the menu the item's attached to
;         $iIndex - The menu item number
;         $iColor - The font object (as created by the _WinAPI_CreateFont() function).
;
; RETURNS: <nothing>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _GUICtrlMenu_SetItemFont($hMenu, $iIndex, $oFont)
    #forceref $hMenu, $iIndex, $fFont
    ConsoleWrite("+++: _GUICtrlMenu_SetItemFont(" & $hMenu & ", " & $iIndex & ", $oFont) entered" & @CRLF)

    ; TBD ... TBD ... TBD ...

EndFunc   ;==>_GUICtrlMenu_SetItemFont

 

Posted

I looked at ModernMenuRaw.au3, but I can't figure out how it applies to my menus.  I want to set an item in the menu (e.g. the 'Open' menu item in File->Open) to the color RED and italics font.  I don't think Holger's ModernMenuRaw.au3 can do this.

Posted (edited)
3 hours ago, AndyS01 said:

 I don't think Holger's ModernMenuRaw.au3 can do this.

I never tested ModernMenuRaw.au3 but i don't think the native functions can do this. So have you tried? I can't see that you included ModernMenuRaw.au3.

Edited by AutoBert
Posted

The ModernMenu.au3 is pretty old and is especially coded for tray menus.  I tried, but I couldn't see how to hook my menuitems into it.  

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
×
×
  • Create New...