原创:常青
现在的嵌入式产品,基本上都用到TouchPanel ,希望我的一点经验会带给大家一点帮助。我这里以TELECHIP7901为例。
一、确定X,Y是否镜像:在屏幕上任意拖动出一个矩形虚线框,然后随意上下左右拖动,这时看虚框是否根随触摸笔移动,如果虚线框能跟随触摸笔动,说明X+,X-,Y+,Y-四线极性是接对了。
X,Y坐标的算方法如下:
posX = (MAX_X-*x)*iScreenWidth/(MAX_X-MIN_X);
posY = (*y-MIN_Y)*iScreenHeight/(MAX_Y-MIN_Y);
如果触摸笔向上而虚框向下移动,说明Y+,跟Y-接反了,同样如果触摸笔向左而虚框向右移动,说明X+,跟X-接反了。对于这个情况软件可作如下处理,在上面的算法之前,加入如下的算式:
*x = (MIN_X-MAX_X)*(*x-MIN_X)/(MAX_X - MIN_X)+MAX_X;X接反的时候加
*y = (MIN_Y-MAX_Y)*(*y-MIN_Y)/(MAX_Y - MIN_Y)+MAX_Y;Y接反的时候加
这四个算式可以组合出四种情况,这要看你具体是哪一种情况了。
二、确定触摸屏的边界值:
在程序里面应该有个这样的定义,这个就是设触摸屏的边界。
#define MAX_X 3940//3940
#define MIN_X 93
#define MAX_Y 3860//3870ww
#define MIN_Y 200 //
还是在屏幕上用触摸笔拖出一个虚线框,分两类情况:
(1)确定最大值:从左上到右下拖动,然后按住不要松,这时看虚线框跟触摸笔的位置,(假设虚线框的右下顶点坐标为(X1,Y1)触摸笔的坐标为(X,Y)),如果X > X1,Y > Y1 说明MAX_X,MAX_Y过大了。要减小MAX_X,MAX_Y。这里要多试几次。(如图一)
(2)确定最小值:从右下到左上拖动,然后按住不要松,这时看虚线框跟触摸笔的位置,(假设虚线框的右下顶点坐标为(X1,Y1)触摸笔的坐标为(X,Y)),如果X < X1,Y ><Y1 说明MIN_X,MIN_Y小了。要增大MIN_X,MIN_Y。这里要多试几次。(如图一)
如下图所示:
三、去掉或改变TP校屏上的字:
找到PUBLIC/COMMON/OAK/DRIVERS/CALIBRUI/calibrui.cpp
TouchCalibrateDrawScreenText()函数里面的的ExtTextOut()注释掉。
// Draw this line.
ExtTextOut(
hdc,
xText, yText,
NULL, NULL, // rectangle options
buf, cChars,
NULL);
}
注释掉。
或者将
IdStringBase = 0;这里的取值是一个资源文件的ID。可以自己定义的。
注意如果将TouchCalibrateDrawScreenText()整个函数都注掉的话,屏幕就没有白色了,十字架直接显示在背景图片上,这里我没有试过自已加背景图片,不过有了这个思路,应该实现起来不难。
四、让触摸屏校屏程序校完后自动退出。
有些人觉得每次校完屏后还要点一下屏然后再退出太麻烦,想校完后直接退出。可以在TouchCalibrateUI_WaitForConfirmation()函数里面做修改,可以在函数开头加上: TouchCalibrateUI_Done(TCS_ACCEPTED);意思就是不需要做等待,直接接受校屏参数。
五、保存校屏注册表值:
校屏完成之后,其计算出来的值可以通过注册表查看到,
通过Microsoft ActiveSync工具连接目标硬件平台,然后在PB的tools菜单中点击“Remote Registry Editor”以运行远程注册表编辑工具查看WinCE的注册表内容。
在注册表编辑器中打开[HKEY_LOCAL_MACHINE/Hardware/DeviceMap/Touch]键,就可以看到触摸屏的校验数值,
“CalibrationData”键值就是触摸屏的校验值,将这个值复制一下,然后打开PB的平台的project.reg 文件,加入如下的触摸屏注册信息,其中"CalibrationData"=之后的值就是上面我们复制的触摸屏校验值。 [HKEY_LOCAL_MACHINE/Hardware/DeviceMap/Touch]
"CalibrationData"="1484,1168 584,536 568,1820 2356,1812 2356,488"
添加完毕后,保存, 重新编译平台,生成新的映像文件,运行映像,就可以看到触摸屏校验信息已经在注册表里了。
另外要加一点,如果你的系统不是HIVE注册表,以后校屏的数据将不能被保存。