- PR -

System.Windows.Forms.Form の CreateParams

投稿者投稿内容
YasuHiro1018
会議室デビュー日: 2006/07/16
投稿数: 18
投稿日時: 2006-07-16 00:52
System.Windows.Forms.MessageBox.Show() で表示される
ウインドウをを真似たフォームを作ろうと思い、
Spy++ にて、MessageBoxのスタイル及び拡張スタイルを調べ、
CreateParams に同様のスタイルをセットすることで対応しました。
結果、見た目上は良く似たウインドウになってくれたのですが、
出来上がったウインドウのスタイルを Spy++ で調べたところ、
結構違いのあるものになっていました。
とりあえず目的は達成されたので問題はないのですが、
どうにも気持ち悪い感じがして困っています。
どうしてこのようなことになるのか教えて頂ければと思います。

コードは以下の通りです。
コード:
protected override CreateParams CreateParams {
	get {
    CreateParams cp = base.CreateParams;
    cp.Style = WS_CAPTION | unchecked((int)WS_POPUP) | WS_VISIBLE |
               WS_CLIPSIBLINGS | WS_SYSMENU | DS_ABSALIGN | DS_3DLOOK |
               DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG;
    cp.ExStyle = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR |
                 WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT;
    return cp;
  }
}


環境は、Visual Studio .NET 2003, .NET Framework 1.1 SP1。
Spy++ のバージョンが 7.10.3077 です。

宜しくお願いいたします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-07-16 01:11
まだ試していないので推測です。
WS_CAPTION 等の定数はどこかで定義してるのですよね?
それらの値は間違っていませんか?
_________________
囚人のジレンマな日々
YasuHiro1018
会議室デビュー日: 2006/07/16
投稿数: 18
投稿日時: 2006-07-16 03:05
返信ありがとうございます。
すみません、現在帰宅しておりまして、コードが手元にないため、確認不可能な状態です。
コピーしたわけではない(ウインドウを並べて手打ち)ので
間違っている可能性は捨てきれないです・・・。
YasuHiro1018
会議室デビュー日: 2006/07/16
投稿数: 18
投稿日時: 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 の値が自作の方ではまとまった数値として出力されてしまいます。
この辺りはクラス名などで違いがでるのでしょうか。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-07-18 12:37
引用:

この辺りはクラス名などで違いがでるのでしょうか。


多分そうなのかな。spy++ が認識できるウィンドウクラスならスタイルの値を区別できるのでしょう。
.NET コントロールのウィンドウクラスを変える事ができればあるいは、というところでしょうが多分無理ですね。
そう考えたら、DS_〜の値は指定しても意味ないのかな。
_________________
囚人のジレンマな日々
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-07-18 14:30
引用:

というようにオリジナルの DS の値が自作の方ではまとまった数値として出力されてしまいます。
この辺りはクラス名などで違いがでるのでしょうか。



クラス名てか、ウィンドウとダイアログの違いなんじゃないでしょうか。

Windows Forms の Form は Show() しようが ShowDialog() しようが、おそらくは「ウィンドウ」なんです。で、本家の MessageBox は「ダイアログ」。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
YasuHiro1018
会議室デビュー日: 2006/07/16
投稿数: 18
投稿日時: 2006-07-18 16:24
囚人さん、渋木宏明(ひどり)さん、返信ありがとうございます。

渋木宏明(ひどり)さん
引用:
クラス名てか、ウィンドウとダイアログの違いなんじゃないでしょうか。

Windows Forms の Form は Show() しようが ShowDialog() しようが、おそらくは「ウィンドウ」なんです。で、本家の MessageBox は「ダイアログ」。


Spy++ の結果を見てるとウインドウとダイアログの違いが、クラス名くらいしか
見つからなかったので、クラス名かなと思ってしまいましたが、やはりそうなのでしょうか。
となると「Spy++ はどうやってウインドウとダイアログを見分けているのか」という
新しい疑問が沸いてくるのですが、聞くばかりもなんですので、

囚人さん
引用:
そう考えたら、DS_〜の値は指定しても意味ないのかな。


を含め、また時間をとって調べてみたいと思います。

お二人とも、お付き合い頂きありがとうございました。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 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_んがんが」スタイルに関しては、全てのウィンドウ共通なので、やらんとしている方向性はあながち間違いではないとは思います。
_________________
囚人のジレンマな日々

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