プロが教えるわが家の防犯対策術!

自作したアプリケーションのショートカットキーを、
ユーザーが後からカスタマイズできるようにするにはどうしたらよいでしょうか。
具体的には、VisualC++2005のリソースビューの[Accelerator]で編集するような内容を、ユーザーが後から行えるようにしたい、ということです。

単純に考えれば、OnKeyDownメソッドでキーが押されたときの場合わけを自分で実装するのかと思いますが、 Acceleratorがリソースファイルに記述されていることを考えると、もっとスマートな方法があるのではないかと思って。どなたかアドバイスなどいただけると幸いです。

A 回答 (2件)

★アクセラレータを動的に作成します。


・通常は『リソースファイル』で定義しているショートカットキー情報をアプリケーションが
 起動したときに動的に作成します。→『WinMain』関数などで作成する。
・このとき、ユーザが定義したキーデータ・ファイルを読み込んで、そのデータを解析した後
 『CreateAcceleratorTable』関数でアクセラレータを動的に作成します。
 この関数の戻り値を『TranslateAccelerator』関数の『HACCEL hAccTable』に使うのです。
・また、アプリケーションが終了するときには、必ず『DestroyAcceleratorTable』関数で
 『HACCEL hAccTable』ハンドルを破棄します。
・ユーザが定義したキーデータ・ファイルは独自形式でも良いし、リソースと同じ形式でも
 良いでしょう。または、バイナリ形式で記録して一気にメモリ内に読み込んでも良いでしょう。
・この辺のインターフェイスは torus さんの自由です。

最後に:
・OnKeyDown メソッドで処理するよりも WM_COMMAND に機能を割り当てて、キーが押されたら
 WM_COMMAND への ID コードを発行して処理させる方がスマートになります。
 この方法を取れば、メニューバーの処理部分も外部のキー定義データでユーザがカスタマイズ
 出来るようにもなります。OnKeyDown メソッドなどに処理を割り当てずに WM_COMMAND の
 メッセージ内で処理を分岐させましょう。
・以上。おわり。
    • good
    • 0
この回答へのお礼

大変ご丁寧な参考になるアドバイスをありがとうございます。
問題解決の方法がわかりました。助かります。
Oh-Orange様が大変お詳しいようにお見受けできますので、大変恐縮ですが、アクセラレータを変更するときに、メニューの表示(例えば[印刷 Ctrl+P])の文字も更新する方法をご教授いただけないでしょうか。

お礼日時:2007/02/24 12:56

★メニュー表示の変更は『メニュー・バー』も動的に作成します。


・通常はリソースファイルで定義している『メニュー・バー』もアクセラレータと同じで
 動的に作成するのです。つまり、アクセラレータ情報とメニュー・バーの文字列を同時に
 変更する必要があるのです。
・この2つは両方ともプログラム上で作成・廃棄を行えるため、任意のタイミングで
 メニュー・バー全体を別のメニューに変更することさえ出来ます。
・メニュー・バーは『CreateMenu』関数で動的作成して『InsertMenuItem』『InsertMenu』関数で
 項目などを追加していきます。
・アプリケーションの終了時には『DestroyMenu』関数で破棄するようにします。
・また動的に作成したメニュー・ハンドルをウインドウに割り付けるには『SetMenu』関数を
 使います。さらにメニュー項目を変更したときには『DrawMenuBar』関数で再描画させます。
・他にもメニュー・バーのチェックやラジオボタンなどの状態は、『MENUITEMINFO』構造体と
 『GetMenuItemInfo』『SetMenuItemInfo』関数で取得・設定が出来ます。ラジオボタンのような
 設定は『CheckMenuRadioItem』関数が便利です。
・上記以外にも『GetMenuItemCount』関数はメニュー項目の数を取得して『GetMenuItemID』関数は
 メニュー項目の ID を取得します。→この関数は特に使いませんが知っていても良いでしょう。

最後に:
・メニュー・バーを動的に作らなくても表示文字列だけを変更する方法もあります。
 多分、この方が簡単で良いでしょう。→つまり、基本のメニュー・バーをリソースで定義して
 アクセラレータで変更された部分だけメニュー・バーの表示文字列を『MENUITEMINFO』構造体と
 『GetMenuItemInfo』『SetMenuItemInfo』関数を使って変更するのです。メニュー項目を変更
 したときには『DrawMenuBar』関数で再描画するのを忘れずに行いましょう。
・いろいろメニュー操作の関数が豊富に用意されていますので google などで検索すればたくさん
 見つかりますよ。そんなに難しくないので今日中には関数のおよその使い方が分かるかもね。
・以上。おわり。→下の『参考URL』の 77 番から 83 番を参考にして下さい。

参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/i …
    • good
    • 0
この回答へのお礼

大変迅速な、そしてわかりやすい回答をありがとうございます。
いただいた情報で行いたいと思っていたことを実現できそうです。
追加の質問にまで親切に回答いただいて感激しております。
感謝いたします。ありがとうございます。

お礼日時:2007/02/24 17:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!