WinCE下定制触摸校准界面的方法

时间:2022-01-19 07:01:15

http://blog.csdn.net/sibling520/article/category/764012
相关 技术文章:
1.Windows CE USB Function Driver驱动简析

2.四线电阻式触摸屏驱动的优化
3.WinCE启动界面的定制
                                                            WinCE下定制触摸校准界面的方法

    在实际应用中,经常需要定制WinCE系统的屏幕校准界面。最常见的需求就是根据系统的语言设置校准界面。要实现这个功能,大概有两种方法,一是自己实现校准程序,完全取代WinCE系统的校准界面,第二种是修改WinCE系统自带的校准界面。相比之下,第二种方法较为简便,而这部分的代码是公开的,也有实现的可能。下面就简单介绍一下修改WinCE自带校准界面的方法。 

1 . 备份目录 C :/ WINCE600 / PUBLIC / COMMON / OAK / DRIVERS / CALIBRUI 下的CalibrUi . cpp文件;
2 . 修改CalibrUi . cpp文件;
3 . 在VS2005的解决方案资源管理器中 浏览 到C :/ WINCE600 / PUBLIC / COMMON / OAK / DRIVERS / CALIBRUI,选中CALIBRUI,点击右键,在弹出菜单中选择Rebuild;
4 . 打开工程目录下的D:/WINCE600/OSDesigns/PS6410/PS6410/Wince600/SMDK6410_ARMV4I/cesysgen/oak/target/ARMV4I/retail 目录 , 注意其中PLATFORM_ARMV4I随BSP不同而异;
5 . 在VS2005的菜单中选择“生成”——“Advanced Build Commands”——“Sysgen”菜单;
6 . 监视 D:/WINCE600/OSDesigns/PS6410/PS6410/Wince600/SMDK6410_ARMV4I/cesysgen/oak/target/ARMV4I/retail 目录下的gwes . dll文件,如果gwes . dll被更新了,选择“生成”——“取消”菜单 , 结束Sysgen,监视是人工的,做这一步主要是节省编译的时间,而不必重新Sysgen整个工程;
7 . 将刚刚生成的gwes . dll文件 拷贝至工程目录下 的RelDir / PLATFORM_ARMV4I_Release下 , 替换原来的gwes . dll文件,其中PLATFORM_ARMV4I_Release随BSP不同而异;
8 . 点击VS2005的“生成”——“Make Run - Time  Image”菜单,使用新的gwes.dll,生成新的NK;
9 . 固化新生成的NK,并进入校准界面进行测试。

      下面以定制界面语言为例,简单介绍一下实现的关键代码及步骤。首先将各个语言包编译成单独的DLL。在TouchCalibrateUI_Initialize()中根据系统语言加载特定的语言包,并替代系统默认加载的资源句柄,参考代码如下。

1   hInstRes  =  LoadLibrary(szLanResFile);
2   if  (hInstRes)
3   {
4       s_hinst  =  hInstRes;
5   }

    其中szLanResFile是根据系统语言选择的校准界面的资源包。对于大多数语言来说,这就可以正常使用了。但对于日文、韩文和繁体中文来说,由于 WinCE系统没有自带对应的字体,在修改后可能会出现一些乱码,如□□,所以还需要添加有关字体的代码。参考代码如下

 1   AddFontResource (szFontFile);
 2  
 3   LOGFONT lf;
 4   memset( & lf,  0 sizeof (LOGFONT));
 5   wcscpy(lf.lfFaceName,szFaceName); //  初始化字体名称
 6   lf.lfHeight  =  lfHeight;           //  设置字体的高度
 7   hFont  =  CreateFontIndirect( & lf);  //  创建字体
 8  
 9   //  使用创建的字体
10   if  (hFont)
11   {
12       hFontOld  =  (HFONT)SelectObject(hdc,hFont);
13   }

     除了动态修改语言之外,还可以修改背景颜色和字体的颜色。参考代码如下。

 1   hBrush  =  CreateSolidBrush(dwBKColor);
 2   if  (hBrush)
 3   {
 4       hOldBrush  =  (HBRUSH)SelectObject(hdc,hBrush);
 5   }
 6  
 7   hPen  =  CreatePen(PS_SOLID, 0 ,dwBKColor);
 8   if  (hPen)
 9   {
10       hOldPen  =  (HPEN)SelectObject(hdc,hPen);
11   }
12  
13   SetBkMode(hdc,TRANSPARENT);
14   SetTextColor(hdc,dwTxtColor);
15  
16   ...
17  
18   if  (hBrush)
19   {
20       SelectObject(hdc,hOldBrush);
21       DeleteObject(hBrush);
22   }
23  
24   if  (hPen)
25   {
26       SelectObject(hdc,hOldPen);
27       DeleteObject(hPen);
28   }  

    以上所用到的字体和颜色的信息可以存储在注册表或者文件中,在触摸屏校准界面初始化时取得。

    触摸校准界面的多国语言包可以在这里下载,http://download.csdn.net/source/2075027

 

最近改了一下触摸屏校准的代码,将自己的理解记录在这:(请尊重作者,翻版必究,转自 http://hi.baidu.com/mikenoodle/blog/item/24b47ccb4c86ff16bf09e62c.html
1 涉及到的API
(1) 如果要启动校准程序,一个API就可以搞定:TouchCalibrate()。但是微软没有把它的源码开放,只开放了部分 API。控制面板的校准程序就是调用这个API来实现的。 位置:/Public/WCESHELLFE/OAK/CTLPNL/CPLMAIN/stylus.cpp
(2)  系统启动的时候,会启动触摸屏,读注册表中校准数据([HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]),校准屏幕。
          调用的相关 API有:TouchPanelpAttach/TouchPanelSetCalibration/TouchPanelEnable/TouchPanelpGetPriority/TouchPanelpISR/TouchPanelpISR
/TouchPanelGetDeviceCaps/TouchPanelSetCalibration
这些 API在msn上都有解释, 相关代码的位置:
PUBLIC/COMMON/OAK/DRIVERS/TCH_CAL 和PUBLIC/COMMON/OAK/DRIVERS/TOUCH/TCHMAIN
(3)当用校准程序校准的时候,系统会调用以下 API
     A:调用TouchPanelGetDeviceCaps,通过设置参数TPDC_CALIBRATION_POINT_ID来获得校准点的坐标
     B:在上述校准点坐标处画十字,并等待用户点击(没有找到代码位置)
     C:调用TochPanelReadCalibrationPoint来获得上述校准点坐标处触摸屏对应的数据
           D:当取完校准用的所有的点,调用TouchPanelSetCalibration来计算校准系数
           F:校准屏幕上的字是由API来写的:例如:TouchCalibrateUI_DrawMainScreen.....,具体可参见 MSDN,
               代码的位置:PUBLIC/COMMON/OAK/DRIVERS/CALIBRUI
2 编译
        (1)如果要编译PUBLIC/COMMON/OAK/DRIVERS/TOUCH/TCHMAIN 下的东西,还需要再编译BSP中的Touch driver,因为它是由 BSP来调用的。

         (2)如果要编译PUBLIC/COMMON/OAK/DRIVERS/CALIBRUI 下的东西,可能得用命令行来 sysgen -p common gwes,因为它是与GUI相关的内容

http://chenjiemeichris.spaces.live.com/?_c11_BlogPart_pagedir=Next&_c11_BlogPart_handle=cns!5C6B6A7CE96FCED6!288