WinCE显示驱动

来源:互联网 发布:phoneshop mac 编辑:程序博客网 时间:2024/06/05 01:10

wince的显示驱动和普通的设备驱动不一样.普通的设备驱动是由设备管理器device.exe加载和管理的;而显示驱动是由GWES.exe加载和管理的,类似的由GWES加载管理的还有键盘鼠标,触摸屏,打印机等驱动,这些叫本地驱动(内置驱动).所以,显示驱动ddi就不是常见设备驱动的ddi(流接口ddi).更具体说,它不是通过CreateFile这些文件系统api接口来访问.而是通过GDI接口,熟悉win32应用编程的会记起,GDI就是CreateDC,ReleaseDC等等这些api,可以在wingdi.h中找到这些接口.

    一般的,显示驱动是分层实现的,mdd层一般会使用微软提供的GPE模块.如果要支持旋转,使用GPErotate,如果要支持ddraw,使用DDGPE模块.事实上,对wince5,GPErotate已经合并到GPE里面了,typedef GPE GPErotate.而DDGPE也是从GPE继承过来的类.在一些驱动中ddraw和rotate是不能同时使用的.)

tips:GPE是什么?一个简单的图形引擎.首先这是一个类,其次从显示驱动分层上说,使用GPE作为上层mdd,可以节省工作,因为它处理了和上层的接口,并且软件方式模拟了一些图形功能.

上层GDI接口

    提供给GWES调用的接口一共大概20几个函数.GWES通过以下DDI和显示驱动交互,并向上提供GDI接口.

DrvAnyBlt                 有扩展或透明位块传送(bit block transfers)
DrvBitBlt                 有剪切和屏蔽的通常位块传送
DrvConstrostControl       允许软件、硬件对照调整
DrvCopyBits               发送GDI设计的打印段到打印驱动程序
DrvCreateDeviceBitmap     设计和管理位图
DrvDeleteDeviceBitmap     删除设计位图
DrvDisableDriver          通知驱动程序GDI不再需要它,并准备卸载它
DrvDisablePDEV            通知驱动程序GDI不再需要特殊打印或显示设备
DrvDisableSurface         通知驱动程序GDI不再需要特殊绘制表面
DrvEnableDriver           由驱动程序输出初始记录,为GDI的DDI函数返回指针
DrvEnablePDEV             为GDI返回一个PDEV,它是一个物理显示设备的逻辑表示
DrvEnableSurface          设计一个绘制界面,并把它与PDEV相连
DrvEndDoc                 发送任何所需的完成打印文件控制信息
DrvFillPath               用毛刷填充路径
DrvGetMasks               为目前显示设备模式获取颜色屏蔽
DrvGetModes               列举、显示设备支持的显示模式
DrvMovePointer            移动指针,保证GDI不干涉
DrvPaint                  用毛刷漆出一个特定区
DrvPowerHandler           调用处理、上电、掉电通知
//DrvAweryFont              获得字体公制信息
DrvRealizeBrush           创建由GDI指定参数毛刷
DrvRealizeColor           把一个RGB颜色,映射到由设备支持最可能获得颜色
DrvSetPalette             设置显示设备调色盘
DrvSetPointershape        对光标设置新形状并更新显示
DrvStareDoc               发送任意的开始打印文件信息
DrvStartPage              发送任意的打印新页的信息
DrvStrokePath             删除路径
DrvTransparentBlt         透明位块传送
DrvUnrealizeColor         将显示设备制式的颜色映成RGB值

    但事实上,以上接口并非直接由显示驱动公开给GWES的.显示驱动只公开了一个接口DrvEnableDriver(),在这个接口中导出其他接口,具体的做法如下.

BOOL
APIENTRY
GPEEnableDriver(
    ULONG           iEngineVersion,
    ULONG           cj,

    DRVENABLEDATA * pded,
    PENGCALLBACKS   pEngCallbacks)

BOOL APIENTRY DrvEnableDriver(       
    ULONG          iEngineVersion,
    ULONG          cj,
    DRVENABLEDATA *pded,
    PENGCALLBACKS pEngCallbacks)
{
    return GPEEnableDriver( iEngineVersion, cj, pded, pEngCallbacks );
}

GWES调用DrvEnableDriver(),而DrvEnableDriver()函数调用上面的GPEEnableDriver函数,其中第三个参数就是返回的其他接口的函数指针.在ddi_if.c中同时定义了全局函数指针数组如下:

const DRVENABLEDATA pDrvFn = {
    {   DrvEnablePDEV           },
    {   DrvDisablePDEV          },

     省略

    {   NULL /* DrvEndDoc    */ },
    {   NULL /* DrvStartDoc */ },
    {   NULL /* DrvStartPage */ },
    {   DrvEscape               }
};

    如此,上层获得下层的函数指针pded.即获得了所有接口函数的指针.此外,第4个参数pEngCallbacks是一个回调函数的指针入口,是上层提供给下层的回调函数.是系统提供给显示驱动调用的.它具体包括下面这些:

(BRVSHOBJ 代表一个执行用实线或网格删除填充操作的毛刷.)

BRVSHOBJ_pvAllocRbrush 为毛刷分配内存

BRUSHOBJ_pvGetRbrush 为特定毛刷返回指针

(CLIPOBJ 代表剪切区结构)

CLIPOBJ-bEnum 从剪切区,列举剪切矩形的函数

CLIPOBJ-cEnumStart 为列举剪切区的剪切矩形设置参数

EngcreateDericeBitmap 使GDI对设备位图进行处理

EngCreateDeviceBitmap 请求GDI创建一个位图,并返回句柄.

EngCreateDeviceSurFace 通过GDI创建一个显示驱动程序管理的设备界面

EngCreatePalette 请求GDI创建一个调色板.

EngDeleteSurface 通知GDI显示驱动程序不再需要设备界面

PALOBJ-cGetColors 将颜色复制到调色板上

(PATHDAT 存储部分绘制路径的结构)

PATHOBJ-bEenum 由绘制路径中列举PATHDATA记录

PATHOBJ-vEnumStart 一个绘制路径列举它的线性部分

PATHOBJ-vGetBounds 返回绘制路径的有限制矩形区

(XLATEOBJ 用来在调色板之间传送色彩)

XLATEOBJ-cGetPalette 由指定的调色盘返回颜色.