ぴよ軒メモ

ググったときこんな情報が欲しかった、を投稿します

MFCでOS標準のメニューバーを使う

Q. MFCのメニューバーはダサい?

当初これがMFCなのかとがっかりした。一応デザインが選べるが、2008年あたりで時代が止まっている。
f:id:p4ken:20170412203303p:plain

↑はVisual Studio 2015で新しいプロジェクト → Visual C++MFC アプリケーション → ウィザードで初期設定のまま進んだとき生成される。
f:id:p4ken:20170412202328p:plain

A. ダイヤログベースを選び、あとからメニューバーを追加する

ここで諦めてしまうのはとても勿体ない。WordやExcelのテンプレートもそうだが、Microsoftが提供してくれる雛形がまともだった試しが無い。MFCの場合、ウィザードではダイヤログベースを選んでおき、あとで「リソースの追加」からmenuを追加することでやっと一般的なソフトを作るためのスタート地点に立てる。一般的なソフトというのは、Windows10であればメニューバーが白色で、フォーカスしている部分だけフラットな水色になるソフトのことである。設定次第ではXPでもそのまま動き、XPなりのデザインで表示されるのがMFCのいいところである。
f:id:p4ken:20170412223108p:plain

詳細な手順

Visual Studio 2017の画面で説明するが、他のバージョンでもだいたい同じである。

ファイル → 新規作成 → プロジェクト
f:id:p4ken:20170412223945p:plain

テンプレート → Visual C++ のなかにMFCが無いので、「Visual Studio インストーラを開く」。そもそもVisual C++が無かった場合は次の画面で「C++によるデスクトップ開発」にチェックを入れるなどしてVC++をインストールする。
f:id:p4ken:20170413000659p:plain

個々のコンポーネントMFCとATLのサポートを選択。これだけで1.2GBとは、にわかに信じがたい。
f:id:p4ken:20170413000421p:plain

再びVS2017で新しいプロジェクトのMFCMFCアプリケーション。名前以下は好きなように。
f:id:p4ken:20170413002615p:plain

MFC アプリケーション ウィザードの「アプリケーションの種類」で「ダイヤログベース」を選び*1、将来ポータブルアプリとして配布できるように「スタティックライブラリでMFCを使用する」を選択する*2
f:id:p4ken:20170413003524p:plain

お好みで。それぞれマウスオーバーして出る説明を見ながら決める。分からなければチェックについては下記の通りにすれば後悔は少ないと思う。ちなみに「システムメニュー」にチェックを入れなかった場合、タイトルバーに閉じるボタンなどが出ないうえ、タイトルバーを右クリックしても何も出ない。
f:id:p4ken:20170413003556p:plain

高度な機能はマニアックなようなので現時点でピンとくるもの以外はすべてオフでよさそう。
f:id:p4ken:20170413004912p:plain

完了。
f:id:p4ken:20170413005018p:plain

とりあえず動かしてみよう。上部中央の「ローカル Windows デバッカー」
f:id:p4ken:20170413005258p:plain

最大化や最小化、画面サイズを変えるなどしてみよう。OKとキャンセルのボタンの位置が固定なのはMFCのご愛嬌。どちらのボタンを押しても終了するのは、そういうプログラムが最初から書かれているからである。もしここで動かない(ビルドできない)場合は何かしらのエラー表示があるはずなので、それをGoogle検索するなどして乗り切ろう。
f:id:p4ken:20170413005440p:plain

メニューバーを付ける。表示 → その他のウィンドウ → リソースビュー。
f:id:p4ken:20170413010229p:plain

リソースビューでプロジェクトを右クリック → 追加 → リソース。
f:id:p4ken:20170413010355p:plain

Menuを選んで新規作成*3
f:id:p4ken:20170413010610p:plain

好きなようにメニューを編集する。よくある(Q)みたいな機能は(&Q)と書く。
f:id:p4ken:20170413010815p:plain

リソースビュー → (プロジェクト名) → (プロジェクト名).rc → Dialog → IDD_(プロジェクト名)_DIALOG を開き、プロパティの上から9個目くらいのMenuに先ほど作成したメニュー(たぶんIDR_MENU_1)を指定する。
f:id:p4ken:20170413011743p:plain

ふたたびデバッグすると無事OS標準のメニューバーが表示された。
f:id:p4ken:20170413011856p:plain

各メニューのクリックに反応して何かプログラムを実行する方法は MFC編 - ダイアログにメニューをつける などを参照。

右下のボタンがデフォルトだと前時代的で古臭く、がっかりしたかもしれないが、これも自分でMFC Button Controlを置けばOS標準のデザインになる。
f:id:p4ken:20170412220825p:plain

脚注