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++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S