2009-08-17 14 views
2

VS2008を使用するドキュメント/ビュープロジェクトでは、メニュー項目の追加と削除がメニューのUIに反映されるため、MFCMenuBarはプロジェクトから正しいMENUリソース(IDR_MAINFRAME)をロードしているようです。それは、アクセラレータをデフォルトのメニュー項目(例えば、Ctrl + OをOpen ...の項目)に追加します。ただし、アクセラレータテーブル(IDR_MAINFRAME)はメニューに接続されていないようです。デフォルトのCtrl + OをOpen ...のように変更すると、Ctrl + 7のように動作しません。 Ctrl + OはOpen ...メニュー項目に追加され、Ctrl + OはまだOpen ...ハンドラを呼び出します。リソースファイルにはアクセラレータテーブルが1つしかないので、CMFCMenuBarがアクセラレータ情報を取得する場所はわかりません。CMFCMenuBarがアクセラレータテーブルを使用しないのはなぜですか?

この時点で、IDR_MAINFRAMEアクセラレータテーブルを手動で読み込んでメッセージを自分自身で翻訳することで、アクセラレータを動作させることができました。しかし、CMFCMenuBarはデフォルトアクセラレータを追加しています。

誰でもここで何が起こっているのか説明できますか? MFCMenuBarにアクセラレータテーブルを使用させ、アクセラレータを追加したり、適切なアクセラレータを追加したりしないようにするにはどうすればよいですか?

答えて

6

明らかに、いくつかのCMFCMenuBar設定はレジストリに保持されています(HKCUと思います)。アプリケーションのレジストリ設定をクリアし、正しいアクセラレータが表示されているかどうかを確認してください。

関連するCMFCMenuBarのトラブルシューティングについては、MSDN threadを参照してください。

+0

私は、最近更新されたアクセラレータテーブルを使用していないCDockablePaneで同じ問題を抱えていました。 HKCU \ Software \ \ をクリアすると問題が解決しました。同じことがCMFCMenuBarの助けになると思います。 –

+0

これはやっかいなことです。 ResetAll()で上記のオプションが良いです。 –

12

この問題に取り組むにはあまりにも多くの時間を費やしただけで、私にとってはうまくいくと思われるソリューションを投稿すると思っていました。

私が呼ぶ:

theApp.GetKeyboardManager()->ResetAll();

MDIフレームワークのものは、私がLoadFrameを(呼び出した直後に呼び出すレジストリ(私はPostLoadFrame(と呼ばれる特定の機能を作成しました))からロードされた後でありますレジストリが読み込まれる場所)。

この関数呼び出しは、レジストリからロードされたすべてのアクセラレータを無視します(これは私にはうまくカスタマイズできないためです)。代わりにリソースファイルでアクセラレータを使用します。

私が言ったように、それは私のアプリケーションで私のために働いているようです。アクセラレータキーのカスタマイズを許可すると、リソースファイルとレジストリに格納されている値をCKeyboardManagerの他の関数とマージすることは可能ですが、もう少し複雑です。

誰かがどこかで私が失った時間を節約するのに役立つことを願っています!!

関連する問題