您的位置:首页 > 其它

【转载】wince 显示驱动!

2008-11-25 10:55 204 查看
      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[/u]GPErotate.而DDGPE也是从GPE继承过来的类.在一些驱动中ddraw和rotate是不能同时使用的.)[/u]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函数返回指针
[/u]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 由指定的调色盘返回颜色.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: