メニュー項目の左側に、V字(レ点)のチェックマークが付いていることがあります。また、V字ではなく、黒い丸のチェックマーク(オプションボタン、排他的チェックマーク)の場合もあります。黒丸のチェックマークは、そのグループの中で一つしか選択できないことを示しています。ここではこのようなチェックマークをメニューに表示する方法を紹介します。
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イベントハンドラで切り替えるものとします。
'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
//ToolStripMenuItem1のClickイベントハンドラ private void ToolStripMenuItem1_Click(object sender, EventArgs e) { ToolStripMenuItem item = (ToolStripMenuItem)sender; //チェック状態を反転させる item.Checked = !item.Checked; }
排他的チェックマークのように、グループ内で1つの項目しかチェックマークを付けることができないようにするには、やはりClickイベントを利用して自分でコードを書きます。
以下の例では、3つのToolStripMenuItem(ToolStripMenuItem1,2,3)の内1つしかチェックマークを付けることができないようにしています。ここではチェックマークを黒丸にしています。
'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
//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にチェックマークが付けられたことを知るサンプルを示します。
'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
//ToolStripMenuItem1のCheckedChangedイベントハンドラ private void ToolStripMenuItem1_CheckedChanged(object sender, EventArgs e) { ToolStripMenuItem item = (ToolStripMenuItem)sender; if (item.Checked) { Console.WriteLine(item.Text + "がチェックされました"); } }
MainMenuコントロール(またはContextMenuコントロール)の場合は、メニュー項目のMenuItem.CheckedプロパティをTrueにすると、チェックマークが付きます。この時、MenuItem.RadioCheckプロパティがFalseならばマークはV字で、Trueならばマークは黒丸になります。
ただしRadioCheckプロパティをTrueにしても自動的に一つの項目だけしか選択できないようになるということはありませんので、自分でコードを書いて制御する必要があります。
'MenuItem1のチェックマークが丸くなるようにする MenuItem1.RadioCheck = True 'MenuItem1にチェックマークを付ける MenuItem1.Checked = True
//MenuItem1のチェックマークが丸くなるようにする MenuItem1.RadioCheck = true; //MenuItem1にチェックマークを付ける MenuItem1.Checked = true;