ON_UPDATE_COMMAND_UI

CFrameWnd::LoadFrameで、リソースからフレームをロードして、フレームウィンドウを作成できた・・・。
しかし、

  1. ウィンドウのタイトルが表示されない
  2. メニューが有効になっていない

という2つの問題が発生したので、これを解決していこう・・・。

まず、ウィンドウのタイトルが表示されない問題だが、これはLoadFrameでロードするフレームの中には、MENU、ICON、ACCELERATORSの他に、STRINGTABLEも含まれることから発生する・・・。
STRINGTABLEで、

このように、ロードするリソースID"IDR_MAINFRAME"とタイトルにしたい文字列"ON_UPDATE_COMMAND_UI"のペアをSTRINGTABLEで登録すると、ウィンドウのタイトルは"ON_UPDATE_COMMAND_UI"となる・・・。

次に、メニューの有効化(これが本題)だが、メニュー表示前などに呼ばれるUI更新メッセージに対するハンドラを設定し、そこに有効化の処理を書かなければいけない・・・。

ON_UPDATE_COMMAND_UI

このON_UPDATE_COMMAND_UIマクロを使って、UI更新ハンドラをセットする・・・。

CFrameWnd_.hで、

UI更新はメニュー項目ごとに行われるので、項目1つごとにハンドラを定義する・・・。これはItem1-1のハンドラ・・・。

CFrameWnd_.cppでは、

渡されるpCmdUIオブジェクトポインタがNULLでなければ、Enableメンバ関数を呼ぶ・・・。
これでメニュー項目Item1-1は有効になる・・・。

あとは、このハンドラを、

ON_UPDATE_COMMAND_UIマクロにセットする・・・。

あ、そうだ・・・。
これプロジェクト名に"UPDATE"と含まれてるので、マニフェストファイル(app.manifest)を忘れずに・・・。
(githubにaddし忘れた・・・。詳しくはDispatchMessage - 車輪のx発明 ~B.G's Blog~)

実行すると、

f:id:BG1:20150608132345p:plain

タイトル"ON_UPDATE_COMMAND_UI"も出ているし、メニュー項目もItem1-1だけだが有効になっている・・・。

Sample/CWinApp_.h at master · bg1bgst333/Sample · GitHub
Sample/CWinApp_.cpp at master · bg1bgst333/Sample · GitHub
Sample/CFrameWnd_.h at master · bg1bgst333/Sample · GitHub
Sample/CFrameWnd_.cpp at master · bg1bgst333/Sample · GitHub
Sample/resource.h at master · bg1bgst333/Sample · GitHub
Sample/ON_UPDATE_COMMAND_UI.rc at master · bg1bgst333/Sample · GitHub