Как сделать две вещи одним щелчком мыши в форме Windows

На моей основной форме есть другое (плавающее) окно. Это плавающее окно работает как всплывающее окно в том, что оно закрывается, когда пользователь щелкает где-то еще за пределами этого окна. Это обрабатывается событием Deactivate. Но я хочу, чтобы, если пользователь нажимает на другой элемент управления (скажем, кнопку), я хочу закрыть это всплывающее окно и затем активировать эту кнопку одним щелчком мыши. В настоящее время пользователь должен щелкнуть дважды (один, чтобы деактивировать окно, и еще раз, чтобы активировать нужную кнопку). Есть ли способ сделать это одним щелчком мыши?

13.12.2008 20:14:46
3 ОТВЕТА

У меня было немного хакерское решение. В вашем событии Deactivate запустите другое настраиваемое событие для вашей главной формы. Затем, когда ваша основная форма обрабатывает пользовательское событие, перечислите его через свой элемент управления (this.Controls) и найдите элемент управления под мышью, проверив все их границы, затем вызовите Focus (). Возможно, вам придется отсортировать по тому, который имеет наименьшую площадь поверхности, или для этой цели у вас может быть отдельный список «похожих на фокус» кнопок управления.

Другим способом может быть переключение фокуса на основную форму сразу после OnMouseLeave всплывающего окна или OnMouseHover вашего основного окна, но держите всплывающие окна сверху, просто не фокусируясь. Удерживайте глобальную мышь в нижней части главной формы и закройте всплывающее окно.

Это всего лишь теории, не проверенные.

0
13.12.2008 20:34:53
foreach(Control c in parentForm.Controls)
{
   c.Click += delegate(object sender, EventArgs e)
              {
                  if(floatyWindow != null && floatyWindow.IsFloating)
                  {
                       floatyWindow.Close();
                  }
              };
}

А затем добавьте ваши обработчики как обычно. Этот дополнительный обработчик может закрыть всплывающее окно. Убедитесь, что ваше всплывающее окно не является диалоговым окном, так как это не позволит нажимать на элементы управления родительской формы.

2
13.12.2008 20:36:55

Однажды у меня возникла такая проблема, когда клиент захотел использовать «всплывающие» окна. Я использовал подход, аналогичный описанному в этой статье:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp

Пример кода доступен здесь:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/Popup_Form_Demonstration.asp

Расширив это немного, мы создали «плавающие» окна, подобные тем, которые использует VS, когда вы получаете ошибку времени выполнения при отладке кода.

По крайней мере, чтение кода может дать вам некоторое представление, однако ответ ссориться может быть более простым решением.

0
13.12.2008 21:38:05