トップ回答者
RichEdit50Wで縦書き入力を行ったとき、矢印カーソルの移動が90度回転しているので見た目通りの移動に変更したい。

質問
-
VS2010 MFCで開発をしています。
CRichEditCtrl(RichEdit50W)で縦書き入力を行っているのですが、矢印キーの動作が90度ずれている(上矢印で右移動、右矢印で下移動する)
のを見た目に違和感ない動きに合わせようとしています。添付はCRichEditCtrlのサブクラスにPreTranslateMessageを定義して、キーをすり替えようとしたのですが、
右矢印キーを押すと、VK_RIGHTが来るのでVK_UPに変換するまではいいのですが、その後またVK_UPが来るためVK_LEFTに変換されて結果、下移動します。
左矢印を同じですが、 上下矢印を押したときはそのキーだけの動作になるので意図通り動きます。
なぜ、左右キーを上下キーに変換した時だけ、また このサブクラスのPreTranslateMessageに来るのかも判っていません。
良い方法がありましたらご教授ください。 (本問題を回避できるならキーすり替え以外でも結構です)よろしくお願いいたします。
BOOL CVerticalEditCtrl::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYDOWN ) { if(pMsg->wParam == VK_LEFT) { pMsg->wParam = VK_DOWN; TRACE(_T("VK_LEFT => VK_DOWN\n")); } if(pMsg->wParam == VK_RIGHT) { pMsg->wParam = VK_UP; TRACE(_T("VK_RIGHT => VK_UP\n")); } if(pMsg->wParam == VK_DOWN) { pMsg->wParam = VK_RIGHT; TRACE(_T("VK_DOWN => VK_RIGHT\n")); } if(pMsg->wParam == VK_UP) { pMsg->wParam = VK_LEFT; TRACE(_T("VK_UP => VK_LEFT\n")); } } return CRichEditCtrl::PreTranslateMessage(pMsg); }
回答
-
2 番目の if から if の前に else を付けてみてはどうでしょうか?
あと、少なくとも Windows 10 においては、キーイベントを書き換えなくても、矢印のキーが見た目上のカーソル移動と一致していました。Msftedit.DLL のバージョンをみてキーイベントを書き換えるかどうか判定する必要があるかもしれません。
- 編集済み kenjinoteMVP 2017年11月9日 12:40
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月10日 2:48
- 回答としてマーク Freeプログラマー 2017年11月12日 10:19
すべての返信
-
2 番目の if から if の前に else を付けてみてはどうでしょうか?
あと、少なくとも Windows 10 においては、キーイベントを書き換えなくても、矢印のキーが見た目上のカーソル移動と一致していました。Msftedit.DLL のバージョンをみてキーイベントを書き換えるかどうか判定する必要があるかもしれません。
- 編集済み kenjinoteMVP 2017年11月9日 12:40
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月10日 2:48
- 回答としてマーク Freeプログラマー 2017年11月12日 10:19
-