C#自定义控件 绘制框
上几张测试的 效果
虽然全是用.net 的绘图库画的,但是手动双缓冲,不会闪烁,感觉还不错,源码开放了,喜欢的拿去扩展吧;
用于撤销的存放图像的数据结构我设置为10个,怕是内存崩了,我看mspaint的内存占用一直很低啊,如有有比较棒的解决方案的话欢迎提出来分享分享
代码量短短300行
【2016.1.27】更新一下博文,因为扩展了一下,因为撤销功能放内存中实在是太耗资源了,我重新实现一种数据结构,这种数据结构同时兼容栈和队列的功能,栈大小固定,
压栈时会溢出,溢出的话从栈底抽走元素并返回,这样就可以在使用数据结构是把溢出的bitmap放到磁盘上
弹栈时如果有之前溢出的bitmap的话向栈底插入元素,把磁盘上的bitmap向栈底插入
这样的话控件既节省内存也不会因为磁盘的IO速度影响撤销功能导致界面卡顿
下面是这个数据结构的实现代码,为了节省代码,我不做成泛型了
//_____________________________________________________________________________ /*下面的stack and queue类是 * * 一个兼容栈和队列的数据结构 * 为了节省代码量,我没有设计成泛型 * 设计这个数据结构为了节省空间在保留内存 * 把纪录画纸保存在系统的临时目录下 * * * * */ /// <summary> /// 栈元素类 /// </summary> internal class TElement { public TElement prev; public Bitmap i; public TElement next; internal TElement(TElement prev, Bitmap i, TElement next) { this.i = (Bitmap)i.Clone(); this.prev = prev; this.next = next; } } internal class stack_and_queue { internal int size; ; ; private TElement head = null; private TElement tail = null; public stack_and_queue(int size) { ) size = ; this.size = size; } /// <summary> /// 压栈画纸 /// </summary> /// <param name="x"></param> /// <returns></returns> public Bitmap Push(Bitmap x) { if (x == null) return null; TElement t = new TElement(tail, x, null); if (head == null) { head = t; tail = t; allcount++; count++; return null; } else { tail.next = t; tail = t; allcount++; count++; if (allcount > size) { Bitmap temp = head.i; head.next.prev = null; head = head.next; count--; return temp; } } return null; } /// <summary> /// 弹栈画纸 /// </summary> /// <param name="t"></param> /// <returns></returns> public Bitmap Pop(Bitmap t) { if (tail == null) return null; Bitmap temp = tail.i; if (head == tail) { head = tail = null; allcount--; count--; } else { tail = tail.prev; tail.next = null; allcount--; count--; if (t != null) { TElement tnew = new TElement(null, t, head); head.prev = tnew; head = tnew; count++; } } return temp; } /// <summary> /// 清空栈 /// </summary> internal void clear() { TElement temp = head; while (temp != null) { temp = head.next; head.prev = null; head.next = null; head.i.Dispose(); } head = null; tail = null; } }
这个是没有使用stack_and_queue数据结构实现撤销功能的控件的内存占用
下面这个是使用stack_and_queue数据结构的,在画的多的情况下内存占用依然比较低,栈的大小我设置为3
注明一下:
【里面的一个 把bitmap加载到内存,保证不占用文件的FileToBitmap方法的代码我是copy别人的
原帖地址http://blog.csdn.net/rztyfx/article/details/46674543
】
源码地址:http://pan.baidu.com/s/1eRwcflw
cs文件是控件源码
压缩文件是测试控件的demo文件
C#自定义控件 绘制框的更多相关文章
- (十六)c#Winform自定义控件-文本框哪里去了?-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- (六)c#Winform自定义控件-单选框
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (二十八)c#Winform自定义控件-文本框(一)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (二十九)c#Winform自定义控件-文本框(二)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (三十)c#Winform自定义控件-文本框(三)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (三十一)c#Winform自定义控件-文本框(四)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (十八)c#Winform自定义控件-提示框
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (八十二)c#Winform自定义控件-穿梭框
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- c# 自定义控件-提示框(弹框)
分带取消按钮和不带取消按钮的 调用方法: frmMessageBox frm = new frmMessageBox("提示", "数据连接失败,请重试!", ...
随机推荐
- SpringBoot学习笔记(3):静态资源处理
SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...
- Kattis - fairdivision 【贪心】
题意 有一堆人 要给他们的朋友 买一个生日礼物,然后 每个人 给出自己的最大负担额度 并且给出礼物总价 然后要给出一种解决方案 尽量让 所有人的支出都接近平均,如果实在无法平均,那就让 先来的人 多处 ...
- python的property属性
最近看书中关于Python的property()内建函数属性内容时<python核心编程>解释的生僻难懂,但在网上看到了一篇关于property属性非常好的译文介绍. http://pyt ...
- 尽量不要在viewWillDisappear:方法中移除通知
1.iOS7新增加了导航控制器侧滑手势,当触发侧滑返回时,会调用系统的viewWillDisappear:方法,取消侧滑返回时又会调用viewWillAppear:方法. 2.在做手势和通知等一系 ...
- [原创] Windows下Eclipse连接hadoop
1 下载hadoop-eclipse-plugin :我用的是hadoop-eclipse-plugin1.2.1 ,百度自行下载 2 配置插件:将下载的插件解压,把插件放到..\eclipse\pl ...
- poj 1426 Find The Multiple 搜索进阶-暑假集训
E - Find The Multiple Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I6 ...
- EntityFramework 学习 一 Explicit Loading with DBContext
即使延迟加载不能使用,也可以通过明确的调用来延迟加载相关实体 使用DBEntryEntity来完成 using (var context = new SchoolDBEntities()) { //D ...
- Linux虚拟机桥接网络
1.虚拟机网络设置为“桥接” 2.查看本机IP.Gateway.DNS 3.vi /etc/sysconfig/network-scripts/ifcfg-eth0,ONBOOT=“NO”改为“YES ...
- Selenium-元素定位与操作
UI的自动化本质就是识别元素,操作元素,而元素的识别就是通过HTML的标签和属性,所以对于基本的HTML的只是是必备的 随着页面复杂度的提升,加之很多公司的开发也没有统一规范,这就给识别元素造成了非常 ...
- Java微信开发_Exception_03_非微信官方网页-invalid signature
由于natapp免费隧道的域名是系统随机分配的,老是在变.故昨天又换了内网映射工具,分别换了ngrok和花生壳,然而在做JSSDK网页开发时,按了微信的view菜单按钮进行页面跳转时,微信官方提示“非 ...