今回はプログラミングについての話題です。MFC(Microsoft Foundation Class)を使ったプログラミングで気になった点があったので備忘録も兼ねて記しておきます。

■MFCといえば

MFCといえば、以前は有料版のVisual Studioにしか搭載されていませんでしたが、ここ数年の間に出たVisual Studio Communityと呼ばれる(使用条件はあるが)無料版の製品にも搭載されていて話題となっているライブラリです。
MFCについて詳しく説明するのはここでの目的ではないため省略します。

■ひとつ気になる点が。
MFCが無料なら使わない手はないっしょ!ってことで使ってみたのですが、ひとつ気になる点が。それは、リボンを使ったアプリケーションを作ったときに起こります。もっといえば、プロジェクトの作成時に適用するVisualスタイルを選べるのですが、ここでWindows7のスタイルを選ぶ(もしくはVisualスタイルの切り替えを有効にする)と起こります。 
ちなみに、「リボン」が何かわからない方は「Windows リボン」などのキーワードで画像検索してください。

■それってどんな問題? 
簡単に言うと、コントロールが有効になっている(たとえば、ボタンなら押せる、チェックボックスならチェックのON/OFFが切り替えられるなど)にもかかわらずあたかも無効であるかのように見えるというものです。
MFCではプロジェクトの作成時に見た目の設定がかなり細かくできるのですが、ここで、先に述べたように、リボンを使ったアプリケーションを作り、「Windows7」という名前のスタイル(実際のOSには関係なく使える)を適用すると、上の問題が発生します。
文字で書いてもわかりにくいでしょうから、実際に画像を貼ります。
Before
上の画像で、「貼り付け」「切り取り」「コピー」「すべて選択」のボタンは無効、「ステータスバー」「キャプションバー」のチェックボックスは有効です。
これでは無効か有効かがきわめてわかりにくいですよね。まあ、マウスを載せれば有効なところは光るので、それでわかるわけですが、それでは納得がいかないわけです。

■解決策は?
で、この問題を解消してみよう!ってのが、この記事。
自分なりに検索をかけてみたところ、なんと見つかった!そのページが、こちら(英語)です。ここに書いてある「Option 2」を試してみたところ、うまく行きました!
書いてあるままなのですが、この記事でも簡単に解説すると、こんな感じになります。
  1. プロジェクト作成後、「プロジェクト(P)」⇒「クラスの追加(C)...」をクリックして、MFCクラスを選択し「追加(A)」をクリック。
  2. 「MFC クラス追加ウィザードへようこそ」と書かれた画面が出るので、クラス名に任意の文字列(使っていい文字とかは、もちろん規定の範囲内で。ここではCWin7VMとする)を入力、CMFCVisualManagerWindows7クラスを継承します(つまり、基底クラスにCMFCVisualManagerWindows7を選ぶ)。
  3. CWin7VMクラス内(ヘッダファイル側)で「DECLARE_DYNCREATE(CWin7VM)」を記述
  4. OnUpdateSystemColorsメソッドをオーバーライド
  5. CWin7VMクラス内(ソースファイル側)でオーバーライドしたOnUpdateSystemColorsの内容を記述。このメソッド内では「CMFCVisualManagerWindows7::OnUpdateSystemColors();」を実行した後「m_clrRibbonPanelCaptionText = RGB(0, 0, 0);」を実行。
  6. 同じくソースファイル側のグローバルスコープで「IMPLEMENT_DYNCREATE(CWin7VM, CMFCVisualManagerWindows7)」を呼び出す
  7. MainFrm.cpp内のOnApplicationLookメソッド内 ID_VIEW_APPLOOK_WINDOWS_7 による分岐のところでCMFCVisualManager::SetDefaultManagerの引数を RUNTIME_CLASS(CWin7VM)に書き換える
Before
Before
After
After
こうやってみると、もともとのスタイルでは文字が薄くなっていただけでなく「貼り付け」のアイコンが濃くなっていたことがわかります。