本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
};
类NewGPE从GPE类上面继承,其中包括一些属性,如下:
m_ModeInfo:显示模式,结构如下
struct GPEMode {
int modeId; //开发者定义的显示模式的索引号
int width; //显示宽度
int height; //显示高度
int Bpp; //显示深度
int frequency; //显示频率
EGPEFormat format; // RGB格式,各占多少bit
};
m_colorDepth:显示深度
m_VirtualFrameBuffer:FrameBuffer的地址
m_FrameBufferSize:FrameBuffer的大小
m_CursorDisabled:光标使能标记
m_CursorVisible:光标可视标记
用户可以根据需要定义相应的属性,在NewGPE类中,需要定义并实现基类中的纯虚函数,上面的NewGPE类中已经包含了这些函数的定义,还包括了其他一些函数,将在下面介绍。
共2页: 上一页 1 [2] 下一页