首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视 ┆淘宝手机在线充值 ┆淘宝游戏点卡充值 
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>NET专区>其他>实例详解WinCE中Display驱动开发
实例详解WinCE中Display驱动开发
来源: 发布时间:2008-08-25 发布人: 浏览: 人次   字体: [ ]  

     在WinCE中,Display驱动由GWES模块来管理。WinCE提供了两种架构的Display驱动模型,可以满足不同的硬件需求。一种是基于WinCE DDIDisplay驱动模型,另一种是基于DirectDrawDisplay驱动模型。下面将对两种架构作简单介绍。

 1. Display驱动模型

 WinCE下的Display驱动直接由GWES模块管理,它会直接被GWES模块管理和调用。Display驱动实际上也是分层的,其中包括GPE库,该库处理一些默认的绘图,相当于驱动的MDD层。用户只需要开发和硬件相关的PDD层驱动就可以了。在WinCE中,整个架构如图:

 

如图,Application为一个应用程序,该程序会调用图形设备接口函数(GDI),而GDI函数是由Coredll.dll模块导出的。Coredll.dll会将函数调用的参数打包,然后触发对另一个进程的本地过程调用(LPC),所有的绘图和开窗口的工作被传给内核中GWES模块。GWES模块被称为图形,窗口和事件子系统,专门处理图形输出和用户输入等事件及相关的所有交互。GWES模块会调用Display驱动完成对显示硬件的操作。Display驱动由GPEDDL.dll组成,GPE完成基本的默认绘图工作,而DDI.dll实际上从GPE类上继承而来的,并实现了相关的显示硬件的操作。

 2. DirectDraw Display驱动模型

 DirectDraw提供了独立于硬件的直接访问显示设备的能力。它可以通过直接访问硬件抽象层(HAL)中的一些函数来达到直接操作显示设备的目的,在这个过程中,不再需要图形设备接口(GDI)的转换。这种直接的方法可以使图像更加连贯,也提高了显示的性能。为了实现这样的功能,需要在显示驱动上扩展能够直接访问相关硬件的函数。这些函数会被DirectDraw模块调用,并形成DirectDraw的硬件抽象层(DDHAL)DirectDraw显示驱动架构如图:

 

如图,DirectDraw的真正实现代码都驻留在gwes.dll模块中,应用程序只是连接了一个小的客户端,被称为DDRAW.dll代理,该代理主要负责用户进程与系统之间的远程DirectDraw COM接口连接。这样,用户请求会被传送到内核的GWES模块中。针对DirectDrawWinCE提供了一个名为DirectDrawGPE(DDGPE),它是从GPE类上面继承而来的。实际上,DirectDraw显示驱动是由DDGPEDDHAL组成,而DDGPE中已经包含了DDHAL的功能。用户需要从DDGPE类继承并实现相关函数即可。GWES.dll模块中包含GDIDDRAW两个组件,这两个组件会调用驱动中的DDGPE的相关接口完成对硬件的操作。

 

在上述两种架构中,用户可以根据自己的硬件情况选择相应的架构。第一种架构是基于GPE类继承来实现的,第二种架构是基于DDGPE类继承来实现的,而第二种架构的DDGPE类又是从第一种架构的GPE类继承而来。关于两种类的具体定义,可参见” \WINCE600\PUBLIC\COMMON\OAK\INC”路径下的gpe.hddgpe.h文件。

 

 

本Blog将基于Display驱动模型来介绍,DirectDraw Display驱动模型不在这里介绍。

WinCE下的Display驱动是基于GPE类来实现的,其中GPE中已经实现了基本的绘制工作,相当于MDD层。用户需要继承该类,并实现里面的其他一些函数,所以用户实现的相当于PDD层。

GPE类是一个抽象类,其中包含很多纯虚函数,只能用于继承。用户在继承了GPE类以后,要对GPE类中的纯虚函数做相应的实现。开发Display驱动的大致步骤如下:

(1)    继承GPE类并定义一个该类的实例。

(2)    实现GetGPE()函数,把该类的实例返回给上层的DDI接口。

(3)    实现DrvEnableDriver(..)DisplayInit(..)函数并导出这两个接口。

(4)    实现GPE类中的函数。

      

下面将具体介绍实现的步骤:

1 继承GPE

首先,基于GPE类进行继承,如果想在Display驱动支持Rotation可以从GPERotate类上面继承。实际上,在”gpe.h”中有如下定义:

            typedef GPE     GPERotate;

可以看出GPERotate类就是GPE类。在这里,用户从GPE类上面继承就可以了,举个例子如下:

    class NewGPE: public GPE

  {

    private:

        GPEMode           m_ModeInfo;

        DWORD             m_colorDepth;

        DWORD             m_VirtualFrameBuffer;

        DWORD             m_FrameBufferSize;

        BOOL              m_CursorDisabled;

        BOOL              m_CursorVisible;

        

    public:

        NewGPE(void);

        virtual INT NumModes(void);

        virtual SCODE SetMode(INT modeId,    HPALETTE *palette);

        virtual INT InVBlank(void);

        virtual SCODE SetPalette(const PALETTEENTRY *source, USHORT firstEntry, USHORT numEntries);

        virtual SCODE GetModeInfo(GPEMode *pMode, INT modeNumber);

        virtual SCODE SetPointerShape(GPESurf *mask, GPESurf *colorSurface, INT xHot, INT yHot, INT cX, INT cY);

        virtual SCODE MovePointer(INT xPosition, INT yPosition);

        virtual void  WaitForNotBusy(void);

        virtual INT   IsBusy(void);

        virtual void      GetPhysicalVideoMemory(unsigned long *physicalMemoryBase, unsigned long *videoMemorySize);

        virtual SCODE AllocSurface(GPESurf **surface, INT width, INT height, EGPEFormat format, INT surfaceFlags);

        virtual SCODE     Line(GPELineParms *lineParameters, EGPEPhase phase);

        virtual SCODE     BltPrepare(GPEBltParms *blitParameters);

        virtual SCODE BltComplete(GPEBltParms *blitParameters);

        virtual ULONG GetGraphicsCaps();

        virtual ULONG DrvEscape(

                        SURFOBJ *pso,

                        ULONG    iEsc,

                        ULONG    cjIn,

                        PVOID    pvIn,

                        ULONG    cjOut,

                        PVOID    pvOut);

        SCODE WrappedEmulatedLine (GPELineParms *lineParameters);

        void  CursorOn(void);

        void  CursorOff(void);

#ifdef ROTATE

        void SetRotateParms();

        LONG DynRotate(int angle);

#endif

    };

     

NewGPEGPE类上面继承,其中包括一些属性,如下:

            m_ModeInfo显示模式,结构如下

               struct GPEMode {

                               int modeId;                             //开发者定义的显示模式的索引号

                               int width;                                //显示宽度

                               int height;                                //显示高度

                               int Bpp;                                  //显示深度

                               int frequency;                          //显示频率

                               EGPEFormat format;              // RGB格式,各占多少bit

               };

 

            m_colorDepth显示深度

            m_VirtualFrameBufferFrameBuffer的地址

      m_FrameBufferSizeFrameBuffer的大小

      m_CursorDisabled光标使能标记

      m_CursorVisible光标可视标记

 

用户可以根据需要定义相应的属性,在NewGPE类中,需要定义并实现基类中的纯虚函数,上面的NewGPE类中已经包含了这些函数的定义,还包括了其他一些函数,将在下面介绍。


共2页: 上一页 1 [2] 下一页
相 关 文 章   发布商链接
·重新对IIS进行注册的命令使用
·举例说下WinCE中Loadcepc工具的使用...
·浅谈WinCE中命令行工具CecImort.exe...
·安装WinCE6.0的开发环境全攻略
·WinCE5.0中PBcec.exe的使用说明
·图解WinCE6.0添加自定义的工程模板实...
·WinCE中Build.exe工具的使用及其参数...
·实例讲解PDA入门开发的过程,附代码
·在mobile上调用SHCameraCapture接口...
·图解如何使用WinCE的BSP Clone进行克...
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·安装WinCE6.0的开发环境全攻...
·CE6和CE5在Platform Builder...
·WINCE自带的驱动程序被修改后
·图解Mobile5.0的环境配置和开
·WinCE分析Flash分区原则和块...
·WINE中文字体显示方块的解决...
·Wine环境下成功运行Bitcomet ...
·如何用Silverlight制作scroll...
·怎样开启WinCE中的File Serve...
·实例讲解ASP.NET抽象工厂模式
·.Net程序如何脱离.net框架也...
·如何在.NET打包时加入卸载功...
·浅谈asp.net服务器端控件与客
·silverlight是什么?有什么用?
·在WinCE5.0和WinCE6.0中编译...
热 门 文 章
·WINE中文字体显示方块的解决...
·实例讲解ASP.NET抽象工厂模式...
·在WinCE5.0和WinCE6.0中编译...
·WinCE中telnet,FTP及网络共享...
·WinCE下,快速编译驱动及BSP...
·安装WinCE6.0的开发环境全攻...
·wince中BIB文件的详细介绍
·图解WinCE6.0添加自定义的工...
·WinCE BSP中打印信息的实现介...
·Wince开发之创建桌面快捷方式
·WinCE中RTC驱动开发介绍
·wince动态加载图片,数据类型...
·图解如何使用WinCE的BSP Clon...
·WinCE环境变量的添加,删除和...
·实例讲解PDA入门开发的过程,...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .