- - PR -
ファンクションキーコントロールについて
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-28 16:37
VB2005でGrapeCityのInputManに含まれているファンクションキーコントロールのようなものを自作したいと思っています。
@IT内のユーザビリティを高めるファンクション・バーの実装が参考になるかと思ったのですが、ファンクションキーの検出をメニューバーのショートカットキーに頼る作りだったようなので私が求めているものとはちょっと違うようでした。そこで…
上記のようにしてみたところフォームに直接配置されている場合はうまく検出できるものの、Panel等のコンテナ上に配置された場合にはParentChangedのタイミングではFindFormがNothingなためうまくいきません。 GrapeCityのファンクションキーコントロールだとコンテナ上に配置してもコントロール独自のFunctionKeyPressイベントが発生してくれるのですがこれはどのような作りで検出・実現しているのでしょうか? | ||||||||||||
|
投稿日時: 2006-05-28 16:56
CreateHandle と両方で実装する必要があると思います。 ParentChange は親が変更された時のためのもので、通常の場合は CreateHandle で行うものだと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-05-28 17:54
InputMan は有名ですよね。どういうものかは使ったことがないのでわかりませんが。 ファンクションキーコントロールは、僕も自作して多用しています。 ボタンコントロールを12ヶ並べて、キー入力とマウスクリックに対応させてます。
InputMan は使ったことがないですし、中で何をしているのかは分かりませんが、僕がやっているやり方が参考になれば・・・キーを受け取っている部分のクラスです。 以前は VB で書いたのですが、その後 C# に移行して諸々デバッグしたので、C# しか残っていません。
これだと何でもかんでも反応しちゃうので、実行中のデバッグでファンクションキーが押せなくなるのですがw | ||||||||||||
|
投稿日時: 2006-05-28 18:19
その後、自動生成されるフォームのInitializeComponent内を覗いてみたら、まず親コンテナのインスタンスでControls.Addされており、それからそのコンテナがフォームにControls.AddされていたのでParentChangedのタイミングではFindFormがNothingになるのも当然だと思い、InitializeComponentはエディタで変更するな、とありましたが試しにフォームに親コンテナがControls.Addされた後で今回作ったコントロールが親コンテナにControls.Addされるように入れ替えてみたところ、ParentChanged内のFindFormでも見つかったのでこんなやり方でいいものか悩んでおりました。 教えていただいた通り、ParentChangedではなくCreateHandleの方をオーバーライドしてその中でMe._ParentForm = Me.FindForm()としたらコンテナ上に配置しても検出できるようになりました。 一応の確認ですが、Controls.Addされた段階ではまだフォームや親コンテナとのインスタンス上で関連付け(?)がなされただけであり、実際にフォーム上で実体化する(APIで言うところのCreateWindowされる?)タイミングがCreateHandleである、という理解でだいたいよろしいでしょうか? とりあえずこれでフォームのデザイナで配置するだけで簡単にファンクションキーを検出・処理実装を書けるコントロールができそうです。 ありがとうございました。 | ||||||||||||
|
投稿日時: 2006-05-28 20:16
これは、Controls に Add される前に CreateControl メソッドで、 強制的にコントロールを作成してみると、イメージが掴みやすいと思います。 簡単に言えば、中途半端な状態ということです。 それと、すみません。(*_ _) CreateHandle メソッドをオーバーライドするのではなく、 OnHandleCreated メソッドをオーバーライドすべきです。。。 念のためですが、いずれにしても「基底メソッド」の呼び出しを真っ先に行うようにしてください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-05-28 21:35
補足ありがとうございます。CreateHandleされる処理をオーバーライドするよりもOnHandleCreatedで親フォームを探すのが妥当なタイミングですね。早速修正いたしました。 それと投稿時間差により、R・田中一郎さんのご回答をすっかり見落としておりました。すみません。 InputManはVB6で開発していた頃に使っていたのですが、なにしろ高価なものなのでよほどInputManでなくては無理ということがなければVB2005からはなるべく自作コントロールでなんとかしようと目論んでおりました(笑) VC++開発経験もあるので提示していただいたC#ソースもなんとか読めましたが、じゃんぬねっとさんに教えていただいた通りOnHandleCreatedをオーバーライドして親フォームを拾うことができ、簡単に実現できましたのでこの方向で機能追加していこうと思います。 ご回答ありがとうございました。 | ||||||||||||
|
投稿日時: 2006-05-29 09:10
解決しようとしている方向性が違うので、アップするの迷ったんですが(^▽^;)マリンさんや他の方に何かのヒントになればと思ってアップしました。 (逆に、今回のやり方は僕も参考になりました) |
1