C# winform开发:Graphics、pictureBox同时画多个矩形
C#的System.Drawing 命名空间提供了对 GDI+ 基本图形功能的访问
重点在于获取Graphics对象,例如:
Graphics g = panel1.CreateGraphics
事实上CreateGraphics继承自Control, 即基本每一种控件都有这个方法
Control.CreateGraphics
在pannel、form上画图都一样,这里以pictureBox为例。DrawRectangle函数为例画矩形,其他形状不在这里考虑,自己尝试很简单
画圆是画椭圆,只需g.DrawEllipse后两个int参数width,height要设置相等,同时前两个int参数并不是圆心而是左上角的坐标,没有自带的circle函数只能自己封装
回到正题:
网上给的都是MouseDown MouseMove MouseUp Paint事件相关的代码,非常的简单。
using System.Drawing; bool bDrawStart = false; Point pointStart = Point.Empty; Point pointContinue = Point.Empty; private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (bDrawStart) { bDrawStart = false; } else { bDrawStart = true; pointStart = e.Location; } } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (bDrawStart) { pointContinue = e.Location; Refresh(); } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if (bDrawStart) { dicPoints.Add(pointStart, pointContinue); } bDrawStart = false; } private void pictureBox1_Paint(object sender, PaintEventArgs e) { if (bDrawStart) { //实时的画矩形 Graphics g = e.Graphics; g.DrawRectangle(pen, pointStart.X, pointStart.Y, pointContinue.X -pointStart.X, pointContinue.Y - pointStart.Y); } pen.Dispose(); }
用完就发现很明显的问题了,一次只能画一个图形
如何才能一次画多个呢?不少都说的重写Paint事件,override之类的函数,多麻烦。
试验修改Paint事件代码即可,定义一个字典表记录画过的矩形(根据对角两个点确定一个矩形,对应字典表的key, value,不考虑矩形相交重叠之类的情况),如下:
Dictionary<Point, Point> dicPoints = new Dictionary<Point, Point>(); private void pictureBox1_Paint(object sender, PaintEventArgs e) { System.Drawing.Pen pen = new System.Drawing.Pen(Color.LimeGreen); pen.Width = ; if (bDrawStart) { //实时的画矩形 Graphics g = e.Graphics; g.DrawRectangle(pen, pointStart.X, pointStart.Y, pointContinue.X - pointStart.X, pointContinue.Y -pointStart.Y); } //实时的画之前已经画好的矩形 foreach (var item in dicPoints) { Point p1 = item.Key; Point p2 = item.Value; e.Graphics.DrawRectangle(pen, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y); } pen.Dispose(); }
C# winform开发:Graphics、pictureBox同时画多个矩形的更多相关文章
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇二:WinForm开发扇形图统计和Excel数据导出
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
- C# WinForm开发系列 - GDI+【转】
http://blog.csdn.net/blue_sky6/article/details/53811435?locationNum=6&fps=1 C# WinForm开发系列 - GDI ...
- 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序
直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...
- 基于BindingSource的WinForm开发
BindingSource控件介绍 BindingSource控件介绍 BindingSource控件是.NET Framework 2.0提供的新控件之一.BindingSource控件与数据源建立 ...
- Java进击C#——应用开发之WinForm开发
本章简言 上一章笔者介绍了关于WinForm环境.这一章笔者将继续讲WinForm.只不过更加的面向开发了.事实就是在学习工具箱里面的控件.对于WinForm开发来讲,企业对他的要求并没有那么高.但是 ...
- WinForm开发-界面控件到实体,实体到界面控件自动绑定
在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...
- WPF与WinForm开发有什么区别?
转自http://hi.baidu.com/leoliu83/blog/item/1d1a4a66dcb41134aa184cfd.html WPF开发于WinForm之后,从技术发展的角度,WPF比 ...
- 在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储
在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如 ...
随机推荐
- 初探ansible安装
一.ansible介绍常用的自动化运维工具 Puppet —基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱SaltStack —基于 Python 开发,采用 ...
- 带你一步步的了解“C#事件”机制
是什么 本文讨论类型中定义的最后一种成员:事件 定义了时间成员的类型允许类型通知其他对象发生了特定的事情. 具体的说,定义了时间成员的类型能提供以下功能: 方法能登记它对事件的关注 方法能注销它对事件 ...
- ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper的解决办法
如下图: 如果出现了这样的错误,最大的可能是:你没有在 WEB-INF/lib 目录下放入相关的jar包(jackson-core/annotations/databind.jar) 如果你在WEB- ...
- 问题解决——MFC Ribbon 添加图标
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- 把Tomcat注册为windows服务
配置环境变量 JAVA_HOME=D:\java CLASSPATH=.;%JAVA_HOME%\lib; PATH=%JAVA_HOME%\bin; 提示:一般jre默认在jdk目录下%JAVA_H ...
- 【转】jquery 中scrollTop在Firefox下不起作用
原文链接:http://stackoverflow.com/questions/8149155/animate-scrolltop-not-working-in-firefox Animate scr ...
- 基本shell编程【2】-服务端发布脚本
set -x deployBase="/var/lib/tomcat7/webapps" bakBase="/root/bak" echo "auto ...
- 编码中的setCharacterEncoding 理解
1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType="text/html;charset=UT ...
- Eclipse InstaSearch搜索词法 (很多并不支持)
1. 中文翻译 http://www.cnblogs.com/xing901022/p/4974977.html 2. 英文原文 http://lucene.apache.org/core/3_0_3 ...
- 字符加密Cipher(bzoj 1031)
Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...