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

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja