效果图:

自定义控件实现代码:

 using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms; namespace WindowsFormsApplication1
{
[ToolboxBitmap(typeof(SplitContainer))]
public partial class SplitContainerEx : SplitContainer
{
#region Field /// <summary>
/// 控制器绘制区域
/// </summary>
private Rectangle ControlRect
{
get
{
var rect = new Rectangle(); if (Orientation == Orientation.Horizontal)
{
rect.X = Width <= ? : Width / - ;
rect.Y = SplitterDistance;
rect.Width = ;
rect.Height = ;
}
else
{
rect.X = SplitterDistance;
rect.Y = Height <= ? : Height / - ;
rect.Width = ;
rect.Height = ;
}
return rect;
}
} /// <summary>
/// 鼠标状态(进入或离开)
/// </summary>
private MouseState _mouseState = MouseState.Normal; /// <summary>
/// 定义折叠或展开的是哪一个面板
/// </summary>
private SplitterPanelEnum _collpaseOrExpandPanel; /// <summary>
/// Splitter是否固定
/// </summary>
private bool _isSplitterFixed = true; /// <summary>
/// 当前是否为折叠状态
/// </summary>
private bool _collpased; #endregion #region Property /// <summary>
/// 进行折叠或展开的SplitterPanel,设置为属性,所以可以在页面进行重新设置
/// </summary>
[DefaultValue(SplitterPanelEnum.Panel1)]
public SplitterPanelEnum CollpaseOrExpandPanel
{
get
{
return _collpaseOrExpandPanel;
}
set
{
if (value != _collpaseOrExpandPanel)
{
_collpaseOrExpandPanel = value;
Invalidate(ControlRect);
}
}
} /// <summary>
/// 设定Panel1是否为默认折叠
/// </summary>
private bool _panel1Collapsed;
[DefaultValue(false)]
public new bool Panel1Collapsed
{
get
{
return _panel1Collapsed;
}
set
{
//只有当CollpaseOrExpandPanel = Panel时,Panel1Collapsed的设置才会有效
if (CollpaseOrExpandPanel == SplitterPanelEnum.Panel1 && value != _panel1Collapsed)
{
_panel1Collapsed = value;
//设置_collpased值为value的相反值,再调用CollpaseOrExpand()进行折叠或展开.
_collpased = !value; CollpaseOrExpand();
}
}
} /// <summary>
/// 设置Panel2是否为默认折叠
/// </summary>
private bool _panel2Colapsed;
[DefaultValue(false)]
public new bool Panel2Collapsed
{
get
{
return _panel2Colapsed;
}
set
{
//只有当CollpaseOrExpandPanel = Pane2时,Panel1Collapsed的设置才会有效
if (CollpaseOrExpandPanel == SplitterPanelEnum.Panel2 && value != _panel2Colapsed)
{
_panel2Colapsed = value;
//设置_collpased值为value的相反值,再调用CollpaseOrExpand()进行折叠或展开
_collpased = !value; CollpaseOrExpand();
}
}
} /// <summary>
/// 用于固定保存显式设定的SplitterDistance,因为基类的SplitterDistance属性会变动
/// </summary>
public int DefaultSplitterDistance
{
get;
set;
} #endregion #region Ctor public SplitContainerEx()
{
SetStyle(
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true); Panel1MinSize = ;
Panel2MinSize = ;
} #endregion #region Override protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e); Color color = _mouseState == MouseState.Normal ? SystemColors.ButtonShadow : SystemColors.ControlDarkDark; //需要绘制的图片
Bitmap bmp = CreateControlImage(color); //对图片进行旋转
RotateFlip(bmp); //清除绘制区域
e.Graphics.SetClip(SplitterRectangle);
e.Graphics.Clear(BackColor);
//绘制
e.Graphics.DrawImage(bmp, ControlRect);
} protected override void OnMouseMove(MouseEventArgs e)
{
//鼠标在控制按钮区域
if (SplitterRectangle.Contains(e.Location))
{
if (ControlRect.Contains(e.Location))
{
//如果拆分器可移动,则鼠标在控制按钮范围内时临时关闭拆分器
if (!IsSplitterFixed)
{
IsSplitterFixed = true; _isSplitterFixed = false;
} Cursor = Cursors.Hand;
_mouseState = MouseState.Hover;
Invalidate(ControlRect);
}
else
{
//如果拆分器为临时关闭,则开启拆分器
if (!_isSplitterFixed)
{
IsSplitterFixed = false;
Cursor = Orientation == Orientation.Horizontal ? Cursors.HSplit : Cursors.VSplit;
}
else
{
Cursor = Cursors.Default;
}
_mouseState = MouseState.Normal;
Invalidate(ControlRect);
}
}
base.OnMouseMove(e);
} protected override void OnMouseLeave(EventArgs e)
{
Cursor = Cursors.Default; _mouseState = MouseState.Normal; Invalidate(ControlRect); base.OnMouseLeave(e);
} protected override void OnMouseClick(MouseEventArgs e)
{
if (ControlRect.Contains(e.Location))
{
CollpaseOrExpand();
} base.OnMouseClick(e);
} #endregion #region Method /// <summary>
/// 折叠或展开
/// 1.当当前状态为折叠状态时,则进行展开操作
/// 2.当当前状态为展开状态时,则进行折叠操作
/// </summary>
private void CollpaseOrExpand()
{
//当前为缩小状态,进行Expand操作
if (_collpased)
{
//展开
SplitterDistance = DefaultSplitterDistance;
}
//当前为伸展状态,进行Collpase操作
else
{
//折叠
if (_collpaseOrExpandPanel == SplitterPanelEnum.Panel1)
{
SplitterDistance = ;
}
else
{
if (Orientation == Orientation.Horizontal)
{
SplitterDistance = Height - ;
}
else
{
SplitterDistance = Width - ;
}
}
} _collpased = !_collpased; Invalidate(ControlRect); //局部刷新绘制
} /// <summary>
/// 需要绘制的用于折叠窗口的按钮样式
/// </summary>
/// <param name="color"></param>
/// <returns></returns>
private Bitmap CreateControlImage(Color color)
{
var bmp = new Bitmap(, );
for (int x = ; x <= ; x += )
{
for (int y = ; y <= ; y += )
{
bmp.SetPixel(x, y, color);
}
}
for (int x = ; x <= ; x += )
{
for (int y = ; y <= ; y += )
{
bmp.SetPixel(x, y, color);
}
} int k = ;
for (int y = ; y >= ; y--)
{
for (int x = + k; x <= - k; x++)
{
bmp.SetPixel(x, y, color);
}
k++;
} return bmp;
} private void RotateFlip(Bitmap bmp)
{
if (Orientation == Orientation.Horizontal)
{
if (_collpaseOrExpandPanel == SplitterPanelEnum.Panel1 && !_collpased ||
_collpaseOrExpandPanel == SplitterPanelEnum.Panel2 && _collpased)
{
bmp.RotateFlip(RotateFlipType.RotateNoneFlipX);
}
else
{
bmp.RotateFlip(RotateFlipType.Rotate180FlipX);
}
}
else
{
if (_collpaseOrExpandPanel == SplitterPanelEnum.Panel1 && !_collpased ||
_collpaseOrExpandPanel == SplitterPanelEnum.Panel2 && _collpased)
{
bmp.RotateFlip(RotateFlipType.Rotate90FlipX);
}
else
{
bmp.RotateFlip(RotateFlipType.Rotate270FlipX);
}
}
} #endregion #region Enums enum MouseState
{
/// <summary>
/// 正常
/// </summary>
Normal,
/// <summary>
/// 鼠标移入
/// </summary>
Hover
} public enum SplitterPanelEnum
{
Panel1,
Panel2
} #endregion
}
}

扩展SplitContainer控件的更多相关文章

  1. C#使用splitContainer控件制作收缩展开面板

    C#使用splitContainer控件制作收缩展开面板 原创 2011年07月19日 17:18:02 标签: c# / object / 扩展 / 测试 15690         最近对Squi ...

  2. 扩展GridView控件——为内容项添加拖放及分组功能

    引言 相信大家对GridView都不陌生,是非常有用的控件,用于平铺有序的显示多个内容项.打开任何WinRT应用或者是微软合作商的网站,都会在APP中发现GridView的使用.“Tiles”提供了一 ...

  3. 验证控件插图扩展控件ValidatorCalloutExtender(用于扩展验证控件)和TextBoxWatermarkExtender

    <asp:ScriptManager ID="ScriptManager1" runat="server">  </asp:ScriptMan ...

  4. 如何使用SplitContainer控件[转]

    原文地址:http://yinzhihua2008.blog.163.com/blog/static/794306720120511150457/ 在Windows资源管理器中,当把鼠标指针移动到Tr ...

  5. C#如何使用SplitContainer控件实现上下分隔

    C#如何使用SplitContainer控件实现上下分隔 Orientation 属性设置为Horizontal 完美世界 http://www.23cat.com/Contents_51864.ht ...

  6. 扩展GroupBox控件

    1.GroupBox的边框颜色可以自行设置: 2.GroupBox可以设置边框的为圆角: 3.设置GroupBox标题在控件中的位置. 4.设置GroupBox标题的字体和颜色. 具体实现步骤Pane ...

  7. 一个动态扩展表格控件列和行的 jQuery 插件

    一个动态扩展表格控件列和行的 jQuery 插件 不过这并不影响使用鸭! 看这里:https://github.com/zhuwansu/table-ext.js 一个简单的示范 html <t ...

  8. 扩展 easyui 控件系列:为datagrid 增加过滤行

    此功能还为真正完成,起到抛砖引玉的效果,发动大家的力量把这个功能完善起来,效果图如下: 基本上就是扩展了 datagrid.view 中的onAfterRender 这个事件,具体代码如下: $.ex ...

  9. MVC中使用HTML Helper类扩展HTML控件

    文章摘自:http://www.cnblogs.com/zhangziqiu/archive/2009/03/18/1415005.html MVC在view页面,经常需要用到很多封装好的HTML控件 ...

随机推荐

  1. idea自动生成testNG.xml

    下载插件  Create TestNG Xml  安装插件 重启后就可以生成testNG.xml,打开xml,ctrl + ALT + L,格式化一下

  2. VXLAN简介(摘抄)

    VXLAN简介 VXLAN:Virtual eXtensible Local Area Network的缩写,虚拟扩展局域网,现代数据中心的的一种网络虚拟化技术,即在传统的三层IP网络上虚拟出一张二层 ...

  3. linux shell 字符串常用操作

    1.shell内置的字符串操作 表达式 含义 ${#string} $string的长度 ${string:position} string中,从位置$position开始提取字符串 ${string ...

  4. MFC实现http连接、发送和接收数据

    #include <afxinet.h> // 设置超时 CInternetSession session; session.SetOption(INTERNET_OPTION_CONNE ...

  5. Java:break和continue关键字的作用

    二者的作用和区别 1. break:直接跳出当前循环体(while.for.do while)或程序块(switch).其中switch case执行时,一定会先进行匹配,匹配成功返回当前case的值 ...

  6. Python之celery

    一.celery简介 Celery是一个Python开发的异步分布式任务调度模块.celery本身不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbing, redis, ...

  7. atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?

    atomic不是绝对的线程安全.atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的 @property (atomic, assign) int intA; //线程A f ...

  8. 关于 NPOI 导出的 Excel 出现“部分内容有问题” 的解决方法

    近期发现使用 NPOI 导出的 Excel 文件,有部分用户反映在打开时报错,测试了一下,发现在低版本的 Office 中(2003版,配合2007格式兼容包)打开正常,但在高版本 Office 中, ...

  9. C语言灵魂--指针

    什么是指针?理解指针之前得知道什么是地址. 1.数据在计算机中的存储形式: 数据在计算机中是以二进制的形式存储的.计算机的存储器是用半导体集成电路构成的,有N多个二极管元件组成. 每一个二极管元件就如 ...

  10. cf#512 C. Vasya and Golden Ticket

    题目链接 http://codeforces.com/contest/1058/problem/C 这题还是暴力最方便,和的情况最多有n*a[i]  900种把每种都试一遍 #include<b ...