VS2010, C++, MFC, SDI, CFormView です。
メニュー&ツールバーの場合とリボンコントロールの場合と、両方やってみましたが、
同じ結果です。
ウィザードで CFormView のアプリを作成し、フォームにエディットボックスを2つ配置
します。
片方のエディットに文字を入力して「Ctrl+C」キーを押し、次にもう一つのエディット
にフォーカスを移して「Ctrl+V」キーを押しても、コピーできません。
リソースファイルの Accelerator を見ると、次の行はちゃんと出ています。
C, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
V, ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT
VS2010 の問題でしょうか?
VS2005 のときは問題なかったと思います。
VS2005 で作成した同じCFormViewのアプリを、VS2010に自動更新したものでは、上記の
Ctrl+C, Ctrl+V なども、自分で追加したメニューの場合も、アクセラレーター・キーが
有効です。
VS2008やVS2010で同様の経験をされた方はいらっしゃらないでしょうか?
対策法があったら教えてください。よろしくお願いいたします。
VS2005で新規でCFormViewのプロジェクトを作って試してみましたが、
同じように初期状態ではエディットボックス自身のコピー処理は動きませんでしたよ。
動かなかったというよりは、CFormView::PreTranslateMessage()の中で
親フレームのPreTranslateMessage()が呼ばれているので、
その中でID_EDIT_COPYなどに変換されているのではと思われます。
ID_EDIT_COPYに変換されてしまったら、
エディットボックス自身のコピー処理は当然動きません。
「VS2005で作成した同じCFormViewのアプリ」ではなにか対策をしていませんか?
(アクセラレータにCtrl+Cを入れていないとか、
ID_EDIT_COPYのコマンドハンドラで独自にコピー処理をしているとか、
CFormView::PreTranslateMessage()をオーバライドしているとか)
NOR様、有り難うございます。
> 「VS2005で作成した同じCFormViewのアプリ」ではなにか対策をしていませんか?
> (アクセラレータにCtrl+Cを入れていないとか
そうでしたね。VS2005 で作成したのが昔だったので、忘れていました。
しかし、リソースファイル内のアクセラレーター
C, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
V, ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT
この2行を削除しましたが、やはり動作しません。
よく見ると、メニューの「コピー」「貼り付け」等がグレー表示になっています。
同様に、自分で追加したメニュー項目でも動作しません。例えば、
メニュー項目に
MENUITEM 花の慶次\tCtrl+K, ID_MENU_HANANOKEIJI
アクセラレーター項目に
K, ID_MENU_HANANOKEIJI, VIRTKEY, CONTROL
としても、Ctrl+K で動作しませんし、メニューの表示を見ると「花の慶次」だけで
「Ctrl+K」という文字が現れません。
なんかおかしいです?!
自分で追加したメニューは、PreTranslateMessage()の中で処理コードを書いてもいいで
すが、Ctrl+C や Ctrl+V などは自分で処理コードを書くのは非常に大変です。
> この2行を削除しましたが、やはり動作しません。
>
> 同様に、自分で追加したメニュー項目でも動作しません。
VS2010では未確認なので全く同じかはわかりませんが、
VS2008の新しいMFCでは、エクスプローラのように、
ツールバーの内容やアクセラレータの割り当てなどを
ユーザがカスタマイズ可能な機能が組み込まれていて、
それらの設定がレジストリに保存されてしまいます。
http://msdn.microsoft.com/ja-jp/library/cc137827.aspx
なので、一度でもアプリを起動させてしまうと、
そのときの設定内容が次回起動時に復元されてしまい、
それ以降のリソースエディタ上で修正した内容がうまく反映されません
(もちろんレジストリをいったん削除すれば反映されます)。
とりあえず、アクセラレータに関しては、
InitInstance()の中に書かれているInitKeyboardManager()を消せば、
レジストリの内容を復元しないようになり、
リソースエディタで設定したものが使われるようになります。
どちらを取るかは検討されてみたほうがよいかと思います。
1.
InitKeyboardManager()を削除したら、Ctrl+C, Ctrl+V も、自分で追加したメニューの
Ctrl+Kも動作するようになりました。
2.
これで当面の問題点は解消できたのですが、色々勉強させて戴きました。
VS2008/2010で、ユーザーがカスタマイズ出来る機能が付いたことを知りませんでした。
ウィザードでメニュースタイルで作成したスケルトンには、「表示」→「ツールバーと
ドッキングウィンドウ」というメニューがあってカスタマイズ出来るようです。
リボンスタイルで作成したスケルトンには、このメニューはありません。
プログラム開発者の選択肢が増えたと理解したらいいのでしょうか。
3.
InitInstance()の中には、InitContextMenuManager()、InitTooltipManager()も書かれ
ていますが、これはどんな働きをするのか、勉強しなければなりません。
4.
蛇足ですが、自分の場合は、VS2005で作ったアプリを、かっこいいからという理由だけ
でリボンスタイルに変えようと思ったのです。
VS2005で作ったアプリは、音声読み上げソフトにうまく対応しているらしく、目の不自
由な人も使っているとのことで、ショートカットキーの継続性を尊重しようと考えてい
ます。
リボンスタイルが音声読み上げでどうなるのか、まだテストしていないのですが・・・
書き忘れました。
色々教えて戴いてありがとうございました。
チェックを忘れていました。(^_^;)