フォームをフェードインしながら表示したい場合、皆さんはどうしていますか。タイマーを使用してちょっとずつ透明度を変化させていないでしょうか。実はそれを一つの関数で行ってくれる 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 フラグを設定しなかった場合に私の環境では、コントロールボックスの表示がおかしくなってしまいました。

AW_BLEND フラグのみ設定した場合

 それと AnimateWindow 関数を呼んだ時点でフォームは表示されているのですが、Visible プロパティは False を返し、ロードイベントは発生しません。その後に Show メソッドを呼ぶとロードイベントが発生します。

 フェードイン以外に使えそうなものとして AW_SLIDE フラグと AW_VER_NEGATIVE フラグを組み合わせることで、アラートウィンドウのようにビヨヨーンと表示させることもできます。

アラートウィンドウの表示サンプル
AnimateWindow(f.Handle, 200, AnimateWindowFlags.AW_SLIDE Or AnimateWindowFlags.AW_VER_NEGATIVE)

 文章からはアニメーション効果が見えないため、ぜひ一度試してみてください。