Как ComboBox захватывает мышь, когда она выпадает? - PullRequest
8 голосов
/ 14 февраля 2012

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

Я пытался подписаться на такие события, как MouseCaptureChanged, LostFocus и Leave. У меня есть пользовательский элемент управления UserControl, который действует как раскрывающийся список, и я просто хочу закрыть его, когда пользователь щелкает в другом месте.

Это похоже на то, что делается во многих элементах управления, поэтому я был бы удивлен, если бы не было простого способа сделать это.

Пока что слишком сложные методы, которые я могу придумать для этого, используют pinvoke и функцию SetCapture () или для создания MessageFilter. Если это единственные варианты, я не уверен, что лучше.

Ответы [ 2 ]

1 голос
/ 09 марта 2013

ComboBox состоит из 2 элементов управления.

  • База - отображается, когда она не активна (элемент управления)
  • DropDownList - отображается в режиме редактирования или в режиме выбора списка (окно или форма)

ОбычноБаза видна.Когда пользователь нажимает на ComboBox, элемент управления Base скрывается и отображается элемент управления DropDownList.Этот переключатель выполняется в фоновом режиме, поэтому пользователю кажется, что элемент управления только что расширен.

Событие, которое вы хотите перехватить, выполняется через окно DropDownList.Если вы щелкнете где-нибудь в своей клиентской области, окно DropDownList получит событие WM_KILLFOCUS с помощью метода WndProc (Message% m) .Затем отправляет в родительское окно (элемент управления Base) сообщение WM_COMMAND ( OCM_COMMAND ) с WParam = 526318 ( HIWORD (WParam) = 8 ) и элемент управления Base знает, что он должен скрыть окно DropDownList.

Итак, вам нужно реализовать дополнительное окно DropDown и перехватить событие WM_KILLFOCUS.

0 голосов
/ 20 марта 2013

Шаблоны элементов управления, которые вы упомянули, используют для раскрывающихся списков всплывающее окно в виде контейнера со свойством StaysOpen, для которого установлено значение false (как мне кажется, по умолчанию).

Шаблон ComboBoxпример

...