Перехват событий мыши для пользовательского SplitContainerDesigner - PullRequest
0 голосов
/ 16 июля 2010

Я пытаюсь создать пользовательский элемент управления, который будет обеспечивать перетаскиваемый разделитель между двумя панелями - точно так же, как SplitContainer - в пользовательской реализации IDesignerHost. Сам SplitContainer, насколько я могу судить, не вариант; оно вызовет исключение, если оно не используется в конструкторе Visual Studio.

Моя реализация будет выглядеть примерно как this , за исключением того, что я не получаю необходимые события мыши. Я пробовал обработчики событий, On* переопределения и переопределения WndProc в самом пользовательском элементе управления, элементе управления хоста и родительской форме, но я не получаю WM_MOUSEMOVE, WM_LBUTTONDOWN или WM_LBUTTONUP события везде . За этот отчет об ошибке , я должен получить WM_MOUSEMOVE в «конструкторе элементов управления»; Я не уверен, к чему это относится в данном случае.

Есть идеи, как я могу реализовать перетаскиваемый сплиттер?

1 Ответ

0 голосов
/ 17 июля 2010

Оказывается, это легко - если вы знаете, как.

  1. Установите атрибут Designer в элементе управления для пользовательского класса, который наследуется от ControlDesigner.
  2. Переопределитьметод OnSetCursor, чтобы при нахождении над областью разделителя отображался курсор HSplit или VSplit соответственно. В соответствии с этим билетом , убедитесь, что не для установки курсора элемента управления (это приведет к переполнению стека, падению или другому ошибочному поведению и, конечно, не к тому, что вы хотите), а скорее к Cursor.Current.
  3. Переопределить OnMouseDragBegin, OnMouseDragMove и OnMouseDragEnd для изменения размера внутренних панелей.
...