2011-09-11 8 views
1

私はダイアログベースのMFCアプリケーションを持っています。ダイアログボックスにはメニューがあり、ダイアログボックスでメニューアクセラレータを有効にするにはhereというテクニックを使用しています。ダイアログボックスのメニューコマンド更新ハンドラ

これは問題なく動作しますが、メニューコマンドの更新ハンドラを実装する方法が見つからないようです。あるいは、私は更新ハンドラを実装しましたが、MFCに呼び出すための良い方法を見つけることができないようです。

Webを検索すると、UpdateDialogControls()のような機能があり、ダイアログの子コントロールのコマンド更新ハンドラを実装しています。しかし、私はダイアログボックスのメニューでコマンドを実行したい。

提案がありますか?

答えて

4

私はこれを実現しています。

最初はWM_KICKIDLEが有望でしたが(アイドルモードに入ったときにこのメッセージをダイアログボックスに送信する)、最終的に記事Update Command UI Handlers Do Not Work for Menu Attached to a Dialog Boxに記載されている方法で解決しました。

この記事では、OnInitMenuPopup()を処理し、CMainFrameのコードをハンドラにコピーする方法を示します。

ここでMSがダイアログボックスのサポートを改善しなかった理由はわかりません。しかし、私はそれが私の目的のために働いています。

+0

なぜなら、ダイアログはメニューやメニューアクセラレータを持っていないはずだからです。オリジナルの問題に対する「本当の」答えは「ダイアログボックスにメニューを入れない」ことでした。それはWindowsの方法ではありません。 – Roel

+0

@Roel:私はもっと同意できませんでした。 MFC自体は、ダイアログベースのアプリケーションのアイデアをサポートしています。多くの場合、メニューをダイアログに基づいて配置するのは意味がありません。しかし時々そうです。 –

+0

MFCダイアログベースのアプリケーションは、メニューのない単純なダイアログでも、「フォーム」(つまりダイアログ)に基づいたビューを持つSDIアプリケーションでもかまいません。その場合、ダイアログはメニューまたはアクセラレータを処理しません。フレームウィンドウ(CMainFrame)は処理します。メニューをダイアログに配置する方法に関する情報を簡単に見つけることができない理由があります。 PreTranslateMessage()を使用する必要がある時間の95%は、何か間違っているためです.MFCではない、またはWindowsでない方法です。 – Roel

0

私はMFCにあまり慣れていませんが、私はプレーンなwin32で作業しましたが、これはあなたが必要とするもののように見えますThe ON_UPDATE_COMMAND_UI Macro。また、左側のナビゲーションメニューを見ると、「更新ハンドラが呼び出されたとき」のトピックもあります。

そして実際に処理しているウィンドウにハンドルを渡していることを確認してください(たとえば、チュートリアルのリスト3など)。

+0

はい、私は 'ON_UPDATE_COMMAND_UI()'マクロを定義しました。ただし、MFCはダイアログボックスで自動的に使用しません。 –

関連する問題