3

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

この時点で、IDR_MAINFRAME アクセラレータ テーブルを手動でロードし、メッセージを自分で変換することで、アクセラレータを動作させることができました。ただし、CMFCMenuBar はまだ既定のアクセラレータを追加しています。

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

4

2 に答える 2

16

この問題に取り組むのにあまりにも多くの時間を費やしたので、私にとってはうまくいくように見える解決策を投稿したいと思いました.

電話する :

theApp.GetKeyboardManager()->ResetAll();

MDI フレームワークがレジストリからロードされた後 (レジストリが読み取られるように見える LoadFrame() を呼び出した直後に呼び出す PostLoadFrame() という特定の関数を作成しました)。

この関数呼び出しは、レジストリから読み込まれたすべてのアクセラレータを無視し (私はアクセラレータのカスタマイズを許可していないので、これで問題ありません)、代わりにリソース ファイル内のアクセラレータを使用します。

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

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

于 2010-11-15T16:01:47.727 に答える
6

どうやら一部の CMFCMenuBar 設定がレジストリに永続化されているようです (HKCU だと思います)。アプリケーションのレジストリ設定をクリアして、正しいアクセラレータが表示されるかどうかを確認してください。

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

于 2009-08-23T13:47:18.683 に答える