|

Introduction
This control was modeled from the collapsible splitter used in the Mozilla web browser, but with some added functionality. This control allows a linked form control to be dynamically expanded and collapsed by clicking on the splitter control button, and resized by dragging the splitter. Additionally, there is an option to expanded or contract the parent form so that the control to expand doesn't take any further form area.
How it works
The CollapsibleSplitter derives from the System.Windows.Forms.Splitter class, working with 2 overrides, mouse event handlers, and exposing 4 new properties. The code is relatively straight-forward, and is well commented. The only code that I will cover here is the control painting and interaction with the base splitter control.
In creating the control, I first started by creating a new derived class with Stephen Toub's DeriveClass utility. The next step was to draw the control surface, first by finding the clip rectangle for the base splitter and then defining a new rectangle located in the vertical center of the splitter for the collapser control. protected override void OnPaint(PaintEventArgs e)
{
this.Width = 8;
Graphics g = e.Graphics;
Rectangle r = this.ClientRectangle;
g.FillRectangle(new SolidBrush(this.BackColor), r);
rr = new Rectangle(r.X, (int) r.Y + ((r.Height - 115)/2),
8, 115);
if(hot)
g.FillRectangle(new SolidBrush(hotColor),
new Rectangle(rr.X + 1, rr.Y, 6, 115));
else
g.FillRectangle(new SolidBrush(this.BackColor),
new Rectangle(rr.X + 1, rr.Y, 6, 115));
g.DrawLine(new Pen(SystemColors.ControlDark, 1),
rr.X + 1, rr.Y, rr.X + rr.Width - 2, rr.Y);
g.DrawLine(new Pen(SystemColors.ControlDark, 1),
rr.X + 1, rr.Y + rr.Height, rr.X + rr.Width - 2,
rr.Y + rr.Height);
g.FillPolygon(new SolidBrush(SystemColors.ControlDarkDark),
ArrowPointArray(rr.X + 2, rr.Y + 3));
g.FillPolygon(new SolidBrush(SystemColors.ControlDarkDark),
ArrowPointArray(rr.X + 2, rr.Y + rr.Height - 9));
int x = rr.X + 3;
int y = rr.Y + 14;
switch(visualStyle)
{
case VisualStyles.Mozilla:
for(int i=0; i < 30; i++)
{
g.DrawLine(
new Pen(SystemColors.ControlLightLight),
x, y + (i*3), x+1, y + 1 + (i*3));
g.DrawLine(
new Pen(SystemColors.ControlDarkDark),
x+1, y + 1 + (i*3), x+2, y + 2 + (i*3));
if(hot)
g.DrawLine(new Pen(hotColor),
x+2, y + 1 + (i*3), x+2, y + 2 + (i*3));
else
g.DrawLine(new Pen(this.BackColor),
x+2, y + 1 + (i*3), x+2, y + 2 + (i*3));
}
break;
case VisualStyles.DoubleDots:
for(int i=0; i < 30; i++)
{
g.DrawRectangle(
new Pen(SystemColors.ControlLightLight),
x, y + 1 + (i*3), 1, 1 );
g.DrawRectangle(
new Pen(SystemColors.ControlDark),
x - 1, y +(i*3), 1, 1 );
i++;
g.DrawRectangle(
new Pen(SystemColors.ControlLightLight),
x + 2, y + 1 + (i*3), 1, 1 );
g.DrawRectangle(
new Pen(SystemColors.ControlDark),
x + 1, y + (i*3), 1, 1 );
}
break;
case VisualStyles.Win9x:
g.DrawLine(new Pen(SystemColors.ControlLightLight),
x, y, x + 2, y);
g.DrawLine(new Pen(SystemColors.ControlLightLight),
x, y, x,y + 90);
g.DrawLine(new Pen(SystemColors.ControlDark),
x + 2, y, x + 2, y + 90);
g.DrawLine(new Pen(SystemColors.ControlDark),
x, y + 90, x + 2, y + 90);
break;
case VisualStyles.XP:
for(int i=0; i < 18; i++)
{
g.DrawRectangle(
new Pen(SystemColors.ControlLight),
x, y + (i*5), 2, 2 );
g.DrawRectangle(
new Pen(SystemColors.ControlLightLight),
x + 1, y + 1 + (i*5), 1, 1 );
g.DrawRectangle(
new Pen(SystemColors.ControlDarkDark),
x, y +(i*5), 1, 1 );
g.DrawLine(
new Pen(SystemColors.ControlDark),
x, y + (i*5), x, y + (i*5) + 1);
g.DrawLine(
new Pen(SystemColors.ControlDark),
x, y + (i*5), x + 1, y + (i*5));
}
break;
case VisualStyles.Lines:
for(int i=0; i < 44; i++)
{
g.DrawLine(new Pen(SystemColors.ControlDark),
x, y + (i*2), x + 2, y + (i*2));
}
break;
}
g.Dispose();
}
The control rectangle is used in the MouseMove event to determine if the cursor is within the control area (hot), or in the base controls splitter area. Once we know whether the cursor is in the 'hot' area we can change various aspects of the control: use a highlighted background color, ignore or pass on the MouseDown event, and also set the appropriate mouse cursor.
private void OnMouseMove(object sender, MouseEventArgs e)
{
if(e.X >= rr.X && e.X <= rr.X + rr.Width &&
e.Y >= rr.Y && e.Y <= rr.Y + rr.Height)
{
if(!hot)
{
hot = true;
this.Cursor = Cursors.Hand;
this.Refresh();
}
}
else
{
if(hot)
{
hot = false;
this.Refresh();
}
if(!controlToHide.Visible)
this.Cursor = Cursors.Default;
else
this.Cursor = Cursors.VSplit;
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
if(!hot && !collapsed)
base.OnMouseDown(e);
}
Using the control
The CollapsibleSplitter control can be added to the toolbox using the pre-compiled dll in the demo application, or simply copy the class into your project and manually reference it in your code.
To Add the Collapsible Splitter to your VS.Net toolbox, follow these steps:
- Right-click on the VS.Net Toolbox and select "Customize Toolbox..."
- Select the ".Net Framework Components" tab, and click the "Browse.." button
- Browse to and open the "CollapsibleSplitter.dll" file from the demo application archive
- Click OK to add Collapsible Splitter control to your Toolbox.
Once you have it on a form, set the Dock property, and then set the ControlToHideproperty so that the splitter knows which form control to interact with. All properties specific to the collapsing behaviour can be found under the Collapsing Options group in the properties window. Once created on your form, the view state can be programmatically toggled by calling the ToggleState method, and the current state can be retrieved from the IsCollapsed property.
I hope you find this control useful, and if you improve this control, please email me the updated source. If you have any comments or suggestions, please post your thoughts in the feedback section below.
Updates
Version 1.1 Changes:
OnPaint is now overridden instead of being a handled event, and the entire splitter is now painted rather than just the collapser control
- The splitter rectangle is now correctly defined
- The
Collapsed property was renamed to IsCollapsed, and the code changed so that no value needs to be set
- New visual styles added:
Win9x, XP, DoubleDots and Lines
Version 1.11 Changes:
- The
OnMouseMove event handler was updated to address a flickering issue discovered by John O'Byrne
Version 1.2 Changes:
- Added support for Horizontal Splitters
Version 1.3 Changes: (24 Aug 2003)
- Added an optional 3D border
- General code and comment cleaning
- Flagged assembly with the CLSCompliant attribute
- Added a simple designer class to filter unwanted properties
- Added support for inclusion as a VS.Net ToolBox control
- Added a ToolBox bitmap
- Removed extraneous overrides
- Added summaries
- Removed the ParentFolder from public properties - this is now set automatically in the OnHandleCreated event
- Added expand/collapse animation code
| You must Sign In to use this message board. |
|
| | Msgs 1 to 25 of 115 (Total in Forum: 115) (Refresh) | FirstPrevNext |
|
 |
|
|
 |
|
|
Hi, I have been tryied to implement a similar component when I lock your. So I get some methods from our implementation but inheriting from SplitterContainer. I want to know if I can do a article discribing the changes that I made based on your component a submite the source code for other developers.
Mário Santos, Brazil.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
 |
|
|
Thanks a lot for this control! It's really nice (although it seems like it should still work like a normal splitter when the control to collapse is not set -- I wanted it originally just for the improved look).
One thing: the Interval property of the animation timer is only set in the constructor, so setting the AnimationDelay property does nothing. Add the following line in the set accessor of AnimationDelay:
animationTimer.Interval = value;
Still, it doesn't change much to go shorter than the default of 20 due to the timer resolution, and I doubt anyone is going to want to make it longer (more choppy motion).
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Can I use a button to do open/close the panels or do I have to use the toolbar? If I can use the button, how would I code it? This is my first time using c and I need all the help I can get.
Thanks
|
| Sign In·View Thread·PermaLink | 1.00/5 (1 vote) |
|
|
|
 |
|
|
Hi,
We have integrated the collapsible splitter into our application. It worked fine under .NET 1.1 but we now have issues with it under 2.0. The problem seems random as we can't find a pattern to reproduce it. It even happens when the form with the splitter in it is minimized. We sometimes get the following error message when the splitter paints itself.
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at System.Drawing.SafeNativeMethods.Gdip.GdipDrawLineI(HandleRef graphics, HandleRef pen, Int32 x1, Int32 y1, Int32 x2, Int32 y2) at System.Drawing.Graphics.DrawLine(Pen pen, Int32 x1, Int32 y1, Int32 x2, Int32 y2) at CollapsibleSplitter.OnPaint(PaintEventArgs e) in C:\DEV\APTS\NJFLib.Controls\NJFLib.Controls.CollapsibleSplitter.cs:line 601 at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run()
Any ideas on why this happen?
|
| Sign In·View Thread·PermaLink | 1.60/5 (4 votes) |
|
|
|
 |
|
|
 |
|
|
For example,I have a treeview docked in the left which is the hide control of the Collapsible Splitter control "CollapsibleSplitter1". Then it works well. But now I want to hide the ChildForm, and expand the threeview. How should I do?
|
| Sign In·View Thread·PermaLink | 4.20/5 (2 votes) |
|
|
|
 |
|
|
you know, sometimes we need to update other UI elements when the splitter folded or unfolded, but i found no event notification was raised when the state toggled in this control. then i added one by myself, which is very simple.
i'm fresh here, so i dont know how to post code or upload attachment package who can help me to post my modification? thanks
|
| Sign In·View Thread·PermaLink | 1.50/5 (2 votes) |
|
|
|
 |
|
|
Hi I think you have a problem in your code, because in the demo exe, every time we use your splitter in the exe the memory usage increase(you can monitor the memory usage with windows task manager)  I think your allocate variables without deallocation..
kanaan
|
| Sign In·View Thread·PermaLink | 5.00/5 (1 vote) |
|
|
|
 |
|
|
Furty - nice control and I have things working pretty much the way I want except that when I collapse your splitter to the right edge of a tabPage (this splitter hides panel4 docked to the right side) I no longer can see the splitter. I have a collapsible splitter on the left side (hidding panel1 docked to the left) and a splitter on the top (this hides panel2) and they work fine.
Any idea why the right side is giving me problems?
The app is a Form with a tabSheet and two tab pages. The second tab page is where the collapsible splitters are and the four panes:
panel2 panel1 VCS HCS VCS panel4 panel3
Thanks.
Jon.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Hi Jon,
It sounds like you've got the second VCS as a child of Panel4, rather than a child of the TabPage itself. Failing this, it could be a z-order issue.
As noted in this[^] thread, all such issues usually end up being a simple heirarchy problem.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
When we put the splitter on a form, it works as expected. However, when we put it on a custom control (or standard panel), it has problems. It correctly draws itself, and correctly hides/shows the "controlToHide". However, the location of the splitter does not move. When we place everything on a Panel, it moves, but the "dark gray" outline of the "old" position remains. Our guess is that there is a bunch of extra processing that occurs behind the scenes on the Form vs. a control. Any ideas on how we might get this to work correctly? Thanks.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Yeah! I met the same problem:
Please allow me to use the term "Shadow" to describe the stuff which I really didn't know how to name it. The term "Shadow" is: When you press the splitter( don't release you mouse ) or drag the splitter, you can see a "Shadow" which helps to identify the position of the splitter.
---------------------------------------------- OK, here is the issue: 1, I set the UseAnimation to "False", Mozila style and run the application. 2, When I click the splitter, everything is OK except the "Shadow" still left. 3, And I replace your splitter with .Net 2.0's. The sistuation still happens. So I think it's Windows's fault.
Release PunCha's Power!
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
It appears you can't drag/resize the splitter by attempting to "grab" the splitter button. The button only allows clicking to hide a control. It would be nice to allow re-sizing as well but didn't find a way.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
You can made the following changes to the member function OnMouseDown:
protected override void OnMouseDown(MouseEventArgs e) { // if the hider control isn't hot, let the base resize action occur if (this.controlToHide != null) { if (/*!this.hot &&*/ this.controlToHide.Visible) { base.OnMouseDown(e); } } }
Release PunCha's Power!
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
I added offscreen drawing to OnPaint. At times I could see the individual dots being drawn 
Other than that great control and thanks!
t
relavent code
// OnPaint is now an override rather than an event in version 1.1 protected override void OnPaint(PaintEventArgs e) { // create a Graphics object Graphics g = e.Graphics; //create our offscreen bitmap Bitmap b = new Bitmap(ClientRectangle.Width, ClientRectangle.Height); Graphics bg = Graphics.FromImage(b); bg.Clear(this.BackColor); // find the rectangle for the splitter and paint it Rectangle r = this.ClientRectangle; // fixed in version 1.1 // g.FillRectangle(new SolidBrush(this.BackColor), r);
#region Vertical Splitter // Check the docking style and create the control rectangle accordingly if(this.Dock == DockStyle.Left || this.Dock == DockStyle.Right) { // create a new rectangle in the vertical center of the splitter for our collapse control button rr = new Rectangle(r.X, (int)r.Y + ((r.Height - 115)/2), 8, 115); // force the width to 8px so that everything always draws correctly this.Width = 8;
// draw the background color for our control image if(hot) { bg.FillRectangle(new SolidBrush(hotColor), new Rectangle(rr.X + 1, rr.Y, 6, 115)); } else { bg.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(rr.X + 1, rr.Y, 6, 115)); }
// draw the top & bottom lines for our control image bg.DrawLine(new Pen(SystemColors.ControlDark, 1), rr.X + 1, rr.Y, rr.X + rr.Width - 2, rr.Y); bg.DrawLine(new Pen(SystemColors.ControlDark, 1), rr.X + 1, rr.Y + rr.Height, rr.X + rr.Width - 2, rr.Y + rr.Height);
if(this.Enabled) { // draw the arrows for our control image // the ArrowPointArray is a point array that defines an arrow shaped polygon bg.FillPolygon(new SolidBrush(SystemColors.ControlDarkDark), ArrowPointArray(rr.X + 2, rr.Y + 3)); bg.FillPolygon(new SolidBrush(SystemColors.ControlDarkDark), ArrowPointArray(rr.X + 2, rr.Y + rr.Height - 9)); }
// draw the dots for our control image using a loop int x = rr.X + 3; int y = rr.Y + 14;
// Visual Styles added in version 1.1 switch(visualStyle) { case VisualStyles.Mozilla:
for(int i=0; i < 30; i++) { // light dot bg.DrawLine(new Pen(SystemColors.ControlLightLight), x, y + (i*3), x+1, y + 1 + (i*3)); // dark dot bg.DrawLine(new Pen(SystemColors.ControlDarkDark), x+1, y + 1 + (i*3), x+2, y + 2 + (i*3)); // overdraw the background color as we actually drew 2px diagonal lines, not just dots if(hot) { bg.DrawLine(new Pen(hotColor), x+2, y + 1 + (i*3), x+2, y + 2 + (i*3)); } else { bg.DrawLine(new Pen(this.BackColor), x+2, y + 1 + (i*3), x+2, y + 2 + (i*3)); } } break;
case VisualStyles.DoubleDots: for(int i=0; i < 30; i++) { // light dot bg.DrawRectangle(new Pen(SystemColors.ControlLightLight), x, y + 1 + (i*3), 1, 1 ); // dark dot bg.DrawRectangle(new Pen(SystemColors.ControlDark), x - 1, y +(i*3), 1, 1 ); i++; // light dot bg.DrawRectangle(new Pen(SystemColors.ControlLightLight), x + 2, y + 1 + (i*3), 1, 1 ); // dark dot bg.DrawRectangle(new Pen(SystemColors.ControlDark), x + 1, y + (i*3), 1, 1 ); } break;
case VisualStyles.Win9x:
bg.DrawLine(new Pen(SystemColors.ControlLightLight), x, y, x + 2, y); bg.DrawLine(new Pen(SystemColors.ControlLightLight), x, y, x,y + 90); bg.DrawLine(new Pen(SystemColors.ControlDark), x + 2, y, x + 2, y + 90); bg.DrawLine(new Pen(SystemColors.ControlDark), x, y + 90, x + 2, y + 90); break;
case VisualStyles.XP:
for(int i=0; i < 18; i++) { // light dot bg.DrawRectangle(new Pen(SystemColors.ControlLight), x, y + (i*5), 2, 2 ); // light light dot bg.DrawRectangle(new Pen(SystemColors.ControlLightLight), x + 1, y + 1 + (i*5), 1, 1 ); // dark dark dot bg.DrawRectangle(new Pen(SystemColors.ControlDarkDark), x, y +(i*5), 1, 1 ); // dark fill bg.DrawLine(new Pen(SystemColors.ControlDark), x, y + (i*5), x, y + (i*5) + 1); bg.DrawLine(new Pen(SystemColors.ControlDark), x, y + (i*5), x + 1, y + (i*5)); } break;
case VisualStyles.Lines:
for(int i=0; i < 44; i++) { bg.DrawLine(new Pen(SystemColors.ControlDark), x, y + (i*2), x + 2, y + (i*2)); }
break; }
// Added in version 1.3 if(this.borderStyle != System.Windows.Forms.Border3DStyle.Flat) { // Paint the control border ControlPaint.DrawBorder3D(bg, this.ClientRectangle, this.borderStyle, Border3DSide.Left); ControlPaint.DrawBorder3D(bg, this.ClientRectangle, this.borderStyle, Border3DSide.Right); } }
#endregion
// Horizontal Splitter support added in v1.2
#region Horizontal Splitter
else if (this.Dock == DockStyle.Top || this.Dock == DockStyle.Bottom) { // create a new rectangle in the horizontal center of the splitter for our collapse control button rr = new Rectangle((int)r.X + ((r.Width - 115)/2), r.Y, 115, 8); // force the height to 8px this.Height = 8;
// draw the background color for our control image if(hot) { bg.FillRectangle(new SolidBrush(hotColor), new Rectangle(rr.X, rr.Y + 1, 115, 6)); } else { bg.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(rr.X, rr.Y + 1, 115, 6)); }
// draw the left & right lines for our control image bg.DrawLine(new Pen(SystemColors.ControlDark, 1), rr.X, rr.Y + 1, rr.X, rr.Y + rr.Height - 2); bg.DrawLine(new Pen(SystemColors.ControlDark, 1), rr.X + rr.Width, rr.Y + 1, rr.X + rr.Width, rr.Y + rr.Height - 2);
if(this.Enabled) { // draw the arrows for our control image // the ArrowPointArray is a point array that defines an arrow shaped polygon bg.FillPolygon(new SolidBrush(SystemColors.ControlDarkDark), ArrowPointArray(rr.X + 3, rr.Y + 2)); bg.FillPolygon(new SolidBrush(SystemColors.ControlDarkDark), ArrowPointArray(rr.X + rr.Width - 9, rr.Y + 2)); }
// draw the dots for our control image using a loop int x = rr.X + 14; int y = rr.Y + 3;
// Visual Styles added in version 1.1 switch(visualStyle) { case VisualStyles.Mozilla:
for(int i=0; i < 30; i++) { // light dot bg.DrawLine(new Pen(SystemColors.ControlLightLight), x + (i*3), y, x + 1 + (i*3), y + 1); // dark dot bg.DrawLine(new Pen(SystemColors.ControlDarkDark), x + 1 + (i*3), y + 1, x + 2 + (i*3), y + 2); // overdraw the background color as we actually drew 2px diagonal lines, not just dots if(hot) { bg.DrawLine(new Pen(hotColor), x + 1 + (i*3), y + 2, x + 2 + (i*3), y + 2); } else { bg.DrawLine(new Pen(this.BackColor), x + 1 + (i*3), y + 2, x + 2 + (i*3), y + 2); } } break;
case VisualStyles.DoubleDots:
for(int i=0; i < 30; i++) { // light dot bg.DrawRectangle(new Pen(SystemColors.ControlLightLight), x + 1 + (i*3), y, 1, 1 ); // dark dot bg.DrawRectangle(new Pen(SystemColors.ControlDark), x + (i*3), y - 1, 1, 1 ); i++; // light dot bg.DrawRectangle(new Pen(SystemColors.ControlLightLight), x + 1 + (i*3), y + 2, 1, 1 ); // dark dot bg.DrawRectangle(new Pen(SystemColors.ControlDark), x + (i*3), y + 1, 1, 1 ); } break;
case VisualStyles.Win9x:
bg.DrawLine(new Pen(SystemColors.ControlLightLight), x, y, x, y + 2); bg.DrawLine(new Pen(SystemColors.ControlLightLight), x, y, x + 88, y); bg.DrawLine(new Pen(SystemColors.ControlDark), x, y + 2, x + 88, y + 2); bg.DrawLine(new Pen(SystemColors.ControlDark), x + 88, y, x + 88, y + 2); break;
case VisualStyles.XP:
for(int i=0; i < 18; i++) { // light dot bg.DrawRectangle(new Pen(SystemColors.ControlLight), x + (i*5), y, 2, 2 ); // light light dot bg.DrawRectangle(new Pen(SystemColors.ControlLightLight), x + 1 + (i*5), y + 1, 1, 1 ); // dark dark dot bg.DrawRectangle(new Pen(SystemColors.ControlDarkDark), x +(i*5), y, 1, 1 ); // dark fill bg.DrawLine(new Pen(SystemColors.ControlDark), x + (i*5), y, x + (i*5) + 1, y); bg.DrawLine(new Pen(SystemColors.ControlDark), x + (i*5), y, x + (i*5), y + 1); } break;
case VisualStyles.Lines:
for(int i=0; i < 44; i++) { bg.DrawLine(new Pen(SystemColors.ControlDark), x + (i*2), y, x + (i*2), y + 2); }
break; }
// Added in version 1.3 if(this.borderStyle != System.Windows.Forms.Border3DStyle.Flat) { // Paint the control border ControlPaint.DrawBorder3D(bg, this.ClientRectangle, this.borderStyle, Border3DSide.Top); ControlPaint.DrawBorder3D(bg, this.ClientRectangle, this.borderStyle, Border3DSide.Bottom); } }
#endregion
else { throw new Exception("The Collapsible Splitter control cannot have the Filled or None Dockstyle property"); }
//push our bitmap forward to the screen g.DrawImage(b, 0, 0);
bg.Dispose(); b.Dispose();
// dispose the Graphics object g.Dispose(); }
|
| Sign In·View Thread·PermaLink | 2.00/5 (1 vote) |
|
|
|
 |
|
|
 |
|
|
"It" itself doesn't collapse, rather it collapses the control you've specified in the ControlToHide property. In all other respects it works the same as the standard Splitter control. For more info read the article or the comments in the code.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
hanks for your reply,I'm really enjoying it but how come yuo didn't post the sample with it.I have got 2 questions:
1)how can I put the spliter on the other side of control like what you have done in your demo?Mine is always stuck to the edge of the form.
2)How can I adjust the height of control.
That's awesome man.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Hi there! I am using the collapsible splitter in combination with Weifen Lou´s DockPanelSuite. When I use the collapsibleSplitter with normal windows forms panels everything works perfect. As soon as I use a DockPanel instead of the normal Panel it appears that the splitter control is sometimes drawn, sometimes not drawn or sometimes partly drawn. Cause that phenomenon is only happening in combination with dockpanelsuite I guess it´s a problem of the dockpanelsuite.
Does anybody have a clue what the problem is about and do you know how to solve it or at least give me a hint?
thanks in advance,
rascreek
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
I have the same problem. I am not using the DockPanelSuite, however, my form is very heavily paneled. Have you found a solution since your post?
|
| Sign In·View Thread·PermaLink | 1.00/5 (1 vote) |
|
|
|
 |
|
|
I think the Panel controls just ignore the CollapsibleSplitter. I've cooked up a sample project that shows this behaviour. I've posted it at
http://www.vbrad.com/downloads/furty.zip
for the author to take a look at.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
| | |