自作したアプリケーションのショートカットキーを、
ユーザーが後からカスタマイズできるようにするにはどうしたらよいでしょうか。
具体的には、VisualC++2005のリソースビューの[Accelerator]で編集するような内容を、ユーザーが後から行えるようにしたい、ということです。
単純に考えれば、OnKeyDownメソッドでキーが押されたときの場合わけを自分で実装するのかと思いますが、 Acceleratorがリソースファイルに記述されていることを考えると、もっとスマートな方法があるのではないかと思って。どなたかアドバイスなどいただけると幸いです。
No.1ベストアンサー
- 回答日時:
★アクセラレータを動的に作成します。
・通常は『リソースファイル』で定義しているショートカットキー情報をアプリケーションが
起動したときに動的に作成します。→『WinMain』関数などで作成する。
・このとき、ユーザが定義したキーデータ・ファイルを読み込んで、そのデータを解析した後
『CreateAcceleratorTable』関数でアクセラレータを動的に作成します。
この関数の戻り値を『TranslateAccelerator』関数の『HACCEL hAccTable』に使うのです。
・また、アプリケーションが終了するときには、必ず『DestroyAcceleratorTable』関数で
『HACCEL hAccTable』ハンドルを破棄します。
・ユーザが定義したキーデータ・ファイルは独自形式でも良いし、リソースと同じ形式でも
良いでしょう。または、バイナリ形式で記録して一気にメモリ内に読み込んでも良いでしょう。
・この辺のインターフェイスは torus さんの自由です。
最後に:
・OnKeyDown メソッドで処理するよりも WM_COMMAND に機能を割り当てて、キーが押されたら
WM_COMMAND への ID コードを発行して処理させる方がスマートになります。
この方法を取れば、メニューバーの処理部分も外部のキー定義データでユーザがカスタマイズ
出来るようにもなります。OnKeyDown メソッドなどに処理を割り当てずに WM_COMMAND の
メッセージ内で処理を分岐させましょう。
・以上。おわり。
大変ご丁寧な参考になるアドバイスをありがとうございます。
問題解決の方法がわかりました。助かります。
Oh-Orange様が大変お詳しいようにお見受けできますので、大変恐縮ですが、アクセラレータを変更するときに、メニューの表示(例えば[印刷 Ctrl+P])の文字も更新する方法をご教授いただけないでしょうか。
No.2
- 回答日時:
★メニュー表示の変更は『メニュー・バー』も動的に作成します。
・通常はリソースファイルで定義している『メニュー・バー』もアクセラレータと同じで
動的に作成するのです。つまり、アクセラレータ情報とメニュー・バーの文字列を同時に
変更する必要があるのです。
・この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 …
大変迅速な、そしてわかりやすい回答をありがとうございます。
いただいた情報で行いたいと思っていたことを実現できそうです。
追加の質問にまで親切に回答いただいて感激しております。
感謝いたします。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Word(ワード) Word 2016のマクロを Word 2021のWordでキー動作させたい 3 2023/04/12 16:14
- Windows 10 エクスプローラで希望の場所が表示できない 2 2023/06/29 15:19
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- iOS Windows OSにおける、ショートカットキーを受け取るソフトウェアの決定 5 2022/11/27 16:05
- iOS これは日本語入力の大発明ですか? 7 2022/12/21 07:17
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- その他(Microsoft Office) Office2013サポート終了後、何を選ぶか 8 2022/11/21 15:45
- その他(ブラウザ) ・再投稿です 自分のデフォルトゲートウェイをアドレスバーに入力し、Enterキーを押します。(一般的 1 2022/05/30 23:16
- Windows 10 Windows10でボリュームのアップダウンを簡単にできる方法ないですか? 1 2023/06/20 13:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダイアログの上のテキストボッ...
-
フォーム上のリストボックスに...
-
ボタンの表示の色、フォントを...
-
メッセージボックスを大きくす...
-
【VC++2005(CLR)】ダイアログ右...
-
タスクバーのメニュー表示
-
コンボボックスのドロップダウ...
-
ダイアログ最前面表示時の後ろ...
-
Visual C++のダイアログ編集画...
-
MFCダイアログボックスを最前面...
-
【VC++2005】ダイアログサイズ...
-
MFC ポップアップメニューのチ...
-
confirmダイアログの表示文字に...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
c言語でキーボードから2点の座...
-
コントロールの書式設定で、“コ...
-
ドロップダウンリストのフォン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスを大きくす...
-
ボタンの表示の色、フォントを...
-
コンボボックスのドロップダウ...
-
フォーム上のリストボックスに...
-
ダイアログボックスで指定した...
-
C# ボタンコントロール内で文字...
-
ダイアログの上のテキストボッ...
-
confirmダイアログの表示文字に...
-
'int' から 'LPCSTR' に変換で...
-
MFCダイアログボックスを最前面...
-
メッセージボックスのボタン文...
-
vbscriptで、ファイル選択ダイ...
-
ボタンの配置を変更したい
-
ダイアログにプレビュー表示
-
リソースファイルとは・・・
-
エクセル VBA 「Sub Auto_Open(...
-
ダイアログの表示位置の保存
-
VC(Ver6.0)でダイアログサイズ...
-
ダイアログの一部を半透明化す...
-
MFC ポップアップメニューのチ...
おすすめ情報