- PR -

定位置に配置するウィンドウ

1
投稿者投稿内容
YAMANEKO
会議室デビュー日: 2008/06/06
投稿数: 19
投稿日時: 2008-06-06 15:43
Form.Loadイベントの中で、デスクトップのサイズを取得し、
ウィンドウの座標を計算して、定位置に移動しようとしているのですが・・・
どうしても、一瞬、デフォルトの位置に表示されてしまいます。

そこで、
ウィンドウを最初不可視にしておいて、
移動してから(Locationを設定してから)可視化しようと思ったのですが
最初に不可視にする方法がわかりません。

Loadイベントの中で
this.Visible = false;
等とやっても、消えてくれないですし
CreateParamsをオーバーライドして、
ウィンドウスタイルからWS_VISIBLEを消してみたりしてもダメでした。

どうやったら消すことが出来る
あるいは、
いきなり計算した定位置に出すことが出来るでしょうか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2008-06-06 16:10
コンストラクタの中(InitializeComponent を呼び出した後)辺りに記述すればいいんじゃないですか。
// 念のためのキーワード:StartPosition
YAMANEKO
会議室デビュー日: 2008/06/06
投稿数: 19
投稿日時: 2008-06-06 16:24
引用:

Hongliangさんの書き込み (2008-06-06 16:10) より:
コンストラクタの中(InitializeComponent を呼び出した後)辺りに記述すればいいんじゃないですか。
// 念のためのキーワード:StartPosition



なるほど、

早速、コンストラクタ内で、
this.StartPosition = FormStartPosition.Manual;
を設定し、ウィンドウの座標を設定をしてみましたが、なにか変です。

キャプションバーの無いウィンドウを作ろうとしているのですが、
FormStartPosition.Manual を設定すると、
キャプションバーも含めた大きさの、キャプションバーのないウィンドウになってしまいます。

オーバーライドしたCreateParamsの中で、WS_CAPTIONを消してみると、
なんとなくうまくいくのですが・・・なぜか、
コンストラクタの中で取得できるForm.Sizeが、
Loadイベントやそれ以降に取得できるForm.Sizeより4ピクセルほど小さくなってしまいます。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-06 16:56
引用:

YAMANEKOさんの書き込み (2008-06-06 15:43) より:
Form.Loadイベントの中で、デスクトップのサイズを取得し、
ウィンドウの座標を計算して、定位置に移動しようとしているのですが・・・
どうしても、一瞬、デフォルトの位置に表示されてしまいます。


Form.Loadイベントはフォームが初めて表示される直前に発生するイベントなので、
「一瞬デフォルトの位置に表示される」ことはありえないような気がします。

コード:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Location = New Point(0, 0)
        System.Threading.Thread.Sleep(500)
        Me.Location = New Point(100, 100)
        System.Threading.Thread.Sleep(500)
        Me.Location = New Point(200, 200)
    End Sub


試しにこんなコードを実行してみましたが、フォームが移動するようには見えませんでした。
YAMANEKO
会議室デビュー日: 2008/06/06
投稿数: 19
投稿日時: 2008-06-06 17:06
引用:

Form.Loadイベントはフォームが初めて表示される直前に発生するイベントなので、
「一瞬デフォルトの位置に表示される」ことはありえないような気がします。



私もそう思っていたのですが・・・

おかしいと思いつついろいろ削っていると、
Loadイベントの中で
this.FormBorderStyle = FormBorderStyle.None;
これをやっているのが原因のようでした。
(ボーダーを設定したことによって表示されてしまったのでしょうか)

Loadイベントの中で設定せず、デザイナで設定するとうまくいきました。
ありがとうございました。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-06 17:22
引用:

YAMANEKOさんの書き込み (2008-06-06 17:06) より:

おかしいと思いつついろいろ削っていると、
Loadイベントの中で
this.FormBorderStyle = FormBorderStyle.None;
これをやっているのが原因のようでした。
(ボーダーを設定したことによって表示されてしまったのでしょうか)



確認してみました。
コード:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Location = New Point(0, 0)
        Me.FormBorderStyle = FormBorderStyle.None   ' ←☆
        System.Threading.Thread.Sleep(1000)
        Me.Location = New Point(300, 300)

    End Sub


ほんとだ。なぜか☆の時点で表示されちゃってるぽいですね…不思議。
1

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