WinCE中的Touch Panel驅(qū)動(dòng)是由GWES模塊來管理的,Touch Panel驅(qū)動(dòng)接收用戶的觸摸信息,并將其轉(zhuǎn)換為屏幕上的坐標(biāo)信息,傳給GWES模塊。在WinCE中,Touch Panel驅(qū)動(dòng)是分層的,分為MDD層和PDD層,這和其他WinCE設(shè)備驅(qū)動(dòng)是一樣的。MDD層由微軟提供,用戶只需要實(shí)現(xiàn)MDD和PDD層間的DDSI函數(shù)就可以了。如圖
WinCE中的GWES模塊負(fù)責(zé)加載和管理Touch Panel驅(qū)動(dòng),Touch Panel的MDD層向上提供DDI接口,PDD層是針對(duì)硬件的實(shí)現(xiàn),對(duì)MDD層提供DDSI接口。
1 Touch Panel驅(qū)動(dòng)中的數(shù)據(jù)結(jié)構(gòu)
(1) TOUCH_PANEL_SAMPLE_FLAGS
用于描述一個(gè)采樣點(diǎn)的信息,這些信息被定義在一個(gè)枚舉結(jié)構(gòu)中:
enum enumTouchPanelSampleFlags {
TouchSampleValidFlag = 0x01,
TouchSampleDownFlag = 0x02,
TouchSampleIsCalibratedFlag = 0x04,
TouchSamplePreviousDownFlag = 0x08,
TouchSampleIgnore = 0x10,
TouchSampleMouse = 0x40000000
};
TouchSampleValidFlag:一個(gè)有效的采樣值
TouchSampleDownFlag:第一次按觸摸屏?xí)r,返回該flag
TouchSampleIsCalibratedFlag:采樣的x和y坐標(biāo)值不需要再被校驗(yàn)了
TouchSamplePreviousDownFlag:表示上一次采樣狀態(tài)是按在觸摸屏上
TouchSampleIgnore:忽略這次采樣值
TouchSampleMouse:預(yù)留
(2) TPDC_CALIBRATION_POINT
用于描述一個(gè)校驗(yàn)點(diǎn)的相關(guān)信息,結(jié)構(gòu)如下:
struct TPDC_CALIBRATION_POINT {
INT PointNumber;
INT cDisplayWidth;
INT cDisplayHeight;
INT CalibrationX;
INT CalibrationY;
};
PointNumber:校驗(yàn)點(diǎn)索引值,用于描述校驗(yàn)點(diǎn)在LCD上的位置
0:中間
1:左上
2:左下
3:右下
4:右上
cDisplayWidth:顯示的寬度
cDisplayHeight:顯示的高度
CalibrationX:校驗(yàn)點(diǎn)的x坐標(biāo)值
CalibrationY:校驗(yàn)點(diǎn)的y坐標(biāo)值
(3) TPDC_CALIBRATION_POINT_COUNT
用于描述需要校驗(yàn)的點(diǎn)的個(gè)數(shù),結(jié)構(gòu)如下:
struct TPDC_CALIBRATION_POINT_COUNT {
DDI_TOUCH_PANEL_CALIBRATION_FLAGS flags;
INT cCalibrationPoints;
};
flags:一般為0
cCalibrationPoints:需要校驗(yàn)的點(diǎn)的個(gè)數(shù),一般是5
(4) gIntrTouch和gIntrTouchChanged
這是兩個(gè)被MDD層用到的中斷,需要在PDD層中定義,如下:
DWORD gIntrTouch = SYSINTR_NOP;
DWORD gIntrTouchChanged = SYSINTR_NOP;
gIntrTouch用于描述觸摸屏中斷,要和硬件的觸摸屏中斷相關(guān)聯(lián)。
gIntrTouchChanged用于在觸摸屏按下后,每隔一段時(shí)間進(jìn)行一次采樣,應(yīng)該和硬件的一個(gè)定時(shí)器中斷相關(guān)聯(lián)。
這兩個(gè)值應(yīng)該在DdsiTouchPanelEnable(..)函數(shù)中和硬件中斷關(guān)聯(lián),并在函數(shù)DdsiTouchPanelGetPoint(..)中根據(jù)情況清除相應(yīng)的中斷。
2 MDD層API
MDD為上層導(dǎo)出所需的Touch Panel驅(qū)動(dòng)接口函數(shù),上層通過這些函數(shù)可以完成對(duì)Touch Panel的操作,下面會(huì)介紹這些函數(shù)的功能。
(1) BOOL TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback):
使能Touch Panel設(shè)備,用于初始化Touch Panel。
pfnCallback:指向處理Touch Panel事件的回調(diào)函數(shù)
(2) Void TouchPanelDisable(void):
禁用Touch Panel設(shè)備。
(3) BOOL TouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput ):
獲得Touch Panel設(shè)備的相關(guān)信息。
iIndex:索引值
TPDC_SAMPLE_RATE_ID:采樣率信息
TPDC_CALIBRATION_POINT_COUNT_ID:采樣點(diǎn)個(gè)數(shù)信息
TPDC_CALIBRATION_POINT_ID:采樣點(diǎn)坐標(biāo)信息
lpOutput:指向一個(gè)內(nèi)存區(qū)域,用于存放獲得的相關(guān)信息
(4) VOID TouchPanelCalibrateAPoint(INT32 UncalX, INT32 UncalY, INT32* pCalX, INT32* pCalY):
將輸入的未經(jīng)過校驗(yàn)的坐標(biāo)信息轉(zhuǎn)換成校驗(yàn)后的坐標(biāo)信息。
UncalX:輸入的X坐標(biāo)
UncalY:輸入的Y坐標(biāo)
pCalX:校驗(yàn)后的X坐標(biāo)
pCalY: 校驗(yàn)后的Y坐標(biāo)
(5) VOID TouchPanelPowerHandler(BOOL bOff):
Touch Panel的電源控制函數(shù)。
bOff:TRUE表示關(guān)閉電源,F(xiàn)ALSE表示打開電源
(6) BOOL TouchPanelReadCalibrationPoint(INT* pRawX, INT* pRawY):
獲得Touch Panel的坐標(biāo)。
pRawX:觸摸屏的X坐標(biāo)
PRawY:觸摸屏的Y坐標(biāo)
(7) VOID TouchPanelReadCalibrationAbort(void):
終止當(dāng)前的校驗(yàn)。
(8) VOID TouchPanelSetCalibration(INT32 cCalibrationPoints, INT32* pScreenXBuffer, INT32* pScreenYBuffer, INT32* pUncalXBuffer, INT32* pUncalYBuffer):