CEditView 雑記 |
Last Updated: Dec.17,2006 |
使用しているコンパイラは、Microsoft Visual C++ 6.0 です。これ以外のバージョンでは記述と食い違うことがあるかも知れません。 |
当ホームページの掲示板においての不具合報告がきっかけなのですが、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. |