public class SplitContainerEx : SplitContainer
{
const int _SplitWide = 19;
const int _SplitHeight = _SplitWide * 3;
bool m_IsCollpase = false;
Rectangle rect = new Rectangle();
bool m_IsInRect = false;
int m_SplitLocate;
Bitmap m_bmp=null, m_bmpbck;
private bool IsInRect
{
get
{
return m_IsInRect;
}
set
{
if (value)
{//MoveEnter
this.Cursor = Cursors.Hand;
//prj.Win32.User32.SetCapture(this.Handle);
Capture = true;
}
else
{//MoveOut
this.Cursor = Cursors.Default;
//User32.ReleaseCapture();
Capture = false;
}
m_IsInRect = value;
}
}
public bool IsCollpase
{
get { return m_IsCollpase; }
set {
if (value)
{
m_SplitLocate = this.SplitterDistance;
this.SplitterDistance = Panel1MinSize;
}
else
{
this.SplitterDistance = m_SplitLocate;
}
m_IsCollpase = value;
RotateBmp();
}
}
new public Orientation Orientation
{
get { return base.Orientation; }
set
{
base.Orientation = value;
RotateBmp();
}
}
public SplitContainerEx()
{
this.SplitterWidth = 9;
this.Panel1MinSize = 0;
m_bmpbck = CreateCollapseImage();
RotateBmp();
}
protected override void Dispose(bool disposing)
{
if (m_bmp != null)
m_bmp.Dispose();
base.Dispose(disposing);
}
private void RotateBmp()
{
if (m_bmp != null)
m_bmp.Dispose();
m_bmp = (Bitmap)m_bmpbck.Clone();
if (this.Orientation == System.Windows.Forms.Orientation.Horizontal)
m_bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
if (m_IsCollpase)
m_bmp.RotateFlip(RotateFlipType.Rotate180FlipNone);
}
private void GetSplitBmpRect()
{
if (this.Orientation == Orientation.Vertical)
{
rect.X = this.SplitterDistance;
rect.Y = this.Height <= _SplitHeight ? 0 : (this.Height - _SplitHeight) / 2;
rect.Width = this.SplitterWidth;
rect.Height = this.SplitterWidth*3;
}
else
{
rect.X = this.Width <= _SplitHeight ? 0 : (this.Width - _SplitHeight) / 2;
rect.Y = this.SplitterDistance;
rect.Width = this.SplitterWidth*3;
rect.Height = this.SplitterWidth;
}
}
protected override void OnPaint(PaintEventArgs e)
{
GetSplitBmpRect();
e.Graphics.SetClip(rect);
e.Graphics.Clear(this.BackColor);
//绘制
GraphicsUnit unit = GraphicsUnit.Pixel;
e.Graphics.DrawImage(m_bmp, rect, m_bmp.GetBounds(ref unit), GraphicsUnit.Pixel);
base.OnPaint(e);
}
private bool MouseInRectBound(Point p)
{
if (rect.Contains(p))
{
if (!m_IsInRect)
IsInRect = true;
}
else if (m_IsInRect)
IsInRect = false;
return false;
}
protected override void OnMouseDown(MouseEventArgs e)
{
if (!rect.Contains(e.Location))
base.OnMouseDown(e);//把事件吃掉
}
protected override void OnMouseMove(MouseEventArgs e)
{
MouseInRectBound(e.Location);
base.OnMouseMove(e);
}
protected override void OnMouseClick(MouseEventArgs e)
{
if (rect.Contains(e.Location))
{
IsCollpase = !m_IsCollpase;
IsInRect = false;
return;
}
base.OnMouseClick(e);
}
private Bitmap CreateCollapseImage()
{
Bitmap bmp = new Bitmap(_SplitWide, _SplitHeight);
for (int i = 0; i < _SplitHeight - 5; i += 5)
{
for (int j = 0; j < _SplitWide - 3; j += 3)
{
bmp.SetPixel(j,i, Color.Black);
}
}
int p = (_SplitHeight - _SplitWide) / 2, q = p + _SplitWide;
using (Graphics dc = Graphics.FromImage(bmp))
{
Point point1 = new Point(0, p + _SplitWide / 2);
Point point2 = new Point(_SplitWide - 1, p);
Point point3 = new Point(_SplitWide - 1, q);
Point[] curvePoints = { point1, point2, point3 };
// Define fill mode.
System.Drawing.Drawing2D.FillMode newFillMode = System.Drawing.Drawing2D.FillMode.Winding;
dc.FillPolygon(Brushes.Black, curvePoints, newFillMode);
}
return bmp;
}
}