当前位置: 首页 > 编程日记 > 正文

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

最近在做一个电子档案管理的项目。现在还处于初期,只是做一个简单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.IComparer
103 {
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

相关文章:

ES6 新特性

ES6 先阅读这个http://gejiawen.github.io/2015/07/28/Javascript/ECMAScript6%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E7%B3%BB%E5%88%97/ECMAScript6%E6%96%B0%E7%89%B9%E6%80%A7%E7%AE%80%E4%BB%8B/ ES6的特性在chrome中默认是关闭的 Visit chrome://flags/#enable-javascrip…

一次被僵尸网络病毒攻击的过程

事件背景 回想起来应该算是去年的事情了, 时值 2019 年 1 月 24 日早上, 当时我正忙碌于开发手头的一个珠宝分销系统项目, 由于已经进行了多日封闭式开发, 项目初见效果, 准备放到内网服务器 A 上跑跑看. 项目的一些功能需要通过公网才能访问, 于是便打算通过一台之前就架设在公…

c2 链路_POS链路不能打开的解决办法

介绍的是POS链路不能打开的解决办法&#xff0c;其原因是C2字节不匹配&#xff0c;这里以华为路由器为组网环境。一、网络环境路由器A有GE接口和2.5G POS接口与其他路由器连接&#xff0c;启动路由器A后&#xff0c;发现GE端口的状态为正常开启&#xff0c;但2.5G POS端口无法开…

“寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面

如果第二次看到我的文章&#xff0c;欢迎下方扫码订阅我的个人公众号&#xff08;跨界架构师&#xff09;哟~本文长度为5723字&#xff0c;建议阅读15分钟。坚持原创&#xff0c;每一篇都是用心之作&#xff5e;这是一篇以程序员视角写的文章&#xff0c;但是内容是互联网行业通…

TCP拥塞控制算法内核实现剖析(二)

内核版本&#xff1a;2.6.37 主要源文件&#xff1a;linux-2.6.37/ net/ ipv4/ tcp_bic.c 本文主要分析BIC算法实现 1. 相关结构体和参数 /* BIC TCP Parameters */struct bictcp {u32 cnt ; /* increase cwnd by 1 after ACKs */u32 last_max_cwnd ; /* last maximum snd_cw…

关于IOS中的self关键字

在C#、Java中都有一个关键字this用于表示当前对象&#xff0c;其实在ObjC中也有一个类似的关键字self&#xff0c;只是self不仅可以表示当前对象还可以表示类本身&#xff0c;也就是说它既可以用在静态方法中又可以用在动态方法中。-(void)setName:(NSString *)name andAge:(in…

中值定理符号怎么读_微分、微分中值定理、泰勒公式

问对问题&#xff0c;找对方法&#xff0c;做对的事~ 黑莓 2020/10/09 温习001-031逻辑、集合、空间 线性代数00线性代数研究什么内容&#xff1f;-上海交大032-047行列式的定义、性质与计算10/03048-078矩阵的定义、运算10/03079-117可逆矩阵、初等变换与秩10/04…

Java高级特性增强-多线程

请戳GitHub原文: https://github.com/wangzhiwub... 大数据成神之路系列&#xff1a; 请戳GitHub原文: https://github.com/wangzhiwub... Java高级特性增强-集合 Java高级特性增强-多线程 Java高级特性增强-Synchronized Java高级特性增强-volatile Java高级特性增强-并发集合…

微软企业库4.1学习笔记(八)创建对象 续集2

3.3通过配置指定和Unity的整合 另外一种方法是在配置源中指定配置的需要&#xff0c;你可以指定下面的一条或者多条&#xff1a; 你可以在Unity配置中指定想要的BlockExtensions  你可以在Unity配置中的type配置节指定如何创建企业库对象&#xff0c;指定类型映射的关系&…

Kali Linux python 安装pip

安装pip&#xff1a;apt-get install python-setuptoolseasy_install pippip install xxxx转载于:https://www.cnblogs.com/arhatlohan/p/4737828.html

3dmax图像采样器抗锯齿_内幕揭秘!同样的场景同一张图,用3DMAX网渲平台进行二次渲染时间竟然相差3个小时之多!...

一个分辨率:4000*2000的室内客餐厅&#xff0c;3dmax版本是2014版本&#xff0c;渲染器版本为vray3.63&#xff0c;机器&#xff1a;阿里云1台服务器&#xff0c;这个同样的场景同样的参数同一张图&#xff0c;用3dmax网渲平台进行二次渲染发现时间相差了将近3个小时之多&#…

2015/8/18

一、git, switch to找不到师傅新创的branch 解决方法&#xff1a;切到git视图去pull&#xff0c;然后切回java视图&#xff0c;再Team->switch to&#xff0c;就能找到了 二、在师傅的环境中能successful&#xff0c;在我的环境中却是failed 解决方法&#xff1a;eclipse-&g…

Javascript - prototype、__proto__、constructor

最近看了很多文章&#xff0c;想要更通透的搞懂JS中的prototype、__proto__与constructor属性&#xff0c;从各个博主的文章里摘取了我认为可以有助于理解的一些内容&#xff0c;希望自己能够掌握好这一重要知识点的同时也帮助到大家&#xff0c;具体内容请见下文。 &#xff0…

DOS下读取4GB内存

好文章我收集下起来 CPU上电后&#xff0c;从ROM 中的BIOS开始运行。 BIOS是处在内存的最顶端64KB&#xff08;FFFF0000H&#xff09;&#xff0c;还是1MB之下的64KB&#xff08;F0000H&#xff09;处呢&#xff1f;事实上&#xff0c;BIOS在这两个地方都同时出现。 在保护模式…

7纳米duv和euv_要超车台积电 三星宣布采用EUV技术7纳米制程完成验证

在晶圆代工市场&#xff0c;台积电与三星的竞争始终是大家关心的戏码。三星虽然有高通等VIP客户&#xff0c;但在7纳米制程节点&#xff0c;高通预计会转投台积电&#xff0c;三星要想受更多客户的青睐&#xff0c;只能从制程技术着手了。这也是三星跳过非EUV技术的7纳米制程&a…

HDU 1711 Number Sequence(KMP算法)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1711 Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15548 Accepted Submission(s): 6836Problem DescriptionGiven two s…

分享45款高质量的免费(X)HTML/CSS模板

当你需要在短时间内设计出一个网站的时候&#xff0c;网站模板就非常有用了。这也就是为什么这些设计模板已成为设计领域的最新趋势的原因。在这篇文章中&#xff0c;收集了各式各样的网站模板&#xff0c;您可以免费下载使用&#xff0c;希望这些设计模板不仅带给您灵感&#…

运维开发笔记整理-前后端分离

运维开发笔记整理-前后端分离 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 一.为什么要进行前后端分离 1>.pc, app, pad多端适应 2>.SPA开发式的流行&#xff08;单页Web应用&#xff08;single page we…

初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型

一 数据库初识1.1 什么是数据库数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库是以一定方式储存在一起,能予多个用户 共享,具有尽可能小的冗余度,与应用程序彼此独立的数据集合…

WinForm导出文件,你懂的……

好久没有写文章了&#xff0c;下面把自己最近程序中用到的一个小小的导出文件的方法给在家分享一下&#xff0c;欢迎大家来排砖&#xff0c;谢谢~不说废话了&#xff0c;直接上代码&#xff1a; 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; …

PL/SQL第五章 Order by排序

1 -- 排序2 -- 1、列明排序3 -- 2、别名排序4 -- 3、列位置排序&#xff08;当使用union,union all,intersect,minus集合操作&#xff0c;列明不同&#xff0c;但希望排序&#xff09;5 SELECT deptno,dname FROM dept UNION6 SELECT empno,ename FROM emp7 ORDER BY 1 DESC;8 …

想转行学python过来人提醒大家几点

因为目前python非常火&#xff0c;应用也非常广泛&#xff0c;是目前最火的行业之一&#xff0c;竞争很大&#xff0c;工资很高&#xff0c;未来发展也极好。 首先告诉你&#xff0c;零基础学习python难度还是有的&#xff0c;python的专业程度本身就不简单&#xff0c;学习这事…

mysql答题表设计_PHP+MYSQL问答系统中的提问和回答的表怎么设计

展开全部PHPMYSQL 的问答系32313133353236313431303231363533e78988e69d8331333337396236统的设计与实现&#xff0c;问答系统简而言之 就是一个网上交流系统&#xff0c;针对学校这个特定环境&#xff0c;以学生和老师为主体&#xff0c;以实验室信息交流为话题而建立起的一个…

Android实时获取音量(单位:分贝)

基础知识 度量声音强度&#xff0c;大家最熟悉的单位就是分贝&#xff08;decibel&#xff0c;缩写为dB&#xff09;。这是一个无纲量的相对单位&#xff0c;计算公式如下&#xff1a; 分子是测量值的声压&#xff0c;分母是参考值的声压&#xff08;20微帕&#xff0c;人类所能…

排序算法 - 堆排序

堆排序是指利用堆这种数据结构所设计的一种排序算法。 类型&#xff1a;选择排序时间复杂度&#xff08;最坏&#xff09;&#xff1a;O(nlogn)时间复杂度&#xff08;最好&#xff09;&#xff1a;O(nlogn)时间复杂度&#xff08;平均&#xff09;&#xff1a;O(nlogn)空间复杂…

textContent与innerText的不同(转发)

textContent与innerText的不同 IE下有个innerText属性&#xff0c;FF下有个textContent属性。很多以前给IE写脚本的&#xff0c;在FF下找不到innerText属性&#xff0c;于是网上搜到的建议是用textContent来替代。反之给FF写脚本的也一样。 但是实际上&#xff0c;这里有个误解…

mysql插入性能_mysql 数据量大时插入和查询性能

现在mysql中有数据33.8w的数据&#xff0c;然后做查询和更新或插入操作&#xff0c;速度很慢&#xff0c;基本100条数据就要1.68s。好慢啊&#xff0c;我要测试一下&#xff0c;到底慢在哪&#xff1f;能不能提高点速度&#xff1f;参考一篇博文&#xff1a;http://blog.csdn.n…

Ext JS 4 笔记1

ExtJS4 引入了现在灰常流行的前端MVC。这在原本的3.3.1里面是没有的。原先项目里为了实现相对的MVC&#xff0c;自己写了一个controller和model &#xff0c;收集并且保持JS端的数据。所以呢&#xff0c;这时候的文档结构就完全不一样了。原本的结构更像是传统 C# winform &…

activemq 消息阻塞优化和消息确认机制优化

一、消息阻塞优化 1.activemq消费者在从待消费队列中获取消息是会先进行预读取&#xff0c;默认是1000条&#xff08;prefetch1000&#xff09;。这样很容易造成消息积压。 2.可以通过设置prefetch的默认值来调整预读取条数&#xff0c;java代码如下 //设置预读取为1ActiveMQPr…

iOS-查询数据库--指定数据表中的当前数据行的总数量

很多时候&#xff0c;我们在查询一个表的时候&#xff0c;不想得到里面的记录内容&#xff0c;只是想简单的得到符合查询条件的记录条数。 FMDB中有一个很简单的方法就可以实现&#xff0c;见下面的代码实例&#xff1a; #import "FMdatabase.h" (int)numberOfCurre…