.netのMain form、即ちApplication.Runに渡すアプリケーションのメインウィンドウとなるFormオブジェクトだが、これを起動時に非表示にする真っ当な方法が無い。
WinAPI時代はPreCreateWindow等の気の利いたタイミングでWS_VISIBLEをオフする手があったが、どうも.netにはこのような手段が無い…、ようだ。
ググってみても、Application.Runに渡さずShowDialogしろとか、ActivatedハンドラでHideしろとか、なんだかすっきりしない。
そこで非表示は諦めて、透明度(Opacity)で代替してみた。
以下は初期表示にOpacityを0.0に設定(非表示状態)し、徐々に透明度を下げる(1.0に近づける)ことで1.5秒後にFormの表示が完了するようにしている。
private void Form_Load(object sender, EventArgs e)
{
Timer timer = new Timer();
timer.Tick += new EventHandler(OpeningTimerProc);
timer.Interval = 10;
timer.Start();
timer.Tag = System.DateTime.Now.Ticks;
this.Opacity = 0.0;
}
private void OpeningTimerProc(object sender, EventArgs e)
{
if (sender is Timer)
{
long DISPLAY_TIME = 15000000;
Timer timer = (Timer)sender;
long w = System.DateTime.Now.Ticks - (long)timer.Tag;
if (w >= DISPLAY_TIME)
{
this.Opacity = 1.0;
timer.Stop();
}
else
{
this.Opacity = 1.0 * w / DISPLAY_TIME;
}
}
}
上記はアプリケーションのメインウィンドウとなるFormクラスで、Form_LoadはLoadハンドラだ。
開始時間をTagに格納し、タイマーで透明度を下げる時間の判定に使っている。
Tagはなんだか便利だ。
もちろんいきなりOpacityを1.0にしても良いが、1.5秒もアプリの起動操作に反応が無い、というのも宜しくないので、このようにしてみた。