- - PR -
AcceptsTab, AcceptsReturn の実現
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-03-21 14:36
初めての書き込みです。よろしくお願いします。
Borland C#Builder で遊んでいるのですが、 この度キーワードの色分け機能つきのテキストエディタを作成しました。 作ったときはフォームを直に描画していたので気づかなかったのですが、 エディタ部分をユーザーコントロールに移植した時に、 タブキーや矢印キーの入力が親フォームに取られてしまうようになりました。 いろいろ試してみたのですが、スマートに問題を解決できないので ヒントをいただければ幸いです。 解決法1. 親フォームのProcessDialogKey関数などをオーバーライドする →問題 エディタにKeyPressイベントが来るようになったのですが、 これではコントロールを貼り付けるたびに親フォームをいじらねばなりません。 できればTextBoxの「AcceptsTab」プロパティのように、 親フォームに迷惑をかけずにキーイベントを拾いたい... 解決法2. キーボードイベントのフック(SetWindowsHookExだったかな?) →問題 ...しんどいです(TT チャレンジしてみたのですが、標準のキー操作が(フォーカス移動など) 失われてしまいます。たとえば、タブキーをフックすると、 IMEの変換中にタブを押しても、エディタにタブ文字が挿入されたしまったり... 「IMEで変換中か?」などを調べている間にコードがぐちゃぐちゃになっちゃいました なんだか根本的に間違ってる気がします。 別に解決策1でもいいんですけど、できれば単一のコントロールとして 完結したものにしてみたいのでよろしくお願いします。 | ||||
|
投稿日時: 2004-03-21 15:41
こんにちは。 自分はこれでやっちゃってます^^。 言われた二つの方法以外にも確かに方法はありそうですね、、、、 意味のない返答ですんません。 _________________ | ||||
|
投稿日時: 2004-03-21 23:14
> 解決法1.
> 親フォームのProcessDialogKey関数などをオーバーライドする いや、よく読んでみたら これがおかしいですね。 私は、コントロール自身のProcessDialogKeyをオーバーライドしてます。 これなら、何の問題もないです。 最初読んだとき「親フォームの」のところが見えてませんでしたので 上のような返答になってしまいました。 _________________ | ||||
|
投稿日時: 2004-03-22 03:30
Control.IsInputKey,Control.IsInputChar あたりをオーバーライドされてはどうでしょうか。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9169&forum=7 [ メッセージ編集済み 編集者: ya 編集日時 2004-03-22 03:32 ] | ||||
|
投稿日時: 2004-03-22 04:03
CHNさん、yaさん、どうもありがとうございます
なんだか「ProcessDialogKeyは親フォームでオーバーライドしなきゃいけない」と 勝手に思い込んでいたのが敗因のようです(TT IsInputCharなんのもあるんですね。 フォーカス関連はまだ理解不足なので、いろいろ試して結果をご報告したく思います。 ちょっと見ただけですけど、「TabでTab文字入力、Ctrl+Tabでフォーカス移動」などの 動作も再現したいので、IsInputKeyは少し非力かもしれません。 「検索文字列(&F)」と書いたLabelの隣にComboBoxを置いて Alt+Fでコンボボックスにフォーカスを移動させる動作に使えるかな? (Delphiではラベルのプロパティをいじるだけでできたので、考えたこともなかった… 気づかないうちにいろいろ助けてもらってたんですね。C#に転んでごめん>Delphi) |
1