触摸屏驱动是从触摸屏硬件上获取用户的输入信息,然后将触摸事件传递给GWES子系统。驱动会矫正坐标值,比如将歪斜的线条修正为直线。
在用户的笔或者手指触摸屏幕的时候,驱动必须随时返回坐标值,当笔或者手指离开屏幕后,必须产生事件来标记“抬笔”事件。
下面是触摸屏驱动的注册表设置。
[HKEY_LOCAL_MACHINE\ControlPanel]
InputConfig"=dword:3; 3 => 键盘和触摸屏
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]
"DriverName"="touch.dll"
"MaxCalError"=dword:10
本数据结构绘出返回到系统的坐标值的属性。
本数据结构由TouchDriverCalibrationPointGet.例程代码组成,并运行在系统启动时,用户可以看见屏幕上会有一个X,从中间再到四周指引用户矫正坐标值。TouchDriverCalibrationPointGet例程通常利用屏幕的高和宽来确定中心和四周的坐标值。
struct TPDC_CALIBRATION_POINT {
INT PointNumber;
INT cDisplayWidth;
INT cDisplayHeight;
INT CalibrationX;
INT CalibrationY;
};
本数据结构由DdsiTouchPanelGetDeviceCaps例程代码组成。
struct TPDC_SAMPLE_RATE {
INT SamplesPerSecondLow;
INT SamplesPerSecondHigh;
INT CurrentSampleRateSetting;
};
数据结构中成员说明
SamplesPerSecondLow
低采样率值。
SamplesPerSecondHigh
高采样率值。
CurrentSampleRateSetting
当前采用的采样率值,1代表高采样率,0代表低采样率。
本例程使触摸屏具有采样功能。可以被程序直接调用。
本例程在MDD的DLL中被加载,DLL入口获得DLL_PROCESS_ATTACH事件时被执行。在多数系统中,一般只有一个进程加载触摸屏驱动,然而在某些系统中也不排除多个进程都加载触摸屏驱动DLL的可能性。在本例程中可以为它们复制全局变量等信息,这样可使每个加载驱动的进程都从本例程获得一个全局信息的副本。但是在本例程中不需要操作硬件或者中断。硬件和中断的操作应当在DdsiTouchPanelEnable和DdsiTouchPanelDisable中进行。
本例程原型:
LONG DdsiTouchPanelAttach(void);
返回值一般为0。
本例程在MDD的DLL被卸载,DLL入口获得DLL_PROCESS_DETACH事件时被执行。在多数系统中,一般只有一个进程加载触摸屏驱动,然而在某些系统中也不排除多个进程都加载触摸屏驱动DLL的可能性。在本例程中可以为它们复制全局变量等信息,这样可使每个加载驱动的进程都获得一个全局信息的副本。但是在本例程中不需要操作硬件或者中断。硬件和中断的操作应当在DdsiTouchPanelEnable和DdsiTouchPanelDisable中进行。
本例程原型:
LONG DdsiTouchPanelDetach(void);
本例程关闭触摸屏设备,删除任何没有被提交给GWES的坐标,关闭电源。
本例程原型:
VOID DdsiTouchPanelDisable(void);
无参数,无须返回值。
本例程原型:
BOOL DdsiTouchPanelEnable(void);
返回值:
TRUE代表成功,FALSE代表失败。
本例程为触摸屏加载电源,并且进行初始化。调用AllocTouchPanelRegs为寄存器分配内存。这些虚拟内存分配时,参数中使用MEM_RESERVED标志,这样被分配的内存不与物理内存绑定,不能被malloc等函数访问,最后使用virtual_copy将虚拟地址和寄存器的物理地址绑定(不是物理内存)。
在为寄存器分配完空间后,建立中断,即“落笔”中断,但是建立后就关闭中断,直到InterruptEnable()被执行后再建立中断。
本例程查询触摸屏设备的精度。
本例程原型:
BOOL DdsiTouchPanelGetDeviceCaps(
ULONG iIndex,
LPVOID lpOutput
);
其参数为:
iIndex,代表查询的项目。可以有以下类型:
TPDC_SAMPLE_RATE_ID 查询采样频率。
TPDC_CALIBRATION_POINT_ID 返回指定精度的坐标值,精度由lpOutput参数的PointNumber域指定。
TPDC_CALIBRATION_POINT_COUNT_ID 查询校准坐标所需要的坐标样本数。
lpOutput:指向存放返回信息的内存区域,类型和iIndex对应。
当iIndex为TPDC_SAMPLE_RATE_ID时,指向TPDC_SAMPLE_RATE结构。
当iIndex为TPDC_CALIBRATION_POINT_ID时,指向TPDC_CALIBRATION_POINT结构。
lpOutput不能为空指针。
返回值:
TRUE代表成功,FALSE代表失败。
本例程返回最近的一次数据采样坐标值。在“落笔”之后,就会触发定时器的一系列中断。定时器每秒钟约产生150次中断,每次中断都要返回坐标值。
在pxa255中,本例程分为三部分:
n 处理“落笔”中断
关闭“落笔”中断
n 处理定时器中断
递增定时器中断计数。
以上两个中断处理,都会调用SampleTouchScreen,从采集到的3个点中,选出最优化的点,返回给系统。
n 处理“抬笔”中断
最后,打开“落笔”中断,将UCB1400设置为可中断模式。
本例程通知驱动程序,系统正从暂停模式恢复到正常模式,或者进行相反的操作。本例程会被内核态程序调用,因此不要在其中使用系统调用。
基于微软公司的DirectDraw显示驱动,必须在DDI内实现DDHAL用于支持DirectDraw。
DirectDraw提供了独立于设备的显示驱动功能。它将图形显示数据直接加载到硬件设备上,而不需要图形设备接口来对数据进行转换,从而使图形显示效果更加顺畅,避免了屏幕的闪烁。实现这样的接口,需要扩展能够直接访问硬件的驱动接口,这些能够直接访问硬件的驱动接口组成了DirectDraw硬件抽象层(DirectDraw Hardware Abstraction Layer,DDHAL)
图10-1 DirectDraw和GDI
|
Windows CE中的DirectDraw是Windows桌面环境Direct-
Draw的子集。DirectDraw的核心可执行代码常驻在系统进程gwes.exe中,而应用程序则和较小的客户端代理Ddraw.dll建立连接,这个代理负责维护系统和用户进程之间的远程DirectDraw COM接口连接。Windows CE在默认的情况下不提供进程外部的COM服务器。
Windows CE还提供了一个名为DirectDraw图形原始引擎(DirectDraw Graphics Primitive Engine,DDGPE)的抽象层,GDI和DirectDraw组件在系统进程中使用这个抽象层将GDI/DDI和DDRAW/DDHAL的功能捆绑到一个由C++类和函数组成的框架上。DDGPE提供的C++类实现了GPE类的扩展。
可以复制Platform Builder提供的样例显示驱动程序作为新创建的驱动程序的基础。
1.修改二进制文件导出的接口,二进制文件应当导出HALInit接口。在Platform Builder提供的样例显示驱动程序有一个.def后缀名的文件,在这个文件中添加HALInit。HALInit是Ddgpe.lib库的一部分,应当总是被链接到程序中。
2.在程序中包含路径drive:\wince400\public\directX\oak\inc,这应当是DDHFuncs.h所在路径。这是一个所有显示驱动程序公共的头文件,不应当被修改。
将下列文件从样例显示驱动程序中复制到自己的文件夹下:
n HalCaps.cpp
n HalDD.cpp
n HalSurf.cpp
n HalPalette.cpp
在选择样例显示驱动程序时,应当选择和自己设备最接近的驱动程序。最后,编译自己创建的驱动程序。
DDGPE类是DirectDraw对象继承的基类。
表10-1列出了DDGPE类中的成员函数:
表10-1 DDGPE类中的成员函数
成 员 |
功 能 描 述 |
DDGPE::AllocSurface |
为一个surface分配内存 |
DDGPE::AllocVideoSurface |
在内存中创建DDGPESurf对象 |
DDGPE::BltExpanded |
建立并且执行一个GPE blit |
DDGPE::BltPrepare |
GPE BltPrepare 函数的DDGPE版本 |
DDGPE::DetectMode |
根据提供的参数确定显示模式 |
DDGPE::DetectPixelFormat |
将DDPIXELFORMAT转换成EGPEFormat或者EDDGPEPixelFormat. |
DDGPE::GetDriverData |
返回指向驱动数据的指针 |
DDGPE::GetDriverGUID |
获取驱动的GUID |
DDGPE::GetModeInfoEx |
返回扩展模式信息 |
DDGPE::GetPhysicalModeId |
获取当前实际的显示模式 |
DDGPE::InDisplay |
判断给定的扫描线是否正在显示 |
DDGPE::PerformBlt |
执行一次blit |
DDGPE::SetDriverData |
将驱动特定的数据存储到DDGPE对象中 |
DDGPE::SetDriverGUID |
将驱动的GUID赋予特定的对象 |
DDGPE::SetMode |
更改当前的显示模式 |
DDGPE::SetVisibleSurface |
使指定的surface被推到前台,成为可视 |
DDGPE::WrapSurface |
在既存的内存块之上创建一个DDGPESurf对象 |
DDGPESurf类扩展了GPESurf类,并且代表了由GDI分配的一个surface,如表10-2描述。
表10-2 DDGPSurf类中的成员函数
成 员 |
功 能 描 述 |
DDGPESurf::AlignedWidth |
获取一个surface内存的宽度 |
DDGPESurf::Bpp |
决定在当前surface中,每个象素占用的位数 |
DDGPESurf::ColorKey |
获取当前surface的color key |
DDGPESurf::ColorKeyMask |
获取当前surface的color key掩码 |
DDGPESurf::DeleteSurface |
发表评论
最近访客 更多访客>>最新评论
|
评论