首次接触DirectDraw

DirectDraw
1.DirectDraw可能是DirectX中最重要的技术,因为它沟通了2D图形的显示和Direct3D所依赖的真缓冲层。只要掌握了DirectDraw,就能够编写各种在DOS16/32下编写的图形应用程序。DirectDraw是理解DirectX中许多概念的关键,所以要特别注意。

2.DirectDraw的界面
DirectDraw由5个界面组成:
(1)IUnknown--所有的COM对象必须从这个基本界面中获得,DirectDraw也不例外。IUnknown只包含了被其他界面覆盖的Addref(),Release(),和QueryInterface()函数
(2)IDirectDraw--这是一个必须创建出同DirectDraw一起开始工作的主要界面对象。
(3)IDirectDrawSurface--这代表你将创建的实际显示画面,显示时需要利用DirectDraw.
(4)IDirectDrawPalette--DirectDraw可以处理任何色空间,从1位单色到32位真彩色。它用来创建、加载、操作调色板以及调用调色板来画图,如主画面及辅助画面。
(5)IdirectDrawClipper--用于一些可视显示面的子集剪切DirectDraw光栅和位图操作。大多数情况下,只在视窗DirectX应用程序软件中使用DirectDraw剪切器,和用DirectDraw剪切器在显示画面的区域里对位图进行剪切。

3界面的协同使用
(1)如何创建一个DirectDraw应用程序:
a.创建主DirectDraw对象,得到一个IDirectDraw4画面。在次界面上,设置协同等级和视频模式。
b.在IDirectDrawSurface界面上,创建至少一个主画面。基于画面的色深以及视频模式,如果视频模式为每象素8位或更少,则需要使用调色板
c.在IDirectDrawPaltte界面上创建一个调色板,用RGB三元组初始化调色板并把调色版附在界面上。
d.如果DirectDraw程序带有一个窗体,或对一个可能出DirectDraw可视画面边界的位图进行着色时,你就需要创建一个剪切工具,并把它调整到可视窗体的区域中
d.在主画面上画图。

4创建DirectDraw对象
首先需要调用DirectDrawCreate()函数,如下:
HRESULT WINAPI DirectDrawCreate(GUID FAR *lpGUID,
                                LPDIRECTDRAW FAR * lplpDD
                                IUnknown FAR *pUnkQuter);
参数:lpGUID--这是你所需要的显示驱动的GUID(全局统一标识符)。大多数情况下,你只须用NULL代替默认硬件。
     lplpDD--这是一个指向获得IDirectDraw指针的指针,注意:lplpDD返回一个IDrectDraw界面,而不是IDrectDraw4界面
     pUnkOuter--高级特征,通常设置为NULL.

例子:LPDIRECTDRAW lpdd = NULL;//storage for IDirectDraw
     //create the DirectDraw object
     DirectDrawCreate(NULL,&lpdd,NULL);

5.DirectDraw的错误处理
FAILED()--对错误进行测试。
SUCCEEDED--对成功进行测试

例子1:
if(FAILED(DirectDrawCreate(NULL,&lpdd,NULL)))
{
   //error
}

例子2:
if(SUCCEEDED(DirectDrawCreate(NULL,&lpdd,NULL)))
{
   //GO ON NEXT
}
else
{
   //error
}

你要检查错误,还可以看DirectDrawCreate()函数的返回代码,具体查阅帮助

6.改进界面
LPDIRECTDRAW lpdd = NULL;
LPDIRECTDRAW lpdd4 = NULL;

//first create base IDirectDraw interface
if(FAILED(DirectDrawCreate(NULL,&lpdd,NULL)))
{
//error
}

if(FAILED(lpdd->QueryInterface(IID_IDirectDraw4,(LPVOID*)&lpdd4)))
{
//error
}

lpdd->Release();
lpdd->NULL;

6.和Windows协同工作
设置DirectDraw的协作等级,需要用到IDirectDraw4::SetCooperativeLevel()函数
编写全屏程序如下:
lpdd4->SetCooperativeLevel(hwnd,
                          DDSCL_FULLSCREEN|
                          DDSCL_ALLOWMODEX|
                          DDSCL_EXCLUSIVE|
                          DDSCL_ALLOWREBOOT)
普通窗体程序如下:
lpdd4->setCooperativeLevel(hwnd,DDSCL_NORMAL);

7.进入事件模式
(1)设置视频模式的函数IDirectDraw4::SetDisplayMode().
(2)设置转换模式步骤:
a.lpdd4->SetDisplayMode(width,height,bpp,0,0) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值