现在的位置: 首页 > 综合 > 正文

在WinCE下调用校准触摸屏的API和源代码

2014年03月01日 ⁄ 综合 ⁄ 共 1846字 ⁄ 字号 评论关闭

这两天在讨论我们GPS触摸屏触摸点漂移以及校准后能否保存校准结果的问题。触摸屏在使用一定时间之后都会发生触摸点漂移的现象,表现为触摸屏上的触摸点和LCD屏幕上的光标点会发生偏差,导致不能正确点击屏幕内容,解决方法是进行校正。前一个版本的凯立德导航软件在程序运行开始处会调用校准操作,好处是可以方便的校准屏幕了,但是坏处也是显而易见的,如果触摸点未发生漂移,每次面对这个还真有点嫌它麻烦,虽然可以按两次背光灯键跳过去。于是新版本的凯立德导航软件就取消掉了这个操作,然而麻烦也就来了,现在想校准时都要进入到控制面板里,找到那个笔针,然后选校准进行操作,对熟悉操作的用户来说没什么问题,但大多数导航仪用户都是电脑白痴,这样的操作对他们来说是件烦琐的事情,对我们来说,用户认为烦琐,就是一件灾难。

说了太多,好像有点跑题了,我想到的解决方法是在开机画面中加入一个校准屏幕的按钮,然后用户每次开机时,如果觉得触摸点有漂移,可以自行点击这个按钮就可以进行校准操作了,思路是调用coredll.dll中的TouchCalibrate API,强制加载coredll.dll,获取TouchCalibrate函数地址,然后用函数指针调用。具体实现如下:

在头文件中加入函数指针定义:
typedef BOOL (WINAPI *_TouchCalibrate)();

然后使用如下代码,加载coredll.dll,取TouchCalibrate函数地址,进行调用。
// TODO: Add your control notification handler code here
HINSTANCE hinstance = LoadLibrary(_T("coredll.dll")); 
if (hinstance == NULL) 

AfxMessageBox (L"instance == NULL"); 
return; 

_TouchCalibrate TouchCalibrate = NULL; 
TouchCalibrate = (_TouchCalibrate)GetProcAddress(hinstance , L"TouchCalibrate"); 
if (TouchCalibrate == NULL) 

AfxMessageBox (L"TouchCalibrate == NULL"); 
return; 

TouchCalibrate (); 
FreeLibrary(hinstance );

对于校准后的数据,保存于注册表中HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH的CalibrationData项,形式是这样的:”CalibrationData”=”555,655 168,128 165,1199 945,1193 939,129″(对于不同规格触摸屏数据是不一样的,格式供参考), 如果注册表是基于RAM的,则下次重新开机数据无法保存的,系统断电重启后需要再次校准。对于HIVE注册表,数据则可以持久保存。我们的GPS产品,是Load SD卡中的nk.bin镜像到RAM运行,显然无法保存校准后的数据,但张岭和我意见相左。

测试数据表明,确实是不能保存的,下面是测试时的CalibrationData项的值,可以看到,每次重新开机,该值都会被重新恢复。

校准后:    1903,2031 825,865 854,3066 3100,3140 3033,889
重新开机后:  2040,2040 986,1020 984,3090 3140,3100 3130,1005
重新校准后:  1973,2008 845,896 874,3103 3137,3150 3048,903
再次重新开机后:2040,2040 986,1020 984,3090 3140,3100 3130,1005

目前我尚未找到直接启用这组数据而非调用TouchCalibrate来达到校准触摸屏作用的方法。有人说可以用TouchCalibrateUI_Done,但目前尚未解决,我要去翻翻PB里的代码,T.T

刚刚找到更方便的方法:引用Pwinuser.h这个头文件,然后直接调用TouchCalibrate,代码如下:
#include <C:\Program Files\Windows CE Tools\wce420\MX21_MP\Inc\pwinuser.h> //具体路径请自行修改
void CTouchCheckDlg::OnButton1() 
{
TouchCalibrate();
}

【上篇】
【下篇】

抱歉!评论已关闭.