C#-graphic-中在PictureBox上使用橡皮筋画线
c# 使用
2023-09-11 14:21:59 时间
想法是在原有图层上加上一个透明图层,在那上面画线段。
来获取两点位置和线段长度。
在winform项目中添加一个PictureBox控件,然后添加鼠标在PictureBox上的事件。
目前遇到了两个问题,
1.透明图层的添加,BufferedGraphics bg对象使用bg.Graphics.Clear(Color.Transparent);时背景为黑色,
如何设置透明色?
在网上看了许多,是用图像缓存技术来实现的。具体代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 橡皮技术3{
public partial class Form2 : Form{
//存放直线对象的集合
List<Line> lines = new List<Line>();
//起始点
Point mStartPoint = Point.Empty;
public Form2(){
InitializeComponent();
}
//在图片对象上点击时
private void pictureBox1_MouseDown(object sender, MouseEventArgs e){
if (e.Button == MouseButtons.Left)
{
//点击左键,存入起始点
mStartPoint = e.Location;
}
}
//在图片上移动时,绘制直线
private void pictureBox1_MouseMove(object sender, MouseEventArgs e){
if (e.Button==MouseButtons.Left&& mStartPoint!=null){
drawlines(pictureBox1.CreateGraphics(), mStartPoint, e.Location);//按住左键不放绘制
}
}
//在松开左键时,存储点击,需要判定有无起始点,每次绘制结束后都要清空起始点
private void pictureBox1_MouseUp(object sender, MouseEventArgs e){
if (!mStartPoint.IsEmpty){
Line line = new Line(mStartPoint, e.Location);
lines.Add(line);
mStartPoint = Point.Empty;
}
}
private void drawlines(Graphics g, Point mPoint1, Point mPoint2){
BufferedGraphicsContext context = BufferedGraphicsManager.Current;//开辟空间
BufferedGraphics bg = context.Allocate(g,new Rectangle(0,0,PictureBox1.Width,PictureBox1.Height));//开辟空间的大小
bg.Graphics.Clear(Color.White);
//在缓冲区上画线
foreach (Line line in lines) {
line.Draw(bg.Graphics);
}
//在缓存图层中画直线的样式,并没有实际显示,尽量与绘图的样式一致
bg.Graphics.DrawLine(SystemPens.ControlText, mPoint1, mPoint2);
bg.Render();
bg.Dispose();
bg = null;
}
//通过paint绘制
private void pictureBox1_Paint(object sender, PaintEventArgs e){
foreach (Line line in lines){
line.Draw(pictureBox1.CreateGraphics());
}
}
}
}
相关文章
- 用c# 开发html5的尝试,试用bridge.net
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
- C# 使用 GDI+ 给图片添加文字,并使文字自适应矩形区域 C# 使用 GDI+ 画图
- c#程序中使用"like“查询access数据库查询为空的问题
- [C#] 使用 Excel 和 Math.Net 进行曲线拟合和数据预测
- C#【中级篇】不同进制的数相互转换
- C#【多线程篇】线程池的使用与线程终止继续
- C#,图像二值化(18)——全局阈值的模糊集理论算法(Huang Thresholding)与源程序
- C#,数值计算,基础函数——任意位数π的数值算法源程序与数据可视化
- c#中的DefWndProc是Control类的虚函数
- C#/Sqlite-单机Window 程序 sqlite 数据库实现
- 《圣殿祭司的ASP.NET4.0专家技术手册》---- 1-14 项目同时使用C# 与VB语言及多组件的技巧
- C# !(null包容)运算符的使用
- C# 9.0语法新特性【废弃,自用,无参考价值】
- c# 抽象类与接口
- C# MVC 使用@Html.DropDownList和SelectList做下拉选项注意事项
- 【Unityc#专题篇】之c#基础篇
- 转一个 C#基础类库
- C#网络编程TCP通信实例程序简单设计