📄 bcjq103.txt
字号:
//获得IDirectDraw2接口---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject
*Sender)
{
if(FAILED(lplpDD->QueryInterface(IID_IDirectDraw2,(LPVOID
*)&lplpDD2)))
Edit1->Text="Get IDriectDraw2 Interface
Failed!";
else
{
Edit1->Text="Get IDriectDraw2 Interface
OK!";
lplpDD->Release(); /* 释放IdirectDraw接口 */
Button3->Enabled=false;
Button4->Enabled=true;
}
}
//设置协作级别---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject
*Sender)
{
DWORD dwFlags=0;
if(CheckBox1->Checked)
dwFlags=dwFlags|DDSCL_ALLOWMODEX;
if(CheckBox2->Checked)
dwFlags=dwFlags|DDSCL_ALLOWREBOOT;
if(CheckBox3->Checked)
dwFlags=dwFlags|DDSCL_EXCLUSIVE;
if(CheckBox4->Checked)
dwFlags=dwFlags|DDSCL_FULLSCREEN;
if(CheckBox5->Checked)
dwFlags=dwFlags|DDSCL_NORMAL;
if(CheckBox6->Checked)
dwFlags=dwFlags|DDSCL_NOWINDOWCHANGES;
if(FAILED(lplpDD2->SetCooperativeLevel(Handle,dwFlags)))
Edit1->Text="Set set cooperative level
Failed!";
else
{
Edit1->Text="Set cooperative level
OK!";
GroupBox2->Enabled=false;
Button4->Enabled=false;
Button5->Enabled=true;
}
}
//枚举显示模式的回调函数---------------------------------------------------------------------------
BOOL WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC
lpDesc,
LPVOID lpContext)
{
static int i=0;
char buff[256];
wsprintf(buff,"%dx%dx%dx%d",
lpDesc->dwWidth,
lpDesc->dwHeight,
lpDesc->ddpfPixelFormat.dwRGBBitCount,
lpDesc->dwRefreshRate);
Form1->ComboBox2->Items->Add(buff);
DisplayMode[i].Width=lpDesc->dwWidth;
DisplayMode[i].Height=lpDesc->dwHeight;
DisplayMode[i].Depth=lpDesc->ddpfPixelFormat.dwRGBBitCount;
DisplayMode[i].Rate=lpDesc->dwRefreshRate;
i++;
if(i<100)
return(DDENUMRET_OK);
else
return(DDENUMRET_CANCEL);
}
//枚举显示模式---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject
*Sender)
{
ComboBox2->Clear();
if(FAILED(lplpDD2->EnumDisplayModes(DDEDM_STANDARDVGAMODES,
NULL,
NULL,
(LPDDENUMMODESCALLBACK)EnumDisplayModesCallBack)))
Edit1->Text="Enumerate Display Modes
failed!";
else
{
Edit1->Text="Enumerate Display Modes
OK!";
ComboBox2->ItemIndex=0;
Button5->Enabled=false;
Button6->Enabled=true;
}
}
//设置显示模式---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject
*Sender)
{
if(ComboBox2->ItemIndex<0)
{
ShowMessage("请先在DDraw2下拉框中选择一种显示方式");
return;
}
if(FAILED(lplpDD2->SetDisplayMode(
DisplayMode[ComboBox2->ItemIndex].Width,
DisplayMode[ComboBox2->ItemIndex].Height,
DisplayMode[ComboBox2->ItemIndex].Depth,
DisplayMode[ComboBox2->ItemIndex].Rate,
0)))
Edit1->Text="Set DisplayMode failed!";
}
//退出dx1---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender,
TCloseAction &Action)
{
if(lplpDD2) lplpDD2->Release();
}
2.3 装入并显示图形文件
为了简明地说明采用DirectDraw图形文件的显示技术,我们以示例程序dx2介绍图面、图形文件装入、图形缩放、图形在图面上显示等的初步概念和实现技术。
2.3.1 DirectDraw显示图形的技术
为了显示图象,DirectDraw必需首先拥有类似画布(canvas)的绘图空间,DirectDraw并不向在DOS下那样简单地将显示缓存作为绘画的对象,而是通过DirectDraw对象创建各种不同种类的“图面”(Suerface),图面上的内容可以被应用程序自由地拷贝、组合,生成千变万化的图形。
2.3.1.1图面分以下几种类型:
(1)主图面(Primary图面):即在屏幕上显示出来的图面,就是GDI用于绘制Windows用户界面的图面。每个DirectDraw对象只能有一个主图面,主图面的尺寸、位置和格式由系统当前的显示模式决定,不能改动。
(2)后台图面(Off-screen图面):此类图面不能被直接看到。一般来说,后台图面往往用于作为游戏精灵动画、背景图形等部件的存储缓冲区。后台图面的尺寸是可以调整的,且可以有多个后台图面,其大小根据实际情况调整,不要太大或太小。一种典型的例子是:有一个精灵的动画由4张128点阵图形组成,那么可以将后台图面定义为256点的方阵,将这个动画序列存储下来读者可能认为可以创建一个比主图面大的后台图面以便保存游戏背景,这样可以方便地实现滚屏,但是,DirectDraw限制后台图面的尺寸不能比主图面大,除非系统的显示卡支持。能否实现大的后台图面我们将在以后叙述。
(3)复合图面(Complex图面)和翻转链(Flipping
Chain):这种图面主要用于生成平滑动画。有关技术待制作动画时介绍。
(4)覆盖图面(Overlay图面):这是一种由硬件支持的图面,DirectDraw不能仿真。有关技术在后面介绍。
DirectDraw可以把图面创建在显示内存或系统内存中,而显示内存又分为常规显示内存和AGP加速图形接口内存。由于显示内存容量是有限的,所以每个图面具体应该创建在哪部分存储区域中应该统筹规划,一般将使用频繁,需要硬件加速或实现功能的图面安排在显示内存。如果您不指定图面创建的位置,DirectDraw将首先在常规显示内存创建图面,当常规显示内存不够时,若系统支持AGP内存,则先使用AGP内存,最终使用系统内存。
2.3.1.2 图形文件的装入
图形文件装入到图面并不象想象的那么简单,因为装入的图形的点阵可能与、图面的点阵不同,这就存在图形的缩放。另外,图形数据在内存中的移动、复制,也是需要处理的内容。对于Windows的设备无关位图,我们可以考虑使用Windows的功能实现:
(1)采用LoadImage函数装入图形文件
(2)采用图面的GetDC方法获得图面与GDI兼容的设备上下文
(3)采用BitBlt函数将图形数据拷贝到图面中
有关GDI编程请参看有关Windows编程资料,这里读者只需要知道固定的用法就可以了。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -