22
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

フォーカス系イベントの発生順を知る

Posted at

特にVB6しか使ってこなかった人によくあるやつの説明用。

MSDN

Control.GotFocus
Control.LostFocus

どちらにも発生順がちゃんと記されてあって、タブ遷移とマウス遷移によって、LostFocusの発生順が違うことが分かる。

Note部をGoogle先生に頑張って翻訳してもらうと

GotFocusおよびLostFocusイベントは、WM_KILLFOCUSおよびWM_SETFOCUS Windowsメッセージに関連付けられている低レベルのフォーカスイベントです。 通常、GotFocusイベントとLostFocusイベントは、UICueを更新するとき、またはカスタムコントロールを作成するときにのみ使用されます。 代わりに、ActivateイベントとDeactivateイベントを使用するFormクラス以外のすべてのコントロールに対して、EnterイベントとLeaveイベントを使用する必要があります。 GotFocusおよびLostFocusイベントの詳細については、WM_SETFOCUSおよびWM_KILLFOCUSトピックを参照してください。

つまり、コントロールを作成する時以外に、GotFocus, LostFocusなんてつかわん、ということ。

試す

Form1.cs
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            textBox1.GotFocus += TextBox1_GotFocus;
            textBox1.LostFocus += TextBox1_LostFocus;
        }

        private void TextBox1_LostFocus(object sender, EventArgs e)
        {
            Console.WriteLine("LostFocus");
        }

        private void TextBox1_GotFocus(object sender, EventArgs e)
        {
            Console.WriteLine("GotFocus");
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            Console.WriteLine("Enter");
        }

        private void textBox1_Leave(object sender, EventArgs e)
        {
            Console.WriteLine("Leave");
        }

        private void textBox1_Validated(object sender, EventArgs e)
        {
            Console.WriteLine("Validated");
        }

        private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            Console.WriteLine("Validating");
        }
    }

発生順は以下の通り。

  • タブによるフォーカスイン
    1. Enter
    2. GotFocus
  • タブによるフォーカスアウト
    1. Leave
    2. Validating
    3. Validated
    4. LostFocus
  • マウスによるフォーカスイン
    1. Enter
    2. GotFocus
  • マウスによるフォーカスアウト
    1. LostFocus
    2. Leave
    3. Validating
    4. Validated
  • ウィンドウのアクティブ化
    1. GotFocus
  • ウィンドウの非アクティブ化
    1. LostFocus

MSDNに記されている通り、タブとマウスによるフォーカスアウトでは、LostFocusの発生順が一定ではない。
更にGotFocus, LostFocusは、ウィンドウのアクティブ状態によっても発生する。

つまり、GotFocus, LostFocusを利用しなければならない明確な理由がない以上は、何も考えなくていいからEnter, Leave使おう

22
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?