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("提示", "数据连接失败,请重试!", ...
随机推荐
- mysql 分页测试,
大环境:MySQL5.6 自己造了 27万数据, 一次性 查出来,会超时: 而分页跑,会查出来8s: 但是在少于27万时,直接查比 分页查快5倍:
- Java的接口和抽象类(转发:http://www.importnew.com/18780.html)
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- Jquery的parent和parents(找到某一特定的祖先元素)用法(转发:https://blog.csdn.net/cui_angel/article/details/7903704)
<!-- parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合. parents则是取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选. ...
- linux.1:创建分区和文件系统
概述 使用 fdisk.gdisk 和 parted 创建和修改 MBR 和 GPT 分区在本教程中,学习磁盘分区和 Linux 文件系统相关内容,包括学习如何: 使用 mkfs 命令设置 ext2. ...
- RLearning第1弹:初识R语言
R作为一种统计分析软件,是集统计分析与图形显示于一体的.体积小.开源.很强的互动性.自从学了R本人就很少再用matlab了... 一.R语言由函数和赋值构成. R使用<-(最好养成使用习惯),而 ...
- Python基础(2)_数字和字符串类型
一.数据类型 1.数字 整型 Python的整型相当于C中的long型,Python中的整数可以用十进制,八进制,十六进制表示. >>> --------->默认十进制 > ...
- HDU - 5550 Game Rooms 【DP+前缀和】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5550 题意 一撞大楼有N层楼,然后每层楼都有一部分人喜欢打羽毛球,一部分人喜欢打乒乓球 但是每层楼只能 ...
- 分布式数据库对比评测(Es,mongodb,redis)基础知识篇
前言 我建议大家看下这个,否则后面你不知道我在说什么. 1.ES数据库相关概念 啥是Es,说白了就是支持文档搜索的分布式数据库,专门方便搜索的,GITHUB京东现在都在用. 1.ES的数据库存放在哪里 ...
- [原创]java WEB学习笔记24:MVC案例完整实践(part 5)---删除操作的设计与实现
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- POJ 之 1002 :487-3279
487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 242418 Accepted: 42978 Descr ...