数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
VFP打造屏幕取色器的苦难历程

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

经过自己努力,这个屏幕取色器终于成功了(等过一段时间,小弟会把这个小工具放到自己网站上去,大家有兴趣可以下载来试试),不过此间的苦难历程恐怕只有我自己才了解。在这里把自己的过程做为开发笔记记下来,以作为前车之鉴。
前面一直比较顺利,声明函数,然后调用,虽然是第一次做,但思路还是比较清楚的。
调出API的帮助文档,我用的是网上流行的江南红雨API档案,还不错,挺全,以前用这些声明,基本上是照猫画虎。用VFP的语法套用过来应该没问题,却不呈想,因此给自己埋下了深深的祸根,自己以后因为这几句声明,走上了自己的苦难历程。
自己的声明是这样:
DECLARE integer GetCursorPos IN user32  as "GetCursorPos"  string  @lpPoint
DECLARE integer ClientToScreen IN user32 as "ClientToScreen" integer hWnd,string @lpPoint
DECLARE integer GetPixel IN gdi32 as "GetPixel" integer hDc,integer xPos,integer yPos
DECLARE integer GetDC IN user32 as "GetDC" integer hWnd
自己自认是没问题,不过内行相信已经看到了,但等自己悟出这个问题以后,自己已经是经历了N多的苦难以后了。先不说这些,先说调用。
遇到的第一个问题,坐标的转换。即在文本框里显示两个坐标,这是重要的一部分,也是进行取色的重要部分。
很显然,VFP不支持结构,改用字符串,类型已然做了改动,而且调用API也很成功,具体代码在前一篇文章里,在此不再详术,现在的问题,是如何把字符串的类型转换成整数类型,从VB的声明里,这个字符串应该是64位,即有8个字节的,分别是两个32位的变量,即X,Y两个LONG类型(VB的声明),于是把这两个分别分离出来,再进一步,横、纵坐标的最大值是1024或者是1600(当然有可能会更大,不过在一段时间内相信不会超过65536^_^),于是取低十六位应该是够了。便还是一愁莫展,现在还要有同时转换两个字节,网上的流行的作法好像是用的chartobin()函数转换,但这不是VFP自带的函数,需要从网上找相应的文件,自己运气不是很好,没有找到。
到了山穷水尽了,自己忽然想到了ASC()虽然只能处理单字符,不过自己可以让处理两次,做为一个2位的256进制数来处理,于是这个问题解决了。
如法炮制,取颜色也这样或得了解决,不过中间出现了一个小插曲,因为API返回的是一个4字字的integer类型,显然有效的是三个字节,分别是红、绿、蓝,可是具体的字节分部,不是很清楚,于是自己按习惯,从高到低开始做,可是做出来以后,在取色的时候才发现,红色、蓝色被取值颠倒了,哈,调来,一切OK。
于是,做了一个十进制转十六进制表示的小程序,然后可以同时显示两种类型,并且,再做一个热键,把颜色值复制到剪切板,一切OK。
可以发布了,编译,也很顺利,测试也没发现问题。
自己怎么也感觉应该不会有问题,于是打安装包,把VFP9的运行库考过来,又没有控件需要注册,所以开始编译,等到别的机器上一试,弹出一个错误:
“Microsfot Viral FoxPro Can not load  resouce”
自己真是很意外,该 有的都有了呀,API函数是系统自代的,应该不用再另外打进去吧,可是拿到另外几台机器上,问题照旧。于是自己只好把user32.dll和gdi32.dll两个文件,打进包再编译一下。这个问题是解决了,可是自己苦难真的来临了。
开始弹出窗体,但虽之出错
use32  Caused an exeception
API调用发生异常,怎么会这样,自己明明试了很正常啊,可是从哪试都是同一个结果,于是打开工程项目,重新调试。意外出现了。
没编译的也是出错了,同样的错误!!我晕,不知所措,真的要我从头再来吗?
更让我难过的是,自己以前运行正常的东西也开始出错了。
自己冷静想了一下,应该都正常啊,该打包的都打包了,该声明的也都声明了,自己不得不从新把目光放到这几个API函数声明的上面。可是出错的函数是getpixel() 并不是第一个啊,自己百思不得过且过 其解,在自己上网的时候,看到了一篇VFP的调用示例,是一全取硬盘卷序列号的,自己把目光看到win32api上,自己想到了,可能是这里出错了,于是回去,编辑,把声明改过来,全部改成win32api试试,问题依旧。自己想到可能是自己打包打错了,不该把两个DLL放进去,于是从别的机器上找到文件拷过来,还是一样。自己真的是无计可施了。
正好,自己机器因为病毒,不得不重做了一套系统,这时候再重新运行的时候,奇迹出现了,一切正常了,编译打包以后一切OK了。

原来是自己函数声明惹的祸,看着自己做的东西,真的感觉来得不容易,呵呵。




相关文章

相关软件