中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > 数据库综合
VFP打造屏幕取色器的苦难历程
作者:未知 时间:2004-10-08 12:12 出处:Blog 责编:chinaitpower
              摘要:暂无

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

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有