Как вы можете получить координаты кнопки "X" в окне?
По той или иной причине мне нужно определить, когда пользователь действительно нажимал кнопку X. То, что я до сих пор, это:
protected override void WndProc(ref Message m)
{
if (m.Msg == (int)0xa1) //WM_NCLBUTTONDOWN
{
Point p = new Point((int)m.LParam);
p = this.PointToClient(p);
if (p.X > 680)
{
//do what I need to do...
}
}
base.WndProc(ref m);
}
По сути, я высматриваю сообщение "WM_NCLBUTTONDOWN", которое представляет собой щелчок мышью в не клиентской области окна. Затем я получаю координаты X и Y от LParam и, наконец, преобразовываю их в Координаты экрана. Итак, на данный момент, я знаю, что пользователь нажал на не клиентскую область, и я знаю, где на форме.
У меня вопрос, как я могу узнать, есть ли эти координаты на кнопке X? На данный момент я жестко программирую 680, потому что это то, что работает в текущем размере окна (оно не имеет значительного размера), но проблема в том, что я использую Windows 7, которая имеет более крупные кнопки X, чем XP, поэтому очевидно, что хардокдинг не является жизнеспособным вариант. Более того, я даже не кодировал координаты Y, поэтому, если кто-то щелкнет по правому краю окна, это также вызовет этот код. Итак... у кого-нибудь есть идеи?
2 ответа
Допустим, у вас есть кнопка "ОК" и кнопка "Отмена", почему бы просто не установить значение при нажатии одной из этих кнопок. Затем в событии закрытия формы, если это значение не установлено, вы знаете, что кнопка X была нажата. Если нет других способов закрытия формы, о которых я не знаю...
Редактировать:
Вместо использования глобального логического значения, вы можете изменить свойство DialogResult формы при нажатии кнопки. Я не уверен, что такое значение DialogResult, когда вы нажимаете кнопку X, вам придется попробовать его.
Если вы проверяете сообщение WM_NCHITTEST, в котором должно быть указано, когда указатель мыши находится над кнопкой закрытия.