Как сделать две вещи одним щелчком мыши в форме Windows - PullRequest
0 голосов
/ 13 декабря 2008

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

Ответы [ 3 ]

2 голосов
/ 13 декабря 2008
foreach(Control c in parentForm.Controls)
{
   c.Click += delegate(object sender, EventArgs e)
              {
                  if(floatyWindow != null && floatyWindow.IsFloating)
                  {
                       floatyWindow.Close();
                  }
              };
}

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

0 голосов
/ 14 декабря 2008

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

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 декабря 2008

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

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

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

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