メニュー項目にチェックマークをつける

メニュー項目にチェックマークをつけたり外したりする処理について説明する。
ここでは、ウィンドウを常に最前面に表示するようにしたり、この設定を外したりできるようにしてみたい。

適当な名前のSDIプロジェクトを新規作成し、「Resource View」からメニューリソースを選択する。 「ファイル(F)」「編集(E)」「表示(V)」「ヘルプ(H)」の4つのメニュー項目があるはずなので、 「表示(V)」メニューを選択し、表示されたサブメニューの一番下に「常に最前面に表示(M)」という項目を追加する。 この項目のプロパティでIDを「ID_VIEW_TOPMOST」とする。
メニューリソースの編集を終えたら、メニューが選択されるたびにウィンドウを常に最前面に表示するようにしたり、 この設定を無効にしたりする処理を切り替えるようにするコードを記述する。
「表示」−「ClassWizard」メニューを選択してClassWizardダイアログを開き、クラス名を「CMainFrame」にする。 オブジェクトID「ID_VIEW_TOPMOST」のCOMMANDメッセージを選択して「関数の追加」をおこなう。 これでCMainFrame::OnViewTopmost関数が作成されるので、CMainFrameクラスのソースを開いて以下のように編集する。

void CMainFrame::OnViewTopmost() 
{
	// TODO: この位置にコマンド ハンドラ用のコードを追加してください
	if( GetExStyle() & WS_EX_TOPMOST )
		SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
	else
		SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
}
この時点でビルドし、実行してみる。一回「常に最前面に表示」メニューを選択すると、 他のアプリケーションウィンドウを選択してもウィンドウが他のアプリの下に隠れないようになる ("常に最前面に表示"が有効になっている)。 再度「常に最前面に表示」メニューを選択すると、 他のアプリケーションウィンドウを選択したときにウィンドウが他のアプリの下に隠れるようになる。 あとはメニューを選択するたびに状態が交互に切り替わる。
しかし、このままだと現在どちらの状態にあるかが一目ではわかりにくい。 そこで、"常に最前面に表示"が有効なときには、メニューにチェックマークがつくようにしたい。

ClassWizardダイアログを開き、 オブジェクトID「ID_VIEW_TOPMOST」のUPDATE_COMMAND_UIメッセージを選択して「関数の追加」をおこなう。 このメッセージはメニューがプルダウンされたときに発行される。追加した関数は以下のように編集する。

void CMainFrame::OnUpdateViewTopmost(CCmdUI* pCmdUI) 
{
	// TODO: この位置に command update UI ハンドラ用のコードを追加してください
	if( GetExStyle() & WS_EX_TOPMOST )
		pCmdUI->SetCheck(TRUE);
	else
		pCmdUI->SetCheck(FALSE);
ちなみに、ツールバーにID_VIEW_TOPMOSTコマンドのボタンを作成した場合、 メニューにチェックマークがあるときにはボタンが押されたままの状態になる。

目次へ