WinCE触摸校准界面的方法

时间:2021-11-08 18:00:26

欢迎加入Wince技术讨论群QQ#326444254

在实际应用中,经常需要定制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 . 打开工程目录下的Wince600 \ PLATFORM_ARMV4I \ cesysgen \ oak \ target \ ARMV4I \ retail目录 , 注意其中PLATFORM_ARMV4I随BSP不同而异;
5 . 在VS2005的菜单中选择“生成”——“Advanced Build Commands”——“Sysgen”菜单;
6 . 监视Wince600 \ PLATFORM_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,并进入校准界面进行测试。
WinCE触摸校准界面的方法

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

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

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

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  }
WinCE触摸校准界面的方法

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

WinCE触摸校准界面的方法
 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  }