using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Drawing.Drawing2D;
namespace KRT.Component.Common
{
///
/// 停靠面板控件
///
public class DockPanel : Panel
{
///
/// 关闭按钮
///
DockPanelCloseButton closeButton = new DockPanelCloseButton();
///
/// 浮动窗口
///
Form flowForm = new Form();
///
/// 分割栏
///
Splitter splitter = new Splitter();
///
/// 标题栏
///
Label titleBar = new Label();
///
/// 标题栏背景色
///
public Color TitleBackColor //using System.Drawing;
{
get { return titleBar.BackColor; }
set
{
titleBar.BackColor = value;
closeButton.BackColor = value;
}
}
///
/// 标题栏前景色
///
public Color TitleForeColor
{
get { return titleBar.ForeColor; }
set { titleBar.ForeColor = value; }
}
///
/// 标题栏文本
///
[Localizable(true)]
public string TitleText
{
get { return titleBar.Text; }
set { titleBar.Text = value; }
}
///
/// 标题栏可见
///
public bool TitleVisible
{
get { return titleBar.Visible; }
set
{
titleBar.Visible = value;
closeButton.Visible = value;
}
}
///
/// 浮动窗口最大尺寸
///
Size flowFormMaxSize = new Size(640, 480);
public Size FlowFormMaxSize
{
get { return flowFormMaxSize; }
set
{
flowFormMaxSize = value;
if (this.VisibleAll)
{
flowForm.Size = flowFormMaxSize;
}
}
}
///
/// 整个控件的隐藏、显示,包括浮动窗口状态下
///
bool visibleAll = true;
public bool VisibleAll
{
get { return visibleAll; }
set
{
visibleAll = value;
if (flowForm.Controls.Count > 0)
{
flowForm.Visible = visibleAll;
}
else
{
this.Visible = visibleAll;
}
}
}
///
/// 控件初始化
///
public DockPanel()
{
//InitializeComponent();
flowForm.ShowInTaskbar = false;
// 关闭按钮
closeButton.Location = new System.Drawing.Point(0, 0);
closeButton.Name = "Close";
closeButton.Size = new System.Drawing.Size(16, 16);
closeButton.TabIndex = 0;
closeButton.BackColor = SystemColors.ControlDark;
closeButton.Click += new EventHandler(closeButton_Click);
// 浮动窗口
flowForm.FormBorderStyle = FormBorderStyle.SizableToolWindow; //VS2008自带的窗体设计器进行设置窗体的边框。
flowForm.ShowInTaskbar = false; //任务栏
flowForm.MaximizeBox = false; //最大化按钮
flowForm.Move += new EventHandler(flowForm_Move); //EventHandler是asp.net内置的委托,事件是特殊的委托。
flowForm.MouseCaptureChanged += new EventHandler(flowForm_MouseCaptureChanged); //
flowForm.FormClosing += new FormClosingEventHandler(flowForm_FormClosing);
// 标题栏
titleBar.AutoSize = false; //自动调整大小
titleBar.Dock = DockStyle.Top;//控件顶端;DockStyle是个枚举,有none, top, bottom...
titleBar.Height = 18;
titleBar.Padding = new Padding(3);
titleBar.MouseDown += new MouseEventHandler(titleBar_MouseDown);
titleBar.MouseMove += new MouseEventHandler(titleBar_MouseMove);
titleBar.MouseUp += new MouseEventHandler(titleBar_MouseUp);
//this.Padding = new Padding(1);
this.Controls.Add(closeButton);
this.Controls.Add(titleBar);
this.ParentChanged += new EventHandler(DockPanel_ParentChanged);
this.VisibleChanged += new EventHandler(DockPanel_VisibleChanged);
this.MouseDown += new MouseEventHandler(titleBar_MouseDown);
this.MouseMove += new MouseEventHandler(titleBar_MouseMove);
this.MouseUp += new MouseEventHandler(titleBar_MouseUp);
this.ControlAdded += new ControlEventHandler(DockPanel_ControlAdded);
}
///
/// 如果是用户单击浮动窗口的关闭按钮,隐藏浮动窗口
///
///
///
void flowForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
flowForm.Visible = false;
visibleAll = false;
closeButton_Click(sender, e);
}
}
///
/// 添加子控件时调整顺序
///
///
///
void DockPanel_ControlAdded(object sender, ControlEventArgs e)
{
if (e.Control != titleBar && e.Control != closeButton)
{
e.Control.BringToFront();
}
}
///
/// 同时修改Splitter的可视效果
///
///
///
void DockPanel_VisibleChanged(object sender, EventArgs e)
{
splitter.Visible = Visible;
if (this.Parent != null && Visible)
{
if (!this.DesignMode)
{
if (this.Parent.Controls.IndexOf(splitter) < 0)
{
//splitter.Dock = this.Dock;
//this.Parent.Controls.AddRange(new Control[] { splitter, this });
this.Parent.Controls.Add(splitter);
int index = this.Parent.Controls.IndexOf(this);
this.Parent.Controls.SetChildIndex(splitter, index);
//this.Parent.Controls.SetChildIndex(this, index + 1);
//foreach (Control item in this.Parent.Controls)
//{
// Debug.WriteLine(
// this.Parent.Controls.GetChildIndex(item).ToString() + " : " +
// item.ToString());
//}
}
}
}
}
///
/// 初始化Splitter
///
///
///
void DockPanel_ParentChanged(object sender, EventArgs e)
{
//if (this.Parent != null)
//{
// if (!this.DesignMode)
// {
// //Parent.Controls.Add(splitter);
// splitter.Dock = this.Dock;
// this.Parent.Controls.AddRange(new Control[] { splitter, this });
// }
//}
}
///
/// 关闭事件
///
public event EventHandler CloseButtonClick;
///
/// 单击关闭按钮,触发关闭事件
///
///
///
void closeButton_Click(object sender, EventArgs e)
{
VisibleAll = false;
if (null != CloseButtonClick)
{
CloseButtonClick(sender, e);
}
}
///
/// 浮动窗口开始拖动时触发
///
///
///
void flowForm_MouseCaptureChanged(object sender, EventArgs e)
{
if (!flowFormCapture)
{
flowFormCapture = true;
}
else
{
flowFormCapture = false;
flowFormDock = true;
}
}
bool flowFormDock = false; // 浮动窗口可以被停靠
bool flowFormCapture = false; // 浮动窗口开始拖动
///
/// 浮动窗口移动过程
///
///
///
void flowForm_Move(object sender, EventArgs e)
{
if (flowFormDock)
{
flowFormDock = false;
switch (this.Dock)
{
case DockStyle.Left:
if (flowForm.Location.X < Parent.Location.X)
{
ShowDockPanel();
}
break;
case DockStyle.Top:
if (flowForm.Location.Y
Parent.Location.X + Parent.Width)
{
ShowDockPanel();
}
break;
case DockStyle.Bottom:
if (flowForm.Location.Y + flowForm.Height >
Parent.Location.Y + Parent.Height)
{
ShowDockPanel();
}
break;
}
}
}
///
/// 控件尺寸改变
///
///
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
closeButton.Location = new Point(
ClientRectangle.Right - closeButton.Width - 1, 1);
closeButton.Refresh();
}
Point oldMouseLocation; // 鼠标位置
Rectangle rect; // 面板区域
bool mouseDown = false; // 鼠标按下
///
/// 鼠标按下事件
///
///
///
void titleBar_MouseDown(object sender, MouseEventArgs e)
{
if (this.Dock != DockStyle.None && this.Dock != DockStyle.Fill)
{
oldMouseLocation = e.Location;
mouseDown = true;
rect = this.RectangleToScreen(ClientRectangle);
ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Thick);
}
}
///
/// 鼠标移动事件
///
///
///
void titleBar_MouseMove(object sender, MouseEventArgs e)
{
if (mouseDown)
{
ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Thick);
rect.Offset(e.X - oldMouseLocation.X, e.Y - oldMouseLocation.Y);
oldMouseLocation = e.Location;
ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Thick);
}
}
///
/// 鼠标弹起事件
///
///
///
void titleBar_MouseUp(object sender, MouseEventArgs e)
{
if (mouseDown)
{
mouseDown = false;
ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Thick);
Rectangle rc = this.RectangleToScreen(ClientRectangle);
Point pt = this.PointToScreen(e.Location);
if (!rc.Contains(pt))
{
ShowFlowForm();
}
}
}
//protected override void OnPaint(PaintEventArgs e)
//{
// base.OnPaint(e);
// Pen borderPen = new Pen(borderColor);
// Rectangle rc = new Rectangle(
// e.ClipRectangle.Left, e.ClipRectangle.Top,
// e.ClipRectangle.Right - 1, e.ClipRectangle.Bottom - 1);
// e.Graphics.DrawRectangle(borderPen, rc);
//}
///
/// 显示浮动窗口
///
void ShowFlowForm()
{
flowForm.Show(Parent);
flowForm.Location = new Point(rect.Left, rect.Top);
Size newSize = new Size(rect.Width, rect.Height);
if (newSize.Width > FlowFormMaxSize.Width)
{
newSize.Width = FlowFormMaxSize.Width;
}
newSize.Height = newSize.Height +
(this.TitleVisible ?
SystemInformation.CaptionHeight - this.titleBar.Height :
SystemInformation.CaptionHeight);
if (newSize.Height > FlowFormMaxSize.Height)
{
newSize.Height = FlowFormMaxSize.Height;
}
flowForm.Size = newSize;
flowForm.Text = TitleText;
while (this.Controls.Count > 2)
{
for (int i = 0; i < this.Controls.Count; i++)
{
if (this.Controls[i] != closeButton && this.Controls[i] != titleBar)
{
flowForm.Controls.Add(this.Controls[i]);
break;
}
}
}
this.Visible = false;
}
///
/// 显示停靠面板
///
void ShowDockPanel()
{
this.Visible = true;
while (flowForm.Controls.Count > 0)
{
this.Controls.Add(flowForm.Controls[0]);
}
flowForm.Hide();
}
}
}