- PR -

UserControl上のコントロールで発生するWindowsメッセージを処理するには

1
投稿者投稿内容
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-07-01 23:40
お世話になります。

VB2005でWindowsアプリを作成しております。

コンボボックスとテキストボックスを含んだユーザーコントロールがあります。
このユーザーコントロールのコンボボックスに対するWindowsメッセージを
捕捉することはできますでしょうか?

何をしたいかといいますと・・・

都道府県名を選択するコンボボックスで「東京」と入力すると「京都」が選択
されます。デバッグしてみると「東」で「東京」が選択され
「京」で「京都」が選択されていることがわかりました。

そこでコンボボックスのWndProcメソッドで
WM_IME_STARTCOMPOSITION、WM_IME_ENDCOMPOSITION、WM_IME_CHAR
を補足してIME入力確定時にコンボボックスのTextと比較して
SelectedIndexを変更するようにしています。

これと同じことをユーザーコントロール内のコンボボックスに
たいしても行いたいのですが、うまくいきません。

ユーザーコントロールのWndProcでは
WM_IME_STARTCOMPOSITION、WM_IME_ENDCOMPOSITION、WM_IME_CHAR
のいずれも発生していなようです。

また、WM_IME_XXXXを補足できたとしてもそれが
ユーザーコントロールにたいするものなのか、
ユーザーコントロールのコンボボックスに対するものなのか
ユーザーコントロールのテキストボックスに対するものなのか
を区別することができるのでしょうか?

ユーザーコントロールのテキストボックスに対するIME確定は
そのまま処理したいです。

よろしくお願いいたします。
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-07-01 23:59
引用:

コンボボックスとテキストボックスを含んだユーザーコントロールがあります。
このユーザーコントロールのコンボボックスに対するWindowsメッセージを
捕捉することはできますでしょうか?



下記の文章を読む限り、コンボボックスの派生クラスを既に作成されているのですよね?

引用:

そこでコンボボックスのWndProcメソッドで
WM_IME_STARTCOMPOSITION、WM_IME_ENDCOMPOSITION、WM_IME_CHAR
を補足してIME入力確定時にコンボボックスのTextと比較して
SelectedIndexを変更するようにしています。



であれば、ユーザコントロールにも同じコンボボックスの派生クラスを使えば(配置すれば)良いのでは?

引用:

また、WM_IME_XXXXを補足できたとしてもそれが
ユーザーコントロールにたいするものなのか、
ユーザーコントロールのコンボボックスに対するものなのか
ユーザーコントロールのテキストボックスに対するものなのか
を区別することができるのでしょうか?


大抵のメッセージは対象となるウィンドウが区別可能と考えられます。
また、ユーザコントロールはある意味、フォームとみなして良いです。
ですので、ユーザコントロール(フォーム)が受けるべきメッセージはユーザコントロール(フォーム)のWndProcに、コンボボックスが受けるべきメッセージはコンボボックスのWndProcに、テキストボックスが受けるべきメッセージはテキストボックスのWndProcに行きます。


解決案
1.ユーザコントロールに配置されているコンボボックスを、WndProcメソッドをオーバーライドしたコンボボックスの派生クラスに置き換える。
2.置き換えられない事情があるならNativeWindowクラスでWndProcを横取りする。

こんなところでどうでしょうか?(分かりにくいかも?)
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-07-02 08:11
回答ありがとうございます。

引用:

1.ユーザコントロールに配置されているコンボボックスを、WndProcメソッドをオーバーライドしたコンボボックスの派生クラスに置き換える。



この方法がありました。
コンボボックスを継承したカスタムコントロールがあるので
これを利用してユーザーコントロールで使用してみます。
・・・よく考えると、なぜユーザーコントロールでカスタムコンボボックスを
使っていないのか、と

早速試してみます。

1

スキルアップ/キャリアアップ(JOB@IT)