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);
        }
    else
        pic.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;
            else
                e.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];
     }
 else
    mapIndex = 0;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值