2

mainForm と subForm の 2 つのフォームがあります。mainForm がフォーカスを失うと、subForm が消えてから、mainForm がフォーカスを取り戻すと再び表示されるようにします。mainForm で Activated イベントと Deactivate イベントを使用して、mainForm にフォーカスがあるかどうかを追跡しています。Activated が発生すると、subForm.Show() を実行し、Deactivate の反対を実行します。私が抱えている問題は、サブフォームがフォーカスを獲得したとき、メインフォームが消えるということです。プログラムで「メインフォームの Deactivate イベントが発生したときにサブフォームを非表示にする」と言う方法がわからないため、サブフォームがフォーカスを獲得したためです。ユーザーが別のアプリケーションをクリックしたり、ALT + TAB を使用して切り替えたりしたために mainForm がフォーカスを失ったときに、両方のウィンドウを非表示にすることです。

class MainForm : Form
{
    SubForm subForm = new SubForm();

    private void mainForm_Activated(object sender, EventArgs e)
    {
        this.subForm.Show();
    }

    private void mainForm_Deactivate(object sender, EventArgs e)
    {
        this.subForm.Hide()

        // I need some logic to make sure that it is only hidden
        // when the mainForm loses focus because the user clicked
        // some other application in the taskbar and not when the
        // subForm itself gains the focus.
    }
}
4

3 に答える 3

2

これは私のマシンで動作します。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    private Form2 _form2;
    private void Form1_Load(object sender, EventArgs e) {
        _form2 = new Form2();
        _form2.Show();
        HandleFocusEvents();
    }

    private void HandleFocusEvents() {
        this.LostFocus += Form_LostFocus;
        _form2.LostFocus += Form_LostFocus;
        this.GotFocus += Form_GotFocus;
    }

    private void Form_LostFocus(object sender, EventArgs e) {
        if (!_form2.ContainsFocus && !this.ContainsFocus) {
            _form2.Hide();
        }
    }

    private void Form_GotFocus(object sender, EventArgs e) {
        if (!_form2.Visible) {
            _form2.Show();
        }
    }
}
于 2012-10-24T07:32:18.067 に答える
1

サブフォームの新しいインスタンスを作成するメインフォームコードで、サブフォームフォームのインスタンスがアクティブ化されるたびに発生するイベントを追加します。そのイベントハンドラーで、bool変数をtrueに設定します。ここで、bool変数をfalseに設定することを除いて、サブフォームインスタンスの非アクティブ化イベントに対して同じことを行います。メインフォームのフォーカスが失われた場合、非表示にする前に、bool変数をチェックし、「サブフォームにフォーカスがありません」という偽であることを確認してから、メインフォームを非表示にします。あなたがこれまでに持っているものを見ることができれば、私はコードを提供することができます。これにはさまざまな方法があります。これがお役に立てば幸いです。

于 2012-10-24T03:02:41.367 に答える
0

私が正しく理解していれば、これは通常のMDIアプリケーションのように聞こえます。メインフォームをMDI親にし、サブフォームMDI親をメインフォームに設定できますか?あなたが話しているこれらのアクティベーションのもののほとんどは、自動的に世話をする必要がありますか?または、せいぜいサブフォームで最小化イベントをトラップして、mdi親フォームも最小化するだけです。

于 2012-10-24T03:03:36.713 に答える