本文主要是介绍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控件上的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!