フォームをフェードインしながら表示したい場合、皆さんはどうしていますか。タイマーを使用してちょっとずつ透明度を変化させていないでしょうか。実はそれを一つの関数で行ってくれる Win32 API があります。それが AnimateWindow 関数です。
AnimateWindow 関数で出来る事はリンク先の MSDN を見てもらえばわかると思いますが、フェードイン、フェードアウト、ロール、スライドといったアニメーション効果があります。さらにそれらの効果の時間もミリ秒単位で設定することが出来ます。
では AnimateWindow 関数を使用してフォームをフェードインするサンプルを下記に記載します。
<Flags()> _
Private Enum AnimateWindowFlags
AW_HOR_POSITIVE = &H1
AW_HOR_NEGATIVE = &H2
AW_VER_POSITIVE = &H4
AW_VER_NEGATIVE = &H8
AW_CENTER = &H10
AW_HIDE = &H10000
AW_ACTIVATE = &H20000
AW_SLIDE = &H40000
AW_BLEND = &H80000
End Enum
<DllImport("user32.dll")> _
Private Shared Function AnimateWindow(ByVal hwnd As IntPtr, ByVal time As Integer, ByVal flags As AnimateWindowFlags) As Boolean
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim f As New Form
AnimateWindow(f.Handle, 200, AnimateWindowFlags.AW_ACTIVATE Or AnimateWindowFlags.AW_BLEND)
f.Show()
End Sub
このように AnimateWindow 関数を呼ぶだけで、フォームをフェードインさせることができます。注意する点としては AW_BLEND フラグと合わせて AW_ACTIVATE フラグも設定することです。AW_ACTIVATE フラグを設定しなかった場合に私の環境では、コントロールボックスの表示がおかしくなってしまいました。
それと AnimateWindow 関数を呼んだ時点でフォームは表示されているのですが、Visible プロパティは False を返し、ロードイベントは発生しません。その後に Show メソッドを呼ぶとロードイベントが発生します。
フェードイン以外に使えそうなものとして AW_SLIDE フラグと AW_VER_NEGATIVE フラグを組み合わせることで、アラートウィンドウのようにビヨヨーンと表示させることもできます。
AnimateWindow(f.Handle, 200, AnimateWindowFlags.AW_SLIDE Or AnimateWindowFlags.AW_VER_NEGATIVE)
文章からはアニメーション効果が見えないため、ぜひ一度試してみてください。