【C#】Windows.Formsのイベント順序

# 00. はじめに
Windows Formのイベント実行順序は以下に記載されています。
[Windows フォームのイベントの順序](https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/order-of-events-in-windows-forms)
が、AndroidのLifecycleのように図にして一目で分かるようにされていません。
ですので、確認がてら図を起こしていきます。

# 01. 環境
確認に使用した環境です。

||バージョン|
|:--|:--|
|Windows 10 Pro|1709|
|Visual Studio Community 2017|15.6.5|
|.NET Framework|4.6.1|

# 02. 図
<img width=75% alt="Windows.Formsのイベント順序.png" src="https://qiita-image-store.s3.amazonaws.com/0/235452/a3cf30b5-96f0-c5fe-a9f4-d6a4bc983ed6.png">

<details><summary>図のwsd</summary><div>
PlantUMLはVersion 1.2018.3を使用

```
@startuml
title Windows.Formsのイベント順序

start

->アプリ起動;
:Control.HandleCreated;
note left
    コントロールに対してハンドルが作成されると発生します。
end note

:Control.BindingContextChanged;
note left
    BindingContext プロパティの値が
    変更された場合に発生します。
end note

:Form.Load;
note left
    フォームが初めて表示される直前に発生します。
end note

:Control.VisibleChanged;
note left
    Visible プロパティの値が
    変更された場合に発生します。
end note

:★１;

:Form.Activated;
note left
    フォームがコード内またはユーザーの操作によって
    アクティブになると発生します。
end note

if (初めて表示する) then (Yes)
    :Form.Shown;
    note left
        フォームが初めて表示されるたびに発生します。
    end note
else (No)
endif

:イベント関係;

split
    ->フォーカスを失う;
    :Form.Deactivate;
    note left
        フォームがフォーカスを失い
        アクティブでなくなると発生します。
    end note
    
    ->フォーカスを得る;
    :★１へ;
    detach
split again
    ->アプリ終了;
    :Form.FormClosing;
    note right
        フォームが閉じる前に発生します。
    end note

    :Form.FormClosed;
    note right
        フォームが閉じた後に発生します。
    end note

    :Form.Deactivate;
    note right
        フォーカスを失った際と同じイベント
    end note

    :Control.HandleDestroyed;
    note right
        コントロールのハンドルが
        破棄されているときに発生します。
    end note

    stop
end split

partition イベント関係 {
    partition マウスイベント {
        :MouseEnter;
        note left
            マウス ポインターによってコントロールが入力されると発生します。
            （要はマウスポインタがフォーム外から入ってくると発生）
        end note
        detach
        
        :MouseMove;
        note left
            マウス ポインターがコントロール上を移動すると発生します。
        end note
        detach

        :MouseHover;
        note left
            マウスポインタがコントロール上に重なると発生する
            （マウスポインタの動きが止まったら？）
        end note
        detach

        :MouseDown;
        note left
            マウス ポインターがコントロール上にあり、
            マウス ボタンがクリックされると発生します。
        end note

        :MouseUp;
        note left
            マウス ポインターがコントロール上にあり、
            マウス ボタンが離されると発生します。
        end note
        detach
    }

    partition キーイベント {
        repeat
            ->キーを押している間繰り返される;
            :PreviewKeyDown;
            note left
                このコントロールにフォーカスがあるときにキーが押された場合、
                KeyDown イベントの前に発生します。
            end note

            :KeyDown;
            note left
                コントロールにフォーカスがあるときにキーが押されると発生します。
            end note

            :KeyPress;
            note left
                コントロールにフォーカスがあるときに、
                文字、 スペース、または Backspace キーが押された場合に発生します。
            end note
        repeat while()

        :KeyUp;
        note left
            コントロールにフォーカスがあるときにキーが離されると発生します。
        end note
    }
}

@enduml
```
</div></details>

# 98. 参考
Windows フォームのイベントの順序 | https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/order-of-events-in-windows-forms

# 99. 更新履歴
|日付|内容|
|:--|:--|
|2018/05/01|投稿|