MFCでOS標準のメニューバーを使う
Q. MFCのメニューバーはダサい?
当初これがMFCなのかとがっかりした。一応デザインが選べるが、2008年あたりで時代が止まっている。
↑はVisual Studio 2015で新しいプロジェクト → Visual C++ → MFC アプリケーション → ウィザードで初期設定のまま進んだとき生成される。
A. ダイヤログベースを選び、あとからメニューバーを追加する
ここで諦めてしまうのはとても勿体ない。WordやExcelのテンプレートもそうだが、Microsoftが提供してくれる雛形がまともだった試しが無い。MFCの場合、ウィザードではダイヤログベースを選んでおき、あとで「リソースの追加」からmenuを追加することでやっと一般的なソフトを作るためのスタート地点に立てる。一般的なソフトというのは、Windows10であればメニューバーが白色で、フォーカスしている部分だけフラットな水色になるソフトのことである。設定次第ではXPでもそのまま動き、XPなりのデザインで表示されるのがMFCのいいところである。
詳細な手順
Visual Studio 2017の画面で説明するが、他のバージョンでもだいたい同じである。
ファイル → 新規作成 → プロジェクト
テンプレート → Visual C++ のなかにMFCが無いので、「Visual Studio インストーラを開く」。そもそもVisual C++が無かった場合は次の画面で「C++によるデスクトップ開発」にチェックを入れるなどしてVC++をインストールする。
個々のコンポーネントでMFCとATLのサポートを選択。これだけで1.2GBとは、にわかに信じがたい。
再びVS2017で新しいプロジェクトのMFC→MFCアプリケーション。名前以下は好きなように。
MFC アプリケーション ウィザードの「アプリケーションの種類」で「ダイヤログベース」を選び*1、将来ポータブルアプリとして配布できるように「スタティックライブラリでMFCを使用する」を選択する*2。
お好みで。それぞれマウスオーバーして出る説明を見ながら決める。分からなければチェックについては下記の通りにすれば後悔は少ないと思う。ちなみに「システムメニュー」にチェックを入れなかった場合、タイトルバーに閉じるボタンなどが出ないうえ、タイトルバーを右クリックしても何も出ない。
高度な機能はマニアックなようなので現時点でピンとくるもの以外はすべてオフでよさそう。
完了。
とりあえず動かしてみよう。上部中央の「ローカル Windows デバッカー」
最大化や最小化、画面サイズを変えるなどしてみよう。OKとキャンセルのボタンの位置が固定なのはMFCのご愛嬌。どちらのボタンを押しても終了するのは、そういうプログラムが最初から書かれているからである。もしここで動かない(ビルドできない)場合は何かしらのエラー表示があるはずなので、それをGoogle検索するなどして乗り切ろう。
メニューバーを付ける。表示 → その他のウィンドウ → リソースビュー。
リソースビューでプロジェクトを右クリック → 追加 → リソース。
Menuを選んで新規作成*3。
好きなようにメニューを編集する。よくある(Q)みたいな機能は(&Q)と書く。
リソースビュー → (プロジェクト名) → (プロジェクト名).rc → Dialog → IDD_(プロジェクト名)_DIALOG を開き、プロパティの上から9個目くらいのMenuに先ほど作成したメニュー(たぶんIDR_MENU_1)を指定する。
ふたたびデバッグすると無事OS標準のメニューバーが表示された。
各メニューのクリックに反応して何かプログラムを実行する方法は MFC編 - ダイアログにメニューをつける などを参照。
右下のボタンがデフォルトだと前時代的で古臭く、がっかりしたかもしれないが、これも自分でMFC Button Controlを置けばOS標準のデザインになる。
脚注
*1:MFC によるダイアログベースのアプリケーション(1) http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20100820
*2:Yahoo! 知恵袋 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10111420165
*3:ダイアログにメニューをつける http://www.g-ishihara.com/mfc_me_01.htm