CEditView 雑記

Last Updated: Dec.17,2006
使用しているコンパイラは、Microsoft Visual C++ 6.0 です。これ以外のバージョンでは記述と食い違うことがあるかも知れません。

7. Ctrl や Shift 押下時のキー入力について

当ホームページの掲示板においての不具合報告がきっかけなのですが、CEditView において、Ctrl や Shift が押されている場合のキー入力の動作に癖があることが判りました。以下はそれについて調査した結果を表にしたものです。Ctrl+Enter や Ctrl+BackSpace では非常に面白い(?)ことになっています。

動作の違い

Ctrl+BackSpace では、何故 0x7F を挿入する仕様なのでしょうか。ご存知の方がいらっしゃいましたら、是非、お教え下さい。

仮想キー 単独 Ctrl Shift Ctrl+Shift
VK_TAB タブ置換挿入 (SDI)タブ置換挿入 タブ置換挿入 (SDI)-
(MDI)- (*1) (MDI)- (*1)
VK_RETURN 改行置換挿入 改行置換挿入 改行置換挿入 -
VK_BACK (非選択時)直前削除 0x7F 置換挿入 (非選択時)直前削除 -
(選択時)クリア (選択時)クリア
VK_DELETE (非選択時)直後削除 (非選択時)行末まで削除 (非選択時)- (*2) -
(選択時)クリア (選択時)クリア (選択時)切り取り (*2)

nChar の値

OnKeyDown と OnChar の引数 nChar の値を調べてみました。

仮想キー ハンドラ 単独 Ctrl Shift Ctrl+Shift
VK_TAB OnKeyDown VK_TAB (SDI) VK_TAB VK_TAB (SDI) VK_TAB
(MDI) - (*1) (MDI) - (*1)
OnChar VK_TAB - VK_TAB -
VK_RETURN OnKeyDown VK_RETURN VK_RETURN VK_RETURN VK_RETURN
OnChar VK_RETURN 0x0A (10) VK_RETURN -
VK_BACK OnKeyDown VK_BACK VK_BACK VK_BACK VK_BACK
OnChar VK_BACK 0x7F (127) VK_BACK -
VK_DELETE OnKeyDown VK_DELETE VK_DELETE - (*2) VK_DELETE
OnChar - - - -

まとめ

これらの結果を踏まえますと、キー入力に応じた処理を記述する場合は、Tab/Enter/BackSpace は、OnChar で、Delete は OnKeyDown で処理するのがよいと分ります。ただし、Ctrl+Tab と Ctrl+Delete については、OnKeyDown 内で Ctrl キーの押下状態を確実に取得(*3)するのが困難なようなので、アプリケーションでアクセラレータキーとして実装するのが簡単だとおもいます。以前に記述した「4. マルチレベルの Undo/Redo の実装」でも、これらのことを加味しなくてはならないですね。

(*1) MDI での Ctrl+Tab と Ctrl+Shift+Tab は子ウィンドウ間の切り替えに使われています。
(*2) Shift+Delete は、アクセラレータキーとして「切り取り」に標準で割り当てられています。
(*3) GetKeyState や GetAsyncKeyState 等のキー押下状態取得関数を使っても確実ではないようです。


Back Copyright (c) 2006 AOK. All Rights Reserved.