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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2