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

原创 2004年10月08日 10:45:00

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

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

Ubuntu下屏幕取色软件

整理自Color picker utility (color pipette) in Ubuntu GPick: sudo apt-get install gpick It'...
  • wdjhzw
  • wdjhzw
  • 2015年02月23日 16:43
  • 6272

ColorPix——到目前为止最好用的屏幕取色器

之前用了不下8种屏幕取色器,定位最精准的就是这个了,而且界面小巧精致很喜欢。 程序图标截图: 程序界面截图: 右上角的+可以置于最前端, 像素、RGB、16进制码、HS...
  • sonikk
  • sonikk
  • 2012年01月12日 21:42
  • 12716

用VFP打造屏幕取色器

屏幕取色器,大家想必都见识过,小弟也从网上找了一个,做网页很方便,尤其像俺这种偏于代码的那种人,看到合适的,可以用这个小东东取出来,然后可直接用在网页中,真是很方便,不过,像咱也是做开发的,于是想到了...
  • darkhawlk
  • darkhawlk
  • 2004年10月05日 21:15
  • 870

最快最简单的android屏幕取色(懒人办法)

使用QQ截图,截图的焦点所在的屏幕点会显示RGB的值 打开网页输入RGB颜色转换为html代码 懒的打开PS...
  • b275518834
  • b275518834
  • 2015年02月26日 23:11
  • 7645

轻量级 js取色器 JSColor

该文件下载链接 http://jscolor.com/release/jscolor-1.4.5.zip 或者  http://download.csdn.net/detail/bibihaha/9...
  • BIBIHAHA
  • BIBIHAHA
  • 2015年09月22日 05:50
  • 2300

java实现屏幕取色

    Color pixel = new Color(0,0,0);  Robot robot;  Point mousepoint;  int R,G,B;  MouseInfo mouseinf...
  • langzi84
  • langzi84
  • 2004年10月21日 22:26
  • 3288

颜色取色器(C#编写,需要.Net框架)

前段时间完成实验室任务,做界面做图标,发现获得一个图片或者桌面的颜色RGB值很麻烦,因此,自己做了一个。点击取色,鼠标到哪里,就会显示鼠标指向改点的RGB值(十进制、十六进制),按钮背景也会有相应的变...
  • Eshine01081067
  • Eshine01081067
  • 2014年01月15日 17:35
  • 1225

C#屏幕取色(支持Win7 64位 32位 WinXP)

测试过对Win7 64位 32位 WinXP都可用的: http://www.cnblogs.com/hihell/archive/2011/09/16/2178660.html 网上能找到的...
  • coldwind811201
  • coldwind811201
  • 2013年02月27日 21:31
  • 1608

颜色查看器 屏幕取色工具

颜色查看器,可以方便的获取屏幕上任意一点的颜色值(RGB),同时可以调用标准的调色板。 使用鼠标钩子(Mouse Hook),放大镜(Magnifier)技术,并且是在VS2010下用MFC完成的,...
  • sdoat
  • sdoat
  • 2011年03月21日 09:25
  • 8862

Ubuntu下安装取色器

Ubuntu下安装取色软件
  • xuwenneng
  • xuwenneng
  • 2016年12月29日 09:36
  • 1558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VFP打造屏幕取色器的苦难历程
举报原因:
原因补充:

(最多只允许输入30个字)