● メニューを右寄せする ●

その昔、外国のアプリケーションで見たことあるような…

まあ覚えておいてもいいでしょう。

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 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 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 Const MF_BYPOSITION = &H400&
Private Const MF_POPUP = &H10&
Private Const MF_HELP = &H4000&

'---------------------------------------------------------------
' 関数名: MoveHelpMenuToRight
' 機  能: 特定メニューを右端に寄せる
' 引  数: (in) hWnd … 右寄せするメニューのフォームのハンドル
'          (in) MenuPos … メニューのポジション(0-Base)
' 返り値: なし
'---------------------------------------------------------------
Public Sub MoveHelpMenuToRight(ByVal hWnd As Long, ByVal MenuPos As Integer)

    Dim hMenu As Long     'メニューのハンドル
    Dim hSubMenu As Long  'サブメニューのハンドル
    Dim MenuString As String  'メニュー文字列

    'メニューのハンドルを取得する
    hMenu = GetMenu(hWnd)
    
    'サブメニューのハンドルを取得する
    hSubMenu = GetSubMenu(hMenu, MenuPos)

    'メニュー文字列を取得
    MenuString = String$(256, Chr$(0))
    Call GetMenuString(hMenu, MenuPos, MenuString, Len(MenuString), MF_BYPOSITION)

    '右寄せ
    Call ModifyMenu(hMenu, MenuPos, MF_BYPOSITION Or MF_POPUP Or MF_HELP, hSubMenu, strNullCut(MenuString))

End Sub

'---------------------------------------------------------------------------
'  関数名: strNullCut
'   機能 : 文字列を vbNullChar までを取得する
'   引数 : (in) srcStr … 対象文字列
'  返り値 :編集された文字列
'---------------------------------------------------------------------------
Public Function strNullCut(ByVal srcStr As String) As String

    Dim NullCharPos As Integer

    NullCharPos = InStr(srcStr, Chr$(0))

    If NullCharPos = 0 Then
        strNullCut = srcStr
        Exit Function
    End If

    strNullCut = Left$(srcStr, NullCharPos - 1)

End Function

上記のフォームのように5つメニューがあり、右2つを右寄せしたい場合

Private Sub Form_Load()
    Call MoveHelpMenuToRight(Me.hWnd, 3)
    'Call MoveHelpMenuToRight(Me.hWnd, 4)
End Sub

とすればよい。

戻る