以文本方式查看主題 - 曙海教育集團(tuán)論壇 (http://www.xinguifushi.cn/bbs/index.asp) -- Wince技術(shù)討論區(qū) (http://www.xinguifushi.cn/bbs/list.asp?boardid=9) ---- WinCE中的Touch Panel驅(qū)動(dòng)介紹 (http://www.xinguifushi.cn/bbs/dispbbs.asp?boardid=9&id=1380) |
-- 作者:wangxinxin -- 發(fā)布時(shí)間:2010-11-16 11:29:14 -- WinCE中的Touch Panel驅(qū)動(dòng)介紹 WinCE中的Touch Panel驅(qū)動(dòng)是由GWES模塊來(lái)管理的,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ù),上層通過(guò)這些函數(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)過(guò)校驗(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): |