Files
archived-dockpanelsuite/WinFormsUI/Docking/VS2012LightAutoHideWindowControl.cs
2013-08-03 13:17:24 +08:00

144 lines
5.2 KiB
C#

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace WeifenLuo.WinFormsUI.Docking
{
internal class VS2012LightAutoHideWindowControl : DockPanel.AutoHideWindowControl
{
private class VS2012LightAutoHideWindowSplitterControl : SplitterBase
{
private static readonly SolidBrush _horizontalBrush = new SolidBrush(Color.FromArgb(0xFF, 204, 206, 219));
private static readonly Color[] _verticalSurroundColors = new[] { SystemColors.Control };
public VS2012LightAutoHideWindowSplitterControl(DockPanel.AutoHideWindowControl autoHideWindow)
{
AutoHideWindow = autoHideWindow;
}
private DockPanel.AutoHideWindowControl AutoHideWindow { get; set; }
protected override int SplitterSize
{
get { return Measures.SplitterSize; }
}
protected override void StartDrag()
{
AutoHideWindow.DockPanel.BeginDrag(AutoHideWindow, AutoHideWindow.RectangleToScreen(Bounds));
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Rectangle rect = ClientRectangle;
if (rect.Width <= 0 || rect.Height <= 0)
return;
switch (AutoHideWindow.DockState)
{
case DockState.DockRightAutoHide:
case DockState.DockLeftAutoHide:
{
using (var path = new GraphicsPath())
{
path.AddRectangle(rect);
using (var brush = new PathGradientBrush(path)
{
CenterColor = Color.FromArgb(0xFF, 204, 206, 219), SurroundColors = _verticalSurroundColors
})
{
e.Graphics.FillRectangle(brush, rect.X + Measures.SplitterSize / 2 - 1, rect.Y,
Measures.SplitterSize / 3, rect.Height);
}
}
}
break;
case DockState.DockBottomAutoHide:
case DockState.DockTopAutoHide:
{
e.Graphics.FillRectangle(_horizontalBrush, rect.X, rect.Y,
rect.Width, Measures.SplitterSize);
}
break;
}
}
}
public VS2012LightAutoHideWindowControl(DockPanel dockPanel) : base(dockPanel)
{
m_splitter = new VS2012LightAutoHideWindowSplitterControl(this);
Controls.Add(m_splitter);
}
protected override Rectangle DisplayingRectangle
{
get
{
Rectangle rect = ClientRectangle;
// exclude the border and the splitter
if (DockState == DockState.DockBottomAutoHide)
{
rect.Y += Measures.SplitterSize;
rect.Height -= Measures.SplitterSize;
}
else if (DockState == DockState.DockRightAutoHide)
{
rect.X += Measures.SplitterSize;
rect.Width -= Measures.SplitterSize;
}
else if (DockState == DockState.DockTopAutoHide)
rect.Height -= Measures.SplitterSize;
else if (DockState == DockState.DockLeftAutoHide)
rect.Width -= Measures.SplitterSize;
return rect;
}
}
protected override void OnLayout(LayoutEventArgs levent)
{
DockPadding.All = 0;
if (DockState == DockState.DockLeftAutoHide)
{
//DockPadding.Right = 2;
m_splitter.Dock = DockStyle.Right;
}
else if (DockState == DockState.DockRightAutoHide)
{
//DockPadding.Left = 2;
m_splitter.Dock = DockStyle.Left;
}
else if (DockState == DockState.DockTopAutoHide)
{
//DockPadding.Bottom = 2;
m_splitter.Dock = DockStyle.Bottom;
}
else if (DockState == DockState.DockBottomAutoHide)
{
//DockPadding.Top = 2;
m_splitter.Dock = DockStyle.Top;
}
Rectangle rectDisplaying = DisplayingRectangle;
Rectangle rectHidden = new Rectangle(-rectDisplaying.Width, rectDisplaying.Y, rectDisplaying.Width, rectDisplaying.Height);
foreach (Control c in Controls)
{
DockPane pane = c as DockPane;
if (pane == null)
continue;
if (pane == ActivePane)
pane.Bounds = rectDisplaying;
else
pane.Bounds = rectHidden;
}
base.OnLayout(levent);
}
}
}