DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

メニューにV字や黒丸のチェックマークを付ける

メニュー項目の左側に、V字(レ点)のチェックマークが付いていることがあります。また、V字ではなく、黒い丸のチェックマーク(オプションボタン、排他的チェックマーク)の場合もあります。黒丸のチェックマークは、そのグループの中で一つしか選択できないことを示しています。ここではこのようなチェックマークをメニューに表示する方法を紹介します。

.NET Framework 2.0以降で、MenuStrip(またはContextMenuStrip)コントロールを使用している場合

チェックマークが付いたメニュー

MenuStripコントロール(またはContextMenuStripコントロール)を使用している場合は、メニュー項目のToolStripMenuItem.CheckStateプロパティをCheckedにすると、V字のチェックマークが付きます。Indeterminateにすると、黒丸のチェックマークが付きます。Uncheckedにすると、チェックは付きません。

ToolStripMenuItem.CheckedプロパティをTrueにすることによっても、チェックマークを付けることができます。ただしこの場合、必ずV字になります。CheckedプロパティをFalseにすると、チェックマークは消えます。

補足:実はCheckedプロパティの値は、CheckStateプロパティの値によって決まります。CheckStateプロパティがCheckedかIndeterminateの時にCheckedプロパティはTrueを返し、CheckStateプロパティがUncheckedの時にCheckedプロパティはFalseを返します。また、CheckedプロパティをTrueにするとCheckStateプロパティがCheckedになり、CheckedプロパティをFalseにするとCheckStateプロパティがUncheckedになります。
補足:一番親のToolStripMenuItemには、チェックマークが付きません。また、Imageプロパティが設定されていて、チェックマークが表示される場所に画像が表示されている時は、チェックマークが画像に隠れてしまいます。ContextMenuStripコントロールの場合は、ShowCheckMarginとShowImageMarginプロパティをTrueにすることにより、チェックマークと画像の両方を表示できるようになります。

メニュー項目をクリックすると、チェック状態がトグルで変わるようにする

メニュー項目がクリックされた時にチェックマークを付けたり外したりするには、Clickイベントを使用して自分で行うのが基本です。しかしToolStripMenuItem.CheckOnClickプロパティをTrueにすると、自動的にトグルでチェック状態が切り替わるようになります。ただしこの場合、V字のチェックマークになります。

Clickイベントを使用して、自分でチェック状態をトグルで切り替える例を以下に示します。ここでは「ToolStripMenuItem1」というToolStripMenuItemがすでに存在しており、そのチェック状態をClickイベントハンドラで切り替えるものとします。

VB.NET
コードを隠すコードを選択
'ToolStripMenuItem1のClickイベントハンドラ
Private Sub ToolStripMenuItem1_Click(sender As Object, e As EventArgs) _
        Handles ToolStripMenuItem1.Click
    Dim item As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
    'チェック状態を反転させる
    item.Checked = Not item.Checked
End Sub
C#
コードを隠すコードを選択
//ToolStripMenuItem1のClickイベントハンドラ
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
    ToolStripMenuItem item = (ToolStripMenuItem)sender;
    //チェック状態を反転させる
    item.Checked = !item.Checked;
}

グループ内で1項目しかチェックマークを付けられないようにする

排他的チェックマークのように、グループ内で1つの項目しかチェックマークを付けることができないようにするには、やはりClickイベントを利用して自分でコードを書きます。

以下の例では、3つのToolStripMenuItem(ToolStripMenuItem1,2,3)の内1つしかチェックマークを付けることができないようにしています。ここではチェックマークを黒丸にしています。

VB.NET
コードを隠すコードを選択
'ToolStripMenuItem1のClickイベントハンドラ
Private Sub ToolStripMenuItem1_Click(sender As Object, e As EventArgs) _
        Handles ToolStripMenuItem1.Click, _
                ToolStripMenuItem2.Click, _
                ToolStripMenuItem3.Click
    'グループのToolStripMenuItemを配列にしておく
    Dim groupMenuItems As ToolStripMenuItem() = New ToolStripMenuItem() { _
            Me.ToolStripMenuItem1, _
            Me.ToolStripMenuItem2, _
            Me.ToolStripMenuItem3}

    'グループのToolStripMenuItemを列挙する
    For Each item As ToolStripMenuItem In groupMenuItems
        If Object.ReferenceEquals(item, sender) Then
            'ClickされたToolStripMenuItemならば、Indeterminateにする
            item.CheckState = CheckState.Indeterminate
        Else
            'ClickされたToolStripMenuItemでなければ、Uncheckedにする
            item.CheckState = CheckState.Unchecked
        End If
    Next
End Sub
C#
コードを隠すコードを選択
//ToolStripMenuItem1,2,3のClickイベントハンドラ
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
    //グループのToolStripMenuItemを配列にしておく
    ToolStripMenuItem[] groupMenuItems = new ToolStripMenuItem[]
    {
        this.ToolStripMenuItem1,
        this.ToolStripMenuItem2,
        this.ToolStripMenuItem3
    };

    //グループのToolStripMenuItemを列挙する
    foreach(ToolStripMenuItem item in groupMenuItems)
    {
        if (object.ReferenceEquals(item, sender))
        {
            //ClickされたToolStripMenuItemならば、Indeterminateにする
            item.CheckState = CheckState.Indeterminate;
        }
        else
        {
            //ClickされたToolStripMenuItemでなければ、Uncheckedにする
            item.CheckState = CheckState.Unchecked;
        }
    }
}

チェック状態が変化したことを知る

Checkedプロパティが変化した時は、CheckedChangedイベントが発生します。また、CheckStateプロパティが変化した時は、CheckStateChangedイベントが発生します。

CheckedChangedイベントを使って、ToolStripMenuItemにチェックマークが付けられたことを知るサンプルを示します。

VB.NET
コードを隠すコードを選択
'ToolStripMenuItem1のCheckedChangedイベントハンドラ
Private Sub ToolStripMenuItem1_CheckedChanged( _
    ByVal sender As Object, ByVal e As EventArgs) _
        Handles ToolStripMenuItem1.CheckedChanged
    Dim item As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
    If item.Checked Then
        Console.WriteLine(item.Text + "がチェックされました")
    End If
End Sub
C#
コードを隠すコードを選択
//ToolStripMenuItem1のCheckedChangedイベントハンドラ
private void ToolStripMenuItem1_CheckedChanged(object sender, EventArgs e)
{
    ToolStripMenuItem item = (ToolStripMenuItem)sender;
    if (item.Checked)
    {
        Console.WriteLine(item.Text + "がチェックされました");
    }
}

.NET Framework 1.1以前で、MainMenu(またはContextMenu)コントロールを使用している場合

MainMenuコントロール(またはContextMenuコントロール)の場合は、メニュー項目のMenuItem.CheckedプロパティをTrueにすると、チェックマークが付きます。この時、MenuItem.RadioCheckプロパティがFalseならばマークはV字で、Trueならばマークは黒丸になります。

ただしRadioCheckプロパティをTrueにしても自動的に一つの項目だけしか選択できないようになるということはありませんので、自分でコードを書いて制御する必要があります。

VB.NET
コードを隠すコードを選択
'MenuItem1のチェックマークが丸くなるようにする
MenuItem1.RadioCheck = True
'MenuItem1にチェックマークを付ける
MenuItem1.Checked = True
C#
コードを隠すコードを選択
//MenuItem1のチェックマークが丸くなるようにする
MenuItem1.RadioCheck = true;
//MenuItem1にチェックマークを付ける
MenuItem1.Checked = true;

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。