Jump to content
AndyS01

How to set Menu text items to bold, colored

Recommended Posts

AndyS01

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

 

Share this post


Link to post
Share on other sites
AndyS01

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.

Share this post


Link to post
Share on other sites
AutoBert
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

Share this post


Link to post
Share on other sites
AndyS01

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.  

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

    • timmalos
      By timmalos
      Hey all.
      I don't know if this is doable, but I would like to be able to create one of my menu items from the right corner instead of the left one.
      For example in this attached screenshot (http://imgur.com/a/AX3X0) I would like to put a new Item right-aligned (in yellow on the screenshot) instead of just after Help menu.
       
      Is there any way?
       
      Thanks a lot,
       

    • SorryButImaNewbie
      By SorryButImaNewbie
      Hello
      First, I thank you for all the help I received here with Excel UDFs and COM objects in the last few days/week.
      I would like to "pimp" my output excel a bit, and for that I would like to write some results Bold.
      How do I do that?
      I tried a few things but most return errors, or doesn't do a thing seemingly.
      My code right now, this does run, but doesn't make the inserted results bold. (by inserted I mean what I write with _Excel_RangeWrite)
      _Excel_RangeWrite($ExcelObject, $ExcelObject.Activesheet, "=" & $OSSZEGoszlop & $CellaOlvasoSzamlalo & "*" & String($ArfolyamArray[$DateArrayTimeIndex]) & "", String($sHUFBeszurOszlop) & $CellaOlvasoSzamlalo) $ExcelObject.Activesheet.Range(String($sHUFBeszurOszlop) & $CellaOlvasoSzamlalo).Bold = True Thank you for the help!
      Edit: I leave this here, added the bold tag, maybe someone find it usefull
    • arts
      By arts
      I'm trying to make bold some days of a calendar. I get those days from a SQLite database. Using the _GUICtrlMonthCal_SetDayState function I almost got it working. Please look at the following ugly code and help me to understand why when the variable $finalX is calculated by the script it doesn't work (no bolding days) but, if I declare the value of the same variable manually, it works... I'm sure I'm doing something stupid but can't see it.
       
      [...] ;---- BUSY DAYS if _SQLite_GetTable2d(-1,'select A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, ID from mydatabase where DEADLINE like "%' & "-" & $tTeste & "-" & '%" ORDER BY 1 D, C;', $arows, $irows, $icols) = $SQLITE_OK Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($lvList)) Local $final[ubound($arows)] Local $finalX = "" Local $tempDay = "" Local $val_hex[ubound($arows)] Local $val_pre = "" for $1 = 1 to ubound($arows) - 1 _GUICtrlListView_AddItem($lvList, $arows[$1][0]) for $2 = 1 to ubound($arows,2) - 1 _GUICtrlListView_AddsubItem($lvList,$1-1, $arows[$1][$2], $2) next $tempDay = StringLeft(($arows[$1][3]), 2) $val_pre = Number($tempDay); + 0 ConsoleWrite("val_pre: " & $val_pre & @CRLF) $val_hex[$1] = "BitShift(0x0001,-" & "(" & $val_pre & "-1)" & ")" ConsoleWrite("val_hex[$1]: " & $val_hex[$1] & @CRLF) next ConsoleWrite("===========================" & @CRLF) $final = _ArrayUnique($val_hex) $finalX = _ArrayToString($final, " + ", 1) $finalX = StringTrimLeft($finalX, 3); <<------ COMPUTED $finalX doesn't work ConsoleWrite("FinalX:"&$finalX & @CRLF) ;------>> When I declare the same value as the computed above, it WORKS.. --->> $finalX = BitShift(0x0001,-(28-1)) + BitShift(0x0001,-(29-1)) + BitShift(0x0001,-(30-1)) + BitShift(0x0001,-(15-1)) + BitShift(0x0001,-(7-1)) + BitShift(0x0001,-(24-1)) + BitShift(0x0001,-(1-1)) + BitShift(0x0001,-(11-1)) + BitShift(0x0001,-(2-1)) EndIf ;--------------- Local $aMasks[_GUICtrlMonthCal_GetMonthRangeSpan($idMonthCal, True)] $aMasks[1] = $finalX; <<<-------- bold days _GUICtrlMonthCal_SetDayState($idMonthCal, $aMasks) GUICtrlSetState($tabCalendar, $GUI_SHOW) EndFunc ;==>BusyDays  
    • lucamad
      By lucamad
      Hi guys

      A little but very annoying problem with the new version (2.28) of SciTE editor included in last AutoIT installation...

      I have a problem with syntax language check and view in the editor. See the attch pic...
      No blue-bolded text for some autoit words and no _* functions in the help context menu.

      I have win xp sp3. What's wrong??
      THX

×