- - PR -
コンボボックスの右クリックの貼り付けイベント取得について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-02-10 16:49
vb.net2003のことでお聞きしたいのですが、
コンボボックスに貼り付ける場合、クリップボードの内容が数値である場合は、貼り付けを行い。数値以外の文字列であれば貼り付けを禁止するプログラムを実現したいと思い、コンボボックスを継承したコントロールで上記の内容を実現したいと考えております。 そこで Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) If m.Msg = &H302 Then ・・・ End If MyBase.WndProc(m) End Sub とコーディングしたのですが、貼り付けした場合のイベントが取得できません。 初心者で申し訳ないのですが教えてください。 | ||||
|
投稿日時: 2006-02-10 16:59
WM_PASTE は ComboBox では捕えることができません。 実際には ComboBox 内の EditBox で起きているんじゃないかな。(確か) TextChanged イベントなどでやった方が現実的かもしれません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-02-10 17:45
まぁTextChangedでやるのが現実的でしょうね。それだけだと何なので恐らくできるだろうやり方を書いときます。確認していないので実際にできるかどうかはSpy++あたりで監視するなりして自力で確認してみてください。
GetComboBoxInfoを使用するとCOMBOBOXINFO 構造体からhWndItemフィールドでエディットボックスのハンドルを取得できます。これを使用して、エディットボックスをサブクラス化すればいいわけです。 ちなみにサブクラス化ですが、WinFormsではサブクラス化用にNativeWindowクラスというものがありますのでこれを使用するとよいです。 以上が概要で、具体的にどうするかですが、 1.サブクラス化用に、ネイティブウィンドウから継承し、WndProcをオーバーライドして自分が望むコード(この場合はWM_PASTEの場合に特殊な処理を行うこと)を実装する。 2.ComboBox.HandleCreatedイベントのハンドラを定義する。 3.HandleCreatedのイベントハンドラにおいて、ComboBoxのハンドルからエディットボックスのハンドラを取得し、先ほど作成したNativeWindow継承クラスをAsignする。 ※これは実は「ComboBoxのハンドルが作成された後エディットボックスのハンドルは変更されない」という前提で説明しています。これには保証がないため実際はこの辺の動作を調べたり、エディットボックスのWndProcでWM_DESTROYやらに対して追加コードが必要になるかもしれません。 # ちなみにDropDownのほうは色々いじったことがあるのです | ||||
|
投稿日時: 2006-02-11 01:58
適当な雛形。
一応ながら、WM_PASTE は拾えるハズ... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-02-11 10:35
早速のご教授ありがとうございます。
色々と探したのですがなかなか方法が見つからず困っておりました。 早速、試して見たいと思います。 |
1