- - PR -
【C#】イベントの発生順序(FormLoad→)
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-20 19:31
お世話になります。
ここを参考に 特集:Windowsフォームにスパイスを――MessengerやOutlookに見る不定形フォームテク (3/4) http://www.itmedia.co.jp/enterprise/articles/0411/09/news028_3.html よくMSメッセンジャーなどで見かけるポップアップ表示のフォームを作成しています。 @Formの初期表示位置を取得 AFormの最終表示位置を取得 BFormを画面に表示する(@の位置) C以下のようなコードで少しずつ表示していく。 desktopSize = SystemInformation.WorkingArea.Size; while (this.Top >= desktopSize.Height - this.Size.Height) { this.Top -= 10; } と、 サンプルコードなどが掲載されているのですが、 情けない事にどのイベントに記述すれば良いのかわかりません。 FormのLoadイベントに記述しますと、Formが画面に描画される前の出来事なので意味がありません。 FormのActivatedイベントに記述しますと、Loadイベントより先行し、更にLoadイベントの後も度々発生してしまいます。 何と言いますか、「Loaded」つまり、表示が完了した瞬間に発生するようなイベントは無いでしょうか? お忙しい中恐れ入りますが、よろしくお願いいたします。 | ||||||||
|
投稿日時: 2006-01-20 19:43
何なんでしょうね。VisibleChanged なんかな?
表示の仕方は親が決める、ということなんでしょうか。 ところで、Win32API に AnimateWindow() という便利なものがあります。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2006-01-20 21:09
ご呈示のサイトを見る限り、タイマーを使用しているようですね。
イベントの順序については何とも言えませんが、 少なくともタイマーや別スレッドを使用しない限り、フォームが描画されるタイミングがないため期待通りのアニメーションはできないと思います。 | ||||||||
|
投稿日時: 2006-01-21 10:46
これは、TopMost にしているからですよね? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-21 21:20
1度だけApplication_Idleイベントを使うとか。 | ||||||||
|
投稿日時: 2006-01-22 01:20
なるほど... これは思いつきませんでした。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-22 03:02
南部です。 表示してしまえばよいのでは?
ただ、移動速度が環境依存してしまうのでやはりTimerを使うべきだと思います。 また、この手のウィンドウがフォーカスを、、うだうだ、、 | ||||||||
|
投稿日時: 2006-01-23 12:54
皆さんご回答、ありがとうございます。
また、質問投稿後にやむを得ず外出しまして、 こちらの返信が遅くなってしまった事をお詫びいたします。 >囚人さん、 AnimateWindow() http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_animatewindow.asp ↑に使用できるアニメーションの一覧がありますが、 AW_HOR_POSITIVE(左から右へ) AW_VER_POSITIVE(下から上へ) どのような動きをするのかこれから取り組んでみます。 http://lamoo.s53.xrea.com/diary/diary2004a.html ↑のサイトに >AnimateWindow() を自前のアニメーションに差し替えたので、 >フェードイン中にもキー入力ができるようになった。 >キーの先行入力って、けっこう操作感にからんでくるのよね。 という記述を見つけまして、AnimateWindow()では フェードイン中のキー入力は不可なのだろうと思いました。 自前で開発した方が後々良いとは思いますが、 まずは、私の希望通りの動きをAnimateWindow()がしてくれるか 確認してまいります。 アドバイスありがとうございました。 >PoohKidさん、 >フォームが描画されるタイミングがないため やはり、そういう事なのでしょうか。 この辺に、気づかせて下さった事に感謝いたします。 これでやっと新たな手法を考える事ができるようになりました。 ありがとうございました。 >よねKENさん、 >1度だけApplication_Idleイベントを使うとか。 これは今の私には全く考えつかない手法でした。 今後、今回の「Loaded」。。のような(そのようなイベントは無いですが) 事をしたいと思った時に、真っ先に候補に挙げさせていただきます。 今回は、まずAPIでやってみた後、 この手法を試させていただきたいと思います。 アドバイスありがとうございました。 >じゃんぬねっとさん、 >これは、TopMost にしているからですよね? おっしゃる通りです。 いつも見抜かれてしまい、お恥ずかしいです。 ただ、今回は常に前面に表示したいフォームを作成したいと考えております。 TOPMOSTをfalseに設定後、実行時のイベントの順序は、 ご指摘の通りとなりました。 開発経験の浅い私にとって、このようなご指摘は 普段の生活では気づきにくい事だと思います。 ですから、本当にありがたく思います。 また、Application_Idleのサンプルコード、 大変勉強になりました。 >nanbuさん(南部さん)、 >表示してしまえばよいのでは? これは、、私がこの質問を投稿させていただいた際に、 最もやりたかった事です。 このようなイメージで「どうにかならないか」と模索しておりました。 ロードイベント中の 「this.Visible = true;」。。 これって逆を言えば、 ロードイベント中は通常、this.Visible = false;なんですね。 まさかロードイベント中にVisibleを変更できるとは思いませんでした。 「ロード」が終わって始めて「Form」として認められると信じていました。。 ありがとうございます。 また、↓のご指摘の通り、 >ただ、移動速度が環境依存してしまうのでやはりTimerを使うべきだと思います。 少し動きが希望とは異なるものでした。 皆さんのアドバイスから、 勉強を含めて全部試してみます。 今回も私のつたない文章を皆さんが広げてくださり、 質問内容以上のご回答を得られたと、とても感謝しております。 ありがとうございました。 また、今後とも宜しくお願いいたします。 |
1