Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

TextBoxのWindowsHandle

.net.FrameWorkに移ってからWin.APIから遠ざかると、知識が消滅していきます。
Windows.Controlに描画するのはContext経由でリソース取得して描画して開放してなどややこしてことをしてたナァと思いでに耽る....てな話ではなく。
旧システム(VB6)からのリメークの案件があり、その仕様では、TextBoxをシングルラインで用いる時とマルチラインで用いる時を動的に切り分けてました。
TextBoxの性格はSingleLine/MultiLineのクラス属性はコントロール生成後は変更が出来ません。CreateObjectの時のLparam/Wparam のClass属性で決まるものです。(だったと思います。)
それ故に、VB6等では textbox1.Multiline.property はReadonlyで変更は不可になってます。
一方、.netは 変更が可能で、動的にMulitilineの切り替えが可能です。
非.netシステムでは画面上のコントロールの管理に、Windows.Handleを用いていました。
.netアプリでもhandleは使えるので、コントロールの識別にHandleを使えばいいやと安易に考えてましたら、落とし穴がありました。
 システムがおかしな動きをする。TextBoxの行モードを変える度に管理するコントロールが増えていく。?????
 行ModeはCreateObjectでしか設定できないので、FrameWorkは行モードの切り替えの都度TextBoxを再作成しているんですね。
考えればそうするしか手はなかったのは理解できますが、Handleでの管理は不可になったということですね。
 ハンドルもコンテキストもレガシーなのて使うなということかな?

投稿日時 : 2007年10月23日 0:12

Feedback

# re: TextBoxのWindowsHandle 2007/10/23 0:35 囚人

ハンドルの値ってコロコロ変わってたように思います。

レガシーだからという理由ではなく、インスタンスとハンドルが1対1と前提してはいけないんでしょうね。

# re: TextBoxのWindowsHandle 2007/10/23 8:56 じゃんぬねっと

.NET 側のハンドルとネイティブ ハンドルって違いますよね。
コントロールの管理なんてものは、数値でやるものではなくてインスタンスでやるものです。

# re: TextBoxのWindowsHandle 2007/10/23 9:34 シャノン

そのためのメソッドやプロパティもありますしね。
RecreateHandle とか HandleCreated とか。

# re: TextBoxのWindowsHandle 2007/10/23 10:21 Ognac

>インスタンスとハンドルが1対1と前提してはいけないんでしょうね
>管理なんてものは、数値でやるものではなくてインスタンスでやるものです

仰る通りです。VB6で稼動していた仕組みを手抜きして流用するとだめですね。持論に反する手抜きはいけないという教訓。

>RecreateHandle とか HandleCreated とか。
HandleCreatedは生成したか否かのFlagですがRecreateHandleの使いみちは....と
強制描画するときとか、パラメータの変更時などRecreateHandle メソッドが呼ばれるんですね。
ころころ変わるわけだ。
Frameork下でHandleプロパティは隠蔽していても支障がない気がしてきた。使い道ってあるのかな・

# re: TextBoxのWindowsHandle 2007/10/23 10:23 シャノン

相互運用性のためには必要なんでしょうが、引数に渡したウィンドウハンドルを内部で保持し続けるような関数は使えない場合があるってことですね。

タイトル
名前
Url
コメント