最近在做一个电子档案管理的项目。现在还处于初期,只是做一个简单demo拿去跟客户演示。至于最后谈不谈得下来,到底做不做,反正我是不看好,但没因为这样就马马虎虎、草草了事。这个项目算是b/s加c/s混合体,现在已经做的应该占六七成吧,算个半成品。

开侃了。

一直以来都是做web开发,winform完全小白一个,可能连入门都算不上。可该做的还是得做呀。先描述下这项目吧。在对方现有web系统中嵌入activex,做身份证扫描、电子签名及拍照,然后上传服务器(对方可能要提供基本数据接口合成一条记录)保存,最后就是随时查看这些电子档了,出了纠纷可以做了依据。

设备、身份证扫描、拍片这都有第三方提供了,听起来似乎没什么要做的了。这里不得不报怨下,一些公司项目、技术文档管理很稀乱。给的库在我这死都运行不起来,跟他们技术谈,结果是给的库是老版本,害我折腾那么久。

如何写activex就不说了,网上大把的资料,我不想重复添加像垃圾。说说遇到的些问题,可能对你来说是小意思,那请绕行去看更有价值的东西。要学的东西太多,学也学不完,我是很有压力。

一、Dictionary作为数据源绑定到ComboBox(其它类似)

View Code

1             Dictionary<string,int>  resolutionList=new Dictionary<string,int>();2 3             BindingSource bs=new BindingSource();4             bs.DataSource=resolutionList;5             ComboBox.DataSource=bs;6             ComboBox.DisplayMember="key";7             ComboBox.ValueMember="value";

二、调用c++库中返回为BYTE*的函数

方法原型如下:

1 BYTE* WINAPI captureBitmapData(INT pCamera)2 {3     return CAST_PTR(pCamera)->captureBitmapData();4 }

看到这,首先就是找c#与c++类型对照表,可惜没找到。后来瞎试试出来了,至于为什么要这样,我也说不清。下面是c#中的声明方法:

1         [DllImport(@"xxx.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]2         [return: MarshalAs(UnmanagedType.SysUInt, SizeConst = 3)] 3         public static extern IntPtr captureBitmapData(int pCamera);

最后调用如下:

1 byte[] data = new byte[1024];2  3 IntPtr wnd = captureBitmapData(objCamera);4 Marshal.Copy(wnd, data, 0, data.Length);

三、listView项排序

参考:http://blog.csdn.net/lilongherolilong/article/details/6689109

在此之上针对项目做了点拓展,这叫微创新。哈哈我笑了,前辈太多,压力大。项目中通过listView维护着一个List<Image>,最后通知listView顺序合成一张图

View Code

  1         Point p;//点击时坐标  2           3         private void listView1_MouseClick(object sender, MouseEventArgs e)//项右键菜单  4         {  5             if (e.Button == MouseButtons.Right)  6             {  7                 p = new Point(e.X, e.Y);  8                 contextMenuStrip1.Show(listView1, p);  9             } 10         } 11  12         private void listView1_ItemDrag(object sender, ItemDragEventArgs e) 13         { 14             listView1.DoDragDrop(e.Item, DragDropEffects.Move); 15         } 16          17         private void listView1_DragDrop(object sender, DragEventArgs e) 18         { 19             // 返回插入标记的索引值   20             int index = listView1.InsertionMark.Index; 21             // 如果插入标记不可见,则退出.   22             if (index == -1) 23             { 24                 return; 25             } 26             // 如果插入标记在项目的右面,使目标索引值加一   27             if (listView1.InsertionMark.AppearsAfterItem) 28             { 29                 index++; 30             } 31  32             //拖动项 33             ListViewItem item = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 34  35             int currentIndex=item.Index; 36             images.Insert(index, (Image)images[currentIndex].Clone()); 37  38             if (currentIndex > index) 39                 currentIndex++; 40             images.RemoveAt(currentIndex); 41  42  43             listView1.Items.Insert(index, (ListViewItem)item.Clone()); 44             listView1.Items.Remove(item); 45        46  47         } 48  49         private void listView1_DragEnter(object sender, DragEventArgs e) 50         { 51             e.Effect = e.AllowedEffect; 52            53         } 54  55  56         private void cms_delete_Click(object sender, EventArgs e)//ContextMenuStrip删除菜单项 57         { 58             ListViewItem item = listView1.GetItemAt(p.X, p.Y); 59             if (item != null) 60             { 61                 images.RemoveAt(item.Index); 62  63                 listView1.Items.Remove(item); 64  65                 imageList1.Images.Clear(); 66                 imageList1.Images.AddRange(images.ToArray()); 67  68                 for (int i = 0; i < images.Count; i++) 69                 { 70                     listView1.Items[i].ImageIndex = i; 71                 } 72                  73             } 74         } 75  76         private void listView1_DragOver(object sender, DragEventArgs e) 77         { 78             Point point = listView1.PointToClient(new Point(e.X, e.Y)); 79             // 返回离鼠标最近的项目的索引   80             int index = listView1.InsertionMark.NearestIndex(point); 81             // 确定光标不在拖拽项目上   82             if (index > -1) 83             { 84                 Rectangle itemBounds = listView1.GetItemRect(index); 85                 if (point.X > itemBounds.Left + (itemBounds.Width / 2)) 86                 { 87                     listView1.InsertionMark.AppearsAfterItem = true; 88                 } 89                 else 90                 { 91                     listView1.InsertionMark.AppearsAfterItem = false; 92                 } 93             } 94             listView1.InsertionMark.Index = index;   95         } 96  97         private void listView1_DragLeave(object sender, EventArgs e) 98         { 99             listView1.InsertionMark.Index = -1;  100         }101 102         private class ListViewIndexComparer : System.Collections.IComparer103         {104             public int Compare(object x, object y)105             {106                 return ((ListViewItem)x).Index - ((ListViewItem)y).Index;107             }108         }

四、panel内容太大后,做拖动浏览(电子阅读软件、ps都有)

pictureBox1.Cursor=new Cursor(this.GetType(), "");

panel1.Cursor = new Cursor(this.GetType(), "Resources.openhand.cur");

加载时调用,Resources.openhand.cur、Resources.openhand.cur是内嵌的光标文件

View Code

 1         bool move=false; 2         private new void MouseDown(object sender, MouseEventArgs e)//鼠标按下 3         { 4             move = true; 5             Cursor.Current = new Cursor(this.GetType(), "Resources.closedhand.cur"); 6             pt = panel1.PointToClient(pictureBox1.PointToScreen(e.Location)); // 鼠标是按在picturebox上,需要转化成相对于panel的坐标  7             def.X = panel1.HorizontalScroll.Value;  8             def.Y = panel1.VerticalScroll.Value;  9         }10 11 12         private new void MouseMove(object sender, MouseEventArgs e)//鼠标移动13         {14             if (!move) return;15             Point cur = panel1.PointToClient(pictureBox1.PointToScreen(e.Location)); // 当前鼠标坐标,同样需要转化成相对于panel的坐标 16             cur = new Point(pt.X - cur.X, pt.Y - cur.Y); 17             cur.X = def.X + cur.X; 18             cur.Y = def.Y + cur.Y;19             if (0 > cur.X) cur.X = 0; // 如果超出范围重设20             if (0 > cur.Y) cur.Y = 0;21             if (panel1.HorizontalScroll.Visible)22                 panel1.HorizontalScroll.Value = cur.X; // 如果存在对应的滚动条,则赋值 23             if (panel1.VerticalScroll.Visible)24                 panel1.VerticalScroll.Value = cur.Y;25         }26 27         private new void MouseUp(object sender, MouseEventArgs e)//鼠标弹起28         {29             move = false;30         }

ps:可能细心的朋友看到了身份证扫描、拍照(要调用摄像头)等字眼,希望我给出dll及相关代码。dll调用是针对特定硬件,给你也没用。有用我就传上来了,俺可不在乎这东西,再说了传上来哪天要用自己也好找。如果你非得要,下面留下联系方式吧。

转载于:https://www.cnblogs.com/lonny/archive/2011/12/13/2286085.html

Dictionary作为数据源绑定,调用c++库中返回为BYTE*的函数,listView项排序相关推荐

  1. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  2. python调用js库中的函数_Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  3. java调用so库中的native方法_Java如何调用本地.so库里的方法

    首先在此之前希望你已经掌握了基本JNI常识的运用,比如Java代码如何调用本地native的方法,native方法如何访问本地变量,本地方法等以及其他相关的基础知识.在此我还是贴上Activity的部 ...

  4. ctype库中关于字符串的常用函数汇总

    测试代码: // File name: ctype_test // Last modified Date: 2021年10月29日10点27分 // Last Version: V1.0 // Des ...

  5. python如何调用dll库中的函数_Python调用dll库接口-ctypes方法

    背景 最近需要用python写个脚本程序(win10 环境),需要调用现成的dll库完成这项任务,对于一直在Linux平台上开发程序的本人来说,从没有过使用dll的经历(不得不说还是so大法好),遇到 ...

  6. C++ algorithm库中的几个常用函数(swap,reverse,sort)

    C++中的algorithm库中有几个常用的模板函数,写算法题时经常用到,以下将其归纳总结一下(swap,reverse,sort): swap() template <class T> ...

  7. Lua字符串库中的几个重点函数介绍

    在<Lua中的一些库>中也说到了,要对string库的模式匹配进行单独的讲解.对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点.给你一个字符串,让你按照某种 ...

  8. 【Groovy】Groovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )

    文章目录 一.Groovy 构造函数中为成员赋值 二.Groovy 函数的参数传递与键值对参数 三.完整代码示例 一.Groovy 构造函数中为成员赋值 Groovy 类没有定义构造函数 , 但是可以 ...

  9. Python pandas库中的isnull()函数

    python的pandas库中有⼀个⼗分便利的isnull()函数,它可以⽤来判断缺失值,我们通过⼏个例⼦学习它的使⽤⽅法. ⾸先我们创建⼀个dataframe,其中有⼀些数据为缺失值. import ...

最新文章

  1. mysql 原理 ~ DDL之在线DDL
  2. 六轴机器人 宝元系统_庆云大国重器上线六轴智能焊接机器人,锻造高质量发展硬核...
  3. 三维家导入户型镜像怎么使用_UG虎钳三维建模教学,认真看仔细学习了!
  4. 爬虫python需要什么软件-Python爬虫需要学习那些东西?
  5. 广州.NET俱乐部活动通知(11月17日)
  6. 路由器选华硕还是tp_路由器的坑太多,就算写着“千兆”你也要当心丨618选购指南...
  7. 没想到!谷歌排名第一的编程语言,这样的学的话,更容易成为高手!
  8. Bailian2914 计算概论习题-动态存储【排序】
  9. 大学的c语言编译器,有多少大学还在用Turbo C做编译器
  10. (尚硅谷)2022 版 MyBatis 教程笔记一
  11. 面试的准备——公子禹
  12. OpenHarmony开源鸿蒙学习入门-应用开发之使用eTS语法示例项目讲解
  13. 职场分享--职场中如何做一名优秀的员工
  14. 新一代云数据库的引领者---AWS
  15. Chip-seq数据寻找Indel
  16. 华清远见重庆分中心——前端阶段技术个人总结
  17. H5+CSS3实现官网首页--视频全屏背景
  18. springboot项目:前后端搭建
  19. 计算机学院职业规划大赛策划书,大学生职业生涯规划大赛策划书(策划书范文).doc...
  20. 计算机安全检查表,电脑安全自我检查表.doc

热门文章

  1. grafana美人鱼_编码美人鱼–我如何从海洋生物学家转到前端开发人员
  2. shell脚本中的case语句使用要点
  3. 如何开发属于自己的第一个Java程序
  4. 软件测试培训完就业方向怎么选择
  5. Linux运维工程师发展前景
  6. PHP创建日志记录(已封装)
  7. Android在eoe分享一篇推荐开发组件或者框架的文章
  8. crontab 总结
  9. jQuery事件处理一瞥
  10. DOS批处理高级教程精选(六)