読者です 読者をやめる 読者になる 読者になる

メニューのクラス化(WindowsAPI)

今度はメニューをクラス化してみる・・・。

f:id:BG1:20160518134714p:plain

メニューリソースを追加したら、

f:id:BG1:20160518134750p:plain

ここまで項目を決めて、IDなども変える・・・。

Menu.hのCMenuは、

こんな感じ・・・。
m_hWndはメニューを持つウィンドウのハンドル・・・。
ここでもm_pAppをこれに渡して、ここから使えるように・・・。
OnCommandMenuItemは、このクラス独自のハンドラだが純粋仮想関数にしてるので、派生クラスのCMainMenuクラスでオーバーライド・・・。

LoadMenuやSetMenuはAPI呼び出してるだけ・・・。

MainMenu.hのCMainMenuは、

ここでOnCommandMenuItemと、各メニューアイテムごとのハンドラを定義・・・。

LOWORD(wParam)をswitch-case文で各IDに振り分け、各ハンドラに・・・。

各ハンドラはメッセージボックスでメンバ関数名表示してるだけ・・・。

さて、このCMainMenuの作成と呼び出しだが、

CMainWindowにメンバとして持たせる・・・。

また、OnCommandの実装も忘れずに・・・。

OnCreateでのCMainMenu作成・・・。

そしてOnCommand・・・。

破棄も忘れずに・・・。

HIWORD(wParam)が0の時はメニューなので、m_pMainMenu->OnCommandMenuItemに任せる・・・。
これでCMainMenuにハンドラ処理を寄せられる・・・。

あとは先ほどのメニューアイテムごとのハンドラで処理がなされる・・・。

実行すると、

f:id:BG1:20160518141526p:plain

"ファイル"を押して、

f:id:BG1:20160518141552p:plain

"新規"を押すと、

f:id:BG1:20160518141657p:plain

"OnFileNew"・・・。

f:id:BG1:20160518141734p:plain

"アプリケーションの終了"なら、

f:id:BG1:20160518141750p:plain

"OnAppExit"となる・・・。

Test/WinMain.cpp at master · bg1bgst333/Test · GitHub
Test/Application.h at master · bg1bgst333/Test · GitHub
Test/Application.cpp at master · bg1bgst333/Test · GitHub
Test/MainApplication.h at master · bg1bgst333/Test · GitHub
Test/MainApplication.cpp at master · bg1bgst333/Test · GitHub
Test/Window.h at master · bg1bgst333/Test · GitHub
Test/Window.cpp at master · bg1bgst333/Test · GitHub
Test/MainWindow.h at master · bg1bgst333/Test · GitHub
Test/MainWindow.cpp at master · bg1bgst333/Test · GitHub
Test/Menu.h at master · bg1bgst333/Test · GitHub
Test/Menu.cpp at master · bg1bgst333/Test · GitHub
Test/MainMenu.h at master · bg1bgst333/Test · GitHub
Test/MainMenu.cpp at master · bg1bgst333/Test · GitHub
Test/resource.h at master · bg1bgst333/Test · GitHub
Test/CMenu.rc at master · bg1bgst333/Test · GitHub