I'm trying to create a user control that will provide a draggable splitter between two panels — exactly like SplitContainer — in a custom IDesignerHost implementation. SplitContainer itself, as far as I can tell, is not an option; it will raise an exception unless used in Visual Studio's Designer.
My implementation would look roughly like this, except that I'm not receiving the necessary mouse events. I've tried event handlers, On*
overrides and overriding WndProc
in the user control itself, the host control, and the parent form, but I don't appear to receive WM_MOUSEMOVE
, WM_LBUTTONDOWN
or WM_LBUTTONUP
events anywhere. Per this bug report, I should be receiving WM_MOUSEMOVE
in "the control designer"; I'm not sure what that refers to in this case.
Any ideas how I can implement a draggable splitter?
Turns out this is easy — once you know how.
Designer
attribute on the control to a custom class that inherits from ControlDesigner
.OnSetCursor
method so that, while over the splitter region, you show the HSplit
or VSplit
cursor, respectively. Per this ticket, make sure not to set the control's cursor (this will cause a stack overflow, crash, or other erratic behavior, and certainly not what you want), but rather Cursor.Current
.OnMouseDragBegin
, OnMouseDragMove
and OnMouseDragEnd
to resize the inner panels.