Перехват событий мыши для настраиваемого SplitContainerDesigner

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

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

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


person Sören Kuklau    schedule 16.07.2010    source источник


Ответы (1)


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

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