.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秒もアプリの起動操作に反応が無い、というのも宜しくないので、このようにしてみた。