📄 bcjq103.txt
字号:
2.2.2.5 DDraw2显示模式的枚举
利用HRESULT IDIRECTDRAW2::EnumDisplayModes方法及其相应的回调函数可以列出系统显示设备所支持的显示方式。您开发的应用程序可以判定当前运行的计算机是否支持所需的显示方式,也可以提供用户选择显示方式的功能。
lpDD2->EnumDisplayModes(DWORD dwFlag,
LPDDSURFACEDESC lpDDSurfaceDesc,
LPVOID lpContext,
LPDDENUMMODESCALLBACK EnumDisplayModesCallBack
(1)参数dwFlag是标志参数,可以为DDEDM_REFRESHRATES(枚举不同刷新频率的刷新模式)和DDEDM_STANDARDVGAMODES(枚举模式中包含Mode13)两者之一或之和,在dx1程序中采用了后者。
(2)参数lpDDSurfaceDesc是一个过滤显示模式的结构,只要设置为NULL就可以获得全部显示模式的枚举,否则只获得满足指定模式的枚举。
LPDDSURFACEDESC是一个结构,其中包含了显示模式有关信息,主要有:
屏幕点阵 DWORD dwWidth、DWORD dwHeight;
色彩深度 DWORD ddpfPixelFormat.dwRGBBitCount
屏幕刷新频率 DWORD dwRefreshRate
(3)参数lpContex为用户上下文变量,设为NULL就可以了。
(4)参数EnumDisplayModesCallBack为回调函数指针,该回调函数规定有如下参数格式:
BOOL WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC
lpDDSurfaceDesc
LPVOID lpContext)
其中:lpDDSurfaceDesc为当前所枚举显示模式的信息,lpContext为用户上下文变量。
在dx1程序中,此回调函数负责将每次回调的显示模式信息显示到ComboBox2中,并记录到一个结构数组DisplayModes中。
2.2.2.6 设置DDraw2的显示方式
每当用户选择了一个显示模式并点击“设置DDraw2的显示方式”按钮后,dx1将使用RESULT
IdirectDraw2::SetDisplayMode方法改变显示方式。
lpDD2->SetDisplayModes(DWORD dwWidth,
DWORD dwHeight,
DWORD dwRGBCount,
DWORD dwRefreshRate,
DWORD dwFlags)
(1)参数dwWidth和dwHeght为显示指定方式的点阵。
(2)参数dwRGBCount为颜色深度,如:8(256色)、16(16位色)、24(真彩色)。
(3)参数dwRefreshRate为刷新频率,不关心时可以设置为0。
(4)参数dwFlags为使用DDSDM_STANDARDVGAMODE来设置Mode13。在dx1程序中始终设为0。
需要注意的是在IdirectDraw接口中,设置显示模式方法不支持dwRefreshRate和dwFlags这两个参数,所以,在有些资料中(包括C++Builder4的示例)均只介绍了DirectX3支持的IDirectDraw::SetDisplayMode(dwWidth,dwHeight,dwRGBCount)方法,请读者注意它们的区别。
2.2.2.7 退出dx1程序需要做的事
不要忘记释放lpDD2接口。LpDD2->Release();
2.2.3 dx1源程序
2.2.3.1 dx1主要文件的组成为:工程文件(dx1.bpr)、窗口文件(main.cpp)、头文件(main.h)。
2.2.3.2 头文件main.h
#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
(略)
private: // User declarations
LPDIRECTDRAW FAR lplpDD; /* 获得的 DirectDraw
接口指针 */
LPDIRECTDRAW2 FAR lplpDD2; /* 获得的 DirectDraw2
接口指针 */
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
2.2.3.3 程序文件main.cpp
#include <vcl.h>
#include "d:\tools\dx5sdk\sdk\inc\ddraw.h"
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
LPGUID FAR lpDevices[10]; /*
保存枚举设备的标识指针 */
struct DisplayModes { DWORD Width,Height,Depth,Rate;
} DisplayMode[100];
/* 保存显示设备支持的显示方式 */
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//设备枚举回调函数---------------------------------------------------------------------------
BOOL WINAPI EnumDeviceCallBack(GUID FAR
*lpGUID,LPSTR lpDevice,
LPSTR lpDeviceName,
LPVOID lpContext)
{ static char i=0;
lpDevices[i]=lpGUID;
i++;
Form1->ComboBox1->Items->Add((AnsiString)lpDevice+"--"+(AnsiString)lpDeviceName);
if(i<10)
return(DDENUMRET_OK);
else
return(DDENUMRET_CANCEL);
}
//枚举设备---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject
*Sender)
{
ComboBox1->Clear();
if(FAILED(DirectDrawEnumerate(EnumDeviceCallBack,NULL)))
Edit1->Text="Enumerate Devices
failed!";
else
Edit1->Text="Enumerate Devices OK!";
ComboBox1->ItemIndex=0;
Button1->Enabled=false;
Button2->Enabled=true;
}
//创建DirectDraw对象---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject
*Sender)
{
LPGUID FAR lpD=lpDevices[ComboBox1->ItemIndex];
if(FAILED(DirectDrawCreate(lpD,&lplpDD,NULL)))
Edit1->Text="DirectDraw Create
failed!";
else
{
Edit1->Text="DirectDraw Create OK!";
ComboBox1->Enabled=false;
Button2->Enabled=false;
Button3->Enabled=true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -