- - PR -
System.Windows.Forms.Form の CreateParams
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-16 00:52
System.Windows.Forms.MessageBox.Show() で表示される
ウインドウをを真似たフォームを作ろうと思い、 Spy++ にて、MessageBoxのスタイル及び拡張スタイルを調べ、 CreateParams に同様のスタイルをセットすることで対応しました。 結果、見た目上は良く似たウインドウになってくれたのですが、 出来上がったウインドウのスタイルを Spy++ で調べたところ、 結構違いのあるものになっていました。 とりあえず目的は達成されたので問題はないのですが、 どうにも気持ち悪い感じがして困っています。 どうしてこのようなことになるのか教えて頂ければと思います。 コードは以下の通りです。
環境は、Visual Studio .NET 2003, .NET Framework 1.1 SP1。 Spy++ のバージョンが 7.10.3077 です。 宜しくお願いいたします。 | ||||||||
|
投稿日時: 2006-07-16 01:11
まだ試していないので推測です。
WS_CAPTION 等の定数はどこかで定義してるのですよね? それらの値は間違っていませんか? _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2006-07-16 03:05
返信ありがとうございます。
すみません、現在帰宅しておりまして、コードが手元にないため、確認不可能な状態です。 コピーしたわけではない(ウインドウを並べて手打ち)ので 間違っている可能性は捨てきれないです・・・。 | ||||||||
|
投稿日時: 2006-07-18 12:13
お世話になっております。
先ほど、コードの確認を行いましたところ、1 つ定義に誤りがありました。 初歩的なミスですみません。 誤りを修正した結果、スタイルの値は MessageBox のものと一致しました。 ですが、もう一つ不明な点が出てきました。Spy++ の表示で、 値のリストが一致しないのです。 オリジナル --------------- WS_CAPTION WS_POPUP WS_VISIBLE WS_CLIPSIBLINGS WS_SYSMENU DS_ABSALIGN DS_3DLOOK DS_SETFONT DS_MODALFRAME DS_NOIDLEMSG 自作 --------------- WS_CAPTION WS_POPUP WS_VISIBLE WS_CLIPSIBLINGS WS_SYSMENU 000001C5 というようにオリジナルの DS の値が自作の方ではまとまった数値として出力されてしまいます。 この辺りはクラス名などで違いがでるのでしょうか。 | ||||||||
|
投稿日時: 2006-07-18 12:37
多分そうなのかな。spy++ が認識できるウィンドウクラスならスタイルの値を区別できるのでしょう。 .NET コントロールのウィンドウクラスを変える事ができればあるいは、というところでしょうが多分無理ですね。 そう考えたら、DS_〜の値は指定しても意味ないのかな。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2006-07-18 14:30
クラス名てか、ウィンドウとダイアログの違いなんじゃないでしょうか。 Windows Forms の Form は Show() しようが ShowDialog() しようが、おそらくは「ウィンドウ」なんです。で、本家の MessageBox は「ダイアログ」。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||
|
投稿日時: 2006-07-18 16:24
囚人さん、渋木宏明(ひどり)さん、返信ありがとうございます。
渋木宏明(ひどり)さん
Spy++ の結果を見てるとウインドウとダイアログの違いが、クラス名くらいしか 見つからなかったので、クラス名かなと思ってしまいましたが、やはりそうなのでしょうか。 となると「Spy++ はどうやってウインドウとダイアログを見分けているのか」という 新しい疑問が沸いてくるのですが、聞くばかりもなんですので、 囚人さん
を含め、また時間をとって調べてみたいと思います。 お二人とも、お付き合い頂きありがとうございました。 | ||||||||
|
投稿日時: 2006-07-18 19:36
ダイアログでも、普通のウィンドウでも、ボタンでも、ウィンドウはウィンドウなので、
ウィンドウクラスが #32770(ダイアログ)のときに、スタイル値「0x00000001」が立ってたらそれは、DS_ABSALIGN ウィンドウクラスが BUTTON のときに、スタイル値「0x00000001」が立っていたらそれは、BS_DEFPUSHBUTTON というふうに、既知のウィンドウクラスに対しては決め打つ事ができるので、Spy++ は多分そうしているのでしょう。 で、渋木さんも仰っていますが、Windows Forms のフォームをいくらダイアログに似せても、Windows Forms のフォームのウィンドウクラスは「WindowsForms10.Window.8.app.んがんが」であってダイアログではないので、「DS_んがんが」スタイルは自分で処理しない限り無駄でしょうね。 そして、Spy++は「WindowsForms10.Window.8.app.んがんが」をよく知らないので、「0x00000001」がスタイル値として立っていても、「定数名」として表せないわけですね。 「WS_んがんが」スタイルに関しては、全てのウィンドウ共通なので、やらんとしている方向性はあながち間違いではないとは思います。 _________________ 囚人のジレンマな日々 |