Winform 实现GridControl拖拽行,根据编号生成二维码,并绘制到PictureEdit控件上

本文主要是介绍Winform 实现GridControl拖拽行,根据编号生成二维码,并绘制到PictureEdit控件上,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实际效果如下:

实现思路:可以参考本链接

注:AForge库实现摄像头的打开和拍照功能,使用方法自行百度,下面有使用源码

实现源码如下:

private VideoCaptureDevice videoSource;
private FilterInfoCollection videoDevices;
private delegate void UpdateUI();Point mouseDownPoint = new Point(); //记录拖拽过程鼠标位置//第几个二维码
int mapIndex = 0;
Image[] images = new Image[10];
Image[] cancelIages = new Image[10];
Image picImage;//实现拖拽
DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo m_DownHitInfo_TuXing = null;//容器布局事件
private void BtnLayout_Click(object sender, EventArgs e)
{if (videoSource == null){videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);if (videoDevices.Count == 0)throw new ApplicationException();videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);videoSource.VideoResolution = videoSource.VideoCapabilities[0];}videoSource.NewFrame += new NewFrameEventHandler(videoSourceOne_NewFrame);videoSource.Start();
}
void videoSourceOne_NewFrame(object sender, NewFrameEventArgs eventArgs)
{if (IsClose)return;try{Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();fun(bitmap, picLayout );}catch (Exception ex){MessageBox.Show("保存图像失败!");}
}
private void fun(Bitmap img,PictureEdit pic)
{if (pic.InvokeRequired){UpdateUI update = delegate { pic.Image = img; };pic.Invoke(update);}elsepic.Image = img;
}
//拍照事件
private void BtnPic_Click(object sender, EventArgs e)
{mapIndex = 0;cancelIages[mapIndex] = picLayout.Image;images[mapIndex] = picLayout.Image;picImage = picLayout.Image;CloseVideoSource();
}
//释放
private void CloseVideoSource()
{if (!(videoSource == null))if (videoSource.IsRunning){videoSource.SignalToStop();videoSource = null;}
}
//拖拽数据行
private void Gv_MouseDown(object sender, MouseEventArgs e){DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hi = this.gv.CalcHitInfo(new Point(e.X, e.Y));int iMouseRowHandle = hi.RowHandle;if (iMouseRowHandle >= 0 && e.Button == MouseButtons.Left){m_DownHitInfo_TuXing = hi;}}
private void Gv_MouseMove(object sender, MouseEventArgs e){GridView view = sender as GridView;if (e.Button == MouseButtons.Left && m_DownHitInfo_TuXing != null){Size dragSize = SystemInformation.DragSize;Rectangle dragRect = new Rectangle(new Point(m_DownHitInfo_TuXing.HitPoint.X - dragSize.Width / 2, m_DownHitInfo_TuXing.HitPoint.Y - dragSize.Height / 2), dragSize);//当鼠标离开原来的控件区域之后才显示拖拽效果  if (!dragRect.Contains(new Point(e.X, e.Y))){DataRow row = view.GetDataRow(m_DownHitInfo_TuXing.RowHandle);Model.DragDropData modelData = new Model.DragDropData();modelData.Sender = gc;modelData.Data = row;view.GridControl.DoDragDrop(modelData, DragDropEffects.Move);m_DownHitInfo_TuXing = null;DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;}}}
namespace WinFormProgramUI.Layer.Model
{public class DragDropData{public System.Windows.Forms.Control Sender { get; set; }public object Data { get; set; }}
}
//完成拖拽,合成图片private void PicLayout_DragDrop(object sender, DragEventArgs e){try{tmr_DragDrop.Stop();Model.DragDropData modelData = (Model.DragDropData)e.Data.GetData(typeof(Model.DragDropData));switch (modelData.Sender.Name){case "gc"://插入图形  string strImageID = ((DataRow)modelData.Data)["FES003"].ToString();mapIndex++;images[mapIndex] = QRCodeHelper.GenerricCode(strImageID);Point pMouse = Cursor.Position;Point pEMR_Edit = this.picLayout.PointToScreen(picLayout.Location);mouseDownPoint = new Point(pMouse.X - pEMR_Edit.X, pMouse.Y - pEMR_Edit.Y);Bitmap bmp = new Bitmap(picLayout.Image, picLayout.ClientRectangle.Width, picLayout.ClientRectangle.Height);Graphics graphics = Graphics.FromImage(bmp);graphics.DrawImage(images[mapIndex], new Point(mouseDownPoint.X - 50, mouseDownPoint.Y - 50));graphics.Dispose();picLayout.Image = bmp;cancelIages[mapIndex] = picLayout.Image;break;default:break;}}catch (Exception ex){XtraMessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);}finally{}}
private void PicLayout_DragOver(object sender, DragEventArgs e){picLayout.Select();if (e.Data.GetDataPresent(typeof(Model.DragDropData)))e.Effect = DragDropEffects.Move;elsee.Effect = DragDropEffects.None;}
//生成二维码
public class QRCodeHelper{/// <summary>/// 生成二维码/// </summary>/// <param name="url"></param>/// <param name="pixel"></param>/// <returns></returns>private static string GetQRCode(string url, int pixel){var imgType = Base64QRCode.ImageType.Jpeg;QRCodeGenerator qrGenerator = new QRCodeGenerator();QRCodeData qrCodeData = qrGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.Q);Base64QRCode qrCode = new Base64QRCode(qrCodeData);string qrCodeImageAsBase64 = qrCode.GetGraphic(pixel, Color.Black, Color.White, true, imgType);return qrCodeImageAsBase64;}/// <summary>/// 将Base64字符串转换为Image对象/// </summary>/// <param name="base64Str">base64字符串</param>/// <returns></returns>private static Bitmap Base64StrToImage(string base64Str){Bitmap bitmap = null;try{byte[] arr = Convert.FromBase64String(base64Str);MemoryStream ms = new MemoryStream(arr);Bitmap bmp = new Bitmap(ms);ms.Close();bitmap = bmp;}catch (Exception ex){}return bitmap;}/// <summary>/// 通过字符串生成二维码图片/// </summary>/// <param name="code"></param>/// <returns></returns>public static Image GenerricCode(string code){string base64str = GetQRCode(code, 100);Bitmap bitmap = Base64StrToImage(base64str);return bitmap.GetThumbnailImage(100, 100, null, IntPtr.Zero);}}
//回撤mapIndex--;if (mapIndex > -1){images[mapIndex] = cancelIages[mapIndex];picLayout.Image = cancelIages[mapIndex];}elsemapIndex = 0;

 

这篇关于Winform 实现GridControl拖拽行,根据编号生成二维码,并绘制到PictureEdit控件上的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073540

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

以canvas方式绘制粒子背景效果,感觉还可以

这个是看到项目中别人写好的,感觉这种写法效果还可以,就存留记录下 就是这种的背景效果。如果想改背景颜色可以通过canvas.js文件中的fillStyle值改。 附上demo下载地址。 https://download.csdn.net/download/u012138137/11249872