VFP打造屏幕取色器的苦难历程

发表于:2007-07-02来源:作者:点击数: 标签:
经过自己努力,这个屏幕取色器终于成功了(等过一段时间,小弟会把这个小工具放到自己网站上去,大家有兴趣可以下载来试试),不过此间的苦难历程恐怕只有我自己才了解。在这里把自己的过程做为 开发 笔记记下来,以作为前车之鉴。 前面一直比较顺利,声明函

经过自己努力,这个屏幕取色器终于成功了(等过一段时间,小弟会把这个小工具放到自己网站上去,大家有兴趣可以下载来试试),不过此间的苦难历程恐怕只有我自己才了解。在这里把自己的过程做为开发笔记记下来,以作为前车之鉴。
前面一直比较顺利,声明函数,然后调用,虽然是第一次做,但思路还是比较清楚的。
调出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了。

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

原文转自:http://www.ltesting.net