SetMenuToRight()

指定した番号より右にあるメニューを、すべて右寄せにします。
「ヘルプ(&H)」だけ右寄せにしたい、という場合などに。それ以外での出番はちょっと思いつきません(^_^;

'標準モジュールに記述します。

Option Explicit

'メニューハンドルを取得する
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long

'メニュー項目のハンドルを取得する
Private Declare Function GetSubMenu Lib "user32" _
    (ByVal hMenu As Long, ByVal nPos As Long) As Long

'メニュー項目のタイトルを取得する
Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" _
    (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, _
     ByVal nMaxCount As Long, ByVal wFlag As Long) As Long

'メニュー項目を上書きする
Private Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" _
    (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, _
     ByVal wIDNewItem As Long, ByVal lpString As String) As Long

Private Const MF_BYPOSITION = &H400&
Private Const MF_POPUP = &H10&
Private Const MF_HELP = &H4000&

Public Sub SetMenuToRight(FormHWnd As Long, Index As Long)
'メニューの項目を右寄せにする
'<引数>
'  FormHwnd : メニューのあるフォームのウィンドウハンドル
'  Index    : 右寄せにするメニュータイトルのインデックス(0から始まる)。
'             これより右側のメニューがすべて右に寄せられる

    Dim hMenu As Long                   'メニューハンドル
    Dim hSubMenu As Long                '指定メニューのハンドル
    Dim strBuf As String * 255          'バッファ
    Dim strMenuCaption As String        '指定メニューのキャプション
    Dim lngRet As Long                  'APIの戻り値

    'メニューのハンドル取得
    hMenu = GetMenu(FormHWnd)

    '指定メニュー項目のハンドル取得
    hSubMenu = GetSubMenu(hMenu, Index)

    '指定メニュー項目のキャプション取得
    lngRet = GetMenuString(hMenu, Index, strBuf, 255&, MF_BYPOSITION)
    strMenuCaption = Left$(strBuf, InStr(1, strBuf, vbNullChar) - 1)

    'メニューの右寄せ(指定より右側の項目も自動的に右寄せになります)
    Call ModifyMenu(hMenu, Index, MF_BYPOSITION Or MF_POPUP Or MF_HELP, hSubMenu, strMenuCaption)

End Sub

実行例:

'フォームの Load イベントで呼び出します。
'例として、メニューが「ファイル(&F)」「編集(&E)」「ツール(&T)」「ヘルプ(&H)」の場合、
'ヘルプは3番(0から数える)になるので、次のように記述します。

Private Sub Form_Load()

    '「ヘルプ(&H)」を右寄せにする
    Call SetMenuToRight(Me.hwnd, 3)

End Sub

実行画面
実行画面

戻る