Как обращаться с кнопкой закрытия (большой X) у источника? - PullRequest
3 голосов
/ 22 апреля 2010

Мы бы хотели при некоторых обстоятельствах заблокировать действие кнопки закрытия в строке заголовка. Проблема в том, что это приложения MDI, и, похоже, нам придется добавлять код в каждую форму, чтобы отменить операцию в обработчике Closing. Кажется, что дочерние формы первыми получают событие. Нет способа добавить код в одном месте, чтобы отменить операцию закрытия. Информация о том, как событие close распространяется на дочернюю форму, будет приветствоваться. Есть ли простой способ сделать то, что мы хотим сделать?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2010

Windows предоставляет способ сделать это, вы можете повозиться с системным меню.Обеспечивает приятную обратную связь, кнопка закрытия на самом деле выглядит отключенной.Вы можете отключить команду SC_CLOSE в системном меню.Лучше всего продемонстрировать образец формы, начните с нажатия на нее кнопки:

using System.Runtime.InteropServices;
...

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        button1.Click += new EventHandler(button1_Click);
    }

    private bool mCloseEnabled = true;
    public bool CloseEnabled {
        get { return mCloseEnabled; }
        set {
            if (value == mCloseEnabled) return;
            mCloseEnabled = value;
            setSystemMenu();
        }
    }

    protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
        setSystemMenu();
    }
    private void setSystemMenu() {
        IntPtr menu = GetSystemMenu(this.Handle, false);
        EnableMenuItem(menu, SC_CLOSE, mCloseEnabled ? 0 : 1);
    }
    private const int SC_CLOSE = 0xf060;
    [DllImport("user32.dll")]
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool revert);
    [DllImport("user32.dll")]
    private static extern int EnableMenuItem(IntPtr hMenu, int IDEnableItem, int wEnable);

    private void button1_Click(object sender, EventArgs e) {
        CloseEnabled = !CloseEnabled;
    }
}
1 голос
/ 22 апреля 2010

Майкл уже написал ответ в комментариях (просто чтобы добавить его здесь к ответам):

Создайте один BaseFormsClass, в котором вы переопределяете поведение, а затем создадите подклассы ваших классов из нового BaseFormsClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...