- PR -

【C#】イベントの発生順序(FormLoad→)

1
投稿者投稿内容
タオル
常連さん
会議室デビュー日: 2005/04/27
投稿数: 43
投稿日時: 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」つまり、表示が完了した瞬間に発生するようなイベントは無いでしょうか?

お忙しい中恐れ入りますが、よろしくお願いいたします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-20 19:43
何なんでしょうね。VisibleChanged なんかな?
表示の仕方は親が決める、ということなんでしょうか。

ところで、Win32API に
AnimateWindow()
という便利なものがあります。


_________________
囚人のジレンマな日々
PoohKid
常連さん
会議室デビュー日: 2004/12/07
投稿数: 26
お住まい・勤務地: はてな市民
投稿日時: 2006-01-20 21:09
ご呈示のサイトを見る限り、タイマーを使用しているようですね。
イベントの順序については何とも言えませんが、
少なくともタイマーや別スレッドを使用しない限り、フォームが描画されるタイミングがないため期待通りのアニメーションはできないと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-21 10:46
引用:

タオルさんの書き込み (2006-01-20 19:31) より:

FormのActivatedイベントに記述しますと、Loadイベントより先行し、


これは、TopMost にしているからですよね?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2006-01-21 21:20
引用:

何と言いますか、「Loaded」つまり、表示が完了した瞬間に発生するようなイベントは無いでしょうか?



1度だけApplication_Idleイベントを使うとか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-22 01:20
引用:

よねKENさんの書き込み (2006-01-21 21:20) より:

1度だけApplication_Idleイベントを使うとか。


なるほど... これは思いつきませんでした。

コード:

    public class Form1 : System.Windows.Forms.Form {

        public Form1() {
            this.InitializeComponent();
            Application.Idle += new EventHandler(Application_Idle);
        }

        private void Application_Idle(object sender, EventArgs e) {
            Application.Idle -= new EventHandler(Application_Idle);
            MessageBox.Show("素晴らしい!");
        }

    }


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-01-22 03:02
引用:

タオルさんの書き込み (2006-01-20 19:31) より:

FormのLoadイベントに記述しますと、Formが画面に描画される前の出来事なので意味がありません。



南部です。

表示してしまえばよいのでは?

コード:
private void Form1_Load(object sender, EventArgs e)
{
  Size desktopSize = SystemInformation.WorkingArea.Size;
  this.Location = 
    new Point(desktopSize.Width - this.Width, desktopSize.Height);
  
  this.Visible = true;

  int upMax = desktopSize.Height - this.Height;
  while(this.Top > upMax)
  {
    this.Top -= Math.Min(10, this.Top - upMax);
  }
}



ただ、移動速度が環境依存してしまうのでやはりTimerを使うべきだと思います。
また、この手のウィンドウがフォーカスを、、うだうだ、、
タオル
常連さん
会議室デビュー日: 2005/04/27
投稿数: 43
投稿日時: 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

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