扩展SplitContainer控件
效果图:

自定义控件实现代码:
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控件的更多相关文章
- C#使用splitContainer控件制作收缩展开面板
C#使用splitContainer控件制作收缩展开面板 原创 2011年07月19日 17:18:02 标签: c# / object / 扩展 / 测试 15690 最近对Squi ...
- 扩展GridView控件——为内容项添加拖放及分组功能
引言 相信大家对GridView都不陌生,是非常有用的控件,用于平铺有序的显示多个内容项.打开任何WinRT应用或者是微软合作商的网站,都会在APP中发现GridView的使用.“Tiles”提供了一 ...
- 验证控件插图扩展控件ValidatorCalloutExtender(用于扩展验证控件)和TextBoxWatermarkExtender
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptMan ...
- 如何使用SplitContainer控件[转]
原文地址:http://yinzhihua2008.blog.163.com/blog/static/794306720120511150457/ 在Windows资源管理器中,当把鼠标指针移动到Tr ...
- C#如何使用SplitContainer控件实现上下分隔
C#如何使用SplitContainer控件实现上下分隔 Orientation 属性设置为Horizontal 完美世界 http://www.23cat.com/Contents_51864.ht ...
- 扩展GroupBox控件
1.GroupBox的边框颜色可以自行设置: 2.GroupBox可以设置边框的为圆角: 3.设置GroupBox标题在控件中的位置. 4.设置GroupBox标题的字体和颜色. 具体实现步骤Pane ...
- 一个动态扩展表格控件列和行的 jQuery 插件
一个动态扩展表格控件列和行的 jQuery 插件 不过这并不影响使用鸭! 看这里:https://github.com/zhuwansu/table-ext.js 一个简单的示范 html <t ...
- 扩展 easyui 控件系列:为datagrid 增加过滤行
此功能还为真正完成,起到抛砖引玉的效果,发动大家的力量把这个功能完善起来,效果图如下: 基本上就是扩展了 datagrid.view 中的onAfterRender 这个事件,具体代码如下: $.ex ...
- MVC中使用HTML Helper类扩展HTML控件
文章摘自:http://www.cnblogs.com/zhangziqiu/archive/2009/03/18/1415005.html MVC在view页面,经常需要用到很多封装好的HTML控件 ...
随机推荐
- linux 下安装 Cisco Packet Tracer 7.11以及一些注意
https://blog.csdn.net/qq_35882901/article/details/77652571 https://linux.cn/article-5576-1.html 开启登录 ...
- Go Web 问题集-持续更新
前端: 导入静态js,css报错,在确保js和css语法编写正确的前提下 GET 错误: 等问题 1.在服务器中运行:静态服务文件路径设置错误 2.本地运行:相对路径设置错误 3 ...
- Nodejs实战 —— 测试 Node 程序
读 <node.js实战2.0>,进行学习记录总结. 当当网购买链接 豆瓣网1.0链接 测试 Node 程序 本章内容 用 Node 的 assert 模块测试 使用其他断言库 使用 No ...
- 【8086汇编-Day8】实验九
Lab1 代码 ; 在屏幕上输出内存单元中的十进制两位数 assume cs:code, ds:data data segment db db , ; 前一个字节用于保存商,后一个字节用于保存余数 d ...
- Git使用规范(三)
今天我们来介绍一下Git的一些操作,这个里面主要是一些我们平时遇到的一些问题 1.当我进入了一个分支的是时候,我在查看git log的时候,为什么会有别人的信息,我一直以为 这个是查看分支提交情况, ...
- MYSQL和ORACLE的一些区别
有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORAC ...
- 毕业 迷茫 继续OR放弃?
终于还是回学校拿了毕业证书,请了两个小时的假,连同中午吃饭的时间,顺利地从班主任手中拿到了毕业证书,大学就这样结束啦,人生也来到了一个新的转折点,但是每天的每天,我都是异常迷茫,异常胆怯,异常无语. ...
- Hibernate怎么用
一.为什么用Hibernate? [核心:对象关系映射] Hibernate是对jdbc的轻量级封装,可以简化数据库连接操作, 在该框架之前,数据库的操作步骤是: 1.根据连接字串获取连接 2.执行s ...
- 北京优步UBER司机B组最新奖励政策、高峰翻倍奖励、行程奖励、金牌司机奖励【每周更新】
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 机器学习实战:KNN代码报错“AttributeError: 'dict' object has no attribute 'iteritems'”
报错代码: sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) 解决 ...