📄 20010322003.htm
字号:
WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC
lpDDSurfaceDesc <BR><BR>LPVOID
lpContext)<BR><BR>其中:lpDDSurfaceDesc为当前所枚举显示模式的信息,lpContext为用户上下文变量。<BR><BR>在dx1程序中,此回调函数负责将每次回调的显示模式信息显示到ComboBox2中,并记录到一个结构数组DisplayModes中。<BR><BR>2.2.2.6
设置DDraw2的显示方式<BR><BR>每当用户选择了一个显示模式并点击“设置DDraw2的显示方式”按钮后,dx1将使用RESULT
IdirectDraw2::SetDisplayMode方法改变显示方式。<BR><BR>lpDD2->SetDisplayModes(DWORD
dwWidth,<BR><BR>DWORD dwHeight,<BR><BR>DWORD dwRGBCount,<BR><BR>DWORD
dwRefreshRate,<BR><BR>DWORD
dwFlags)<BR><BR>(1)参数dwWidth和dwHeght为显示指定方式的点阵。<BR><BR>(2)参数dwRGBCount为颜色深度,如:8(256色)、16(16位色)、24(真彩色)。<BR><BR>(3)参数dwRefreshRate为刷新频率,不关心时可以设置为0。<BR><BR>(4)参数dwFlags为使用DDSDM_STANDARDVGAMODE来设置Mode13。在dx1程序中始终设为0。<BR><BR>需要注意的是在IdirectDraw接口中,设置显示模式方法不支持dwRefreshRate和dwFlags这两个参数,所以,在有些资料中(包括C++Builder4的示例)均只介绍了DirectX3支持的IDirectDraw::SetDisplayMode(dwWidth,dwHeight,dwRGBCount)方法,请读者注意它们的区别。<BR><BR>2.2.2.7
退出dx1程序需要做的事<BR><BR>不要忘记释放lpDD2接口。LpDD2->Release();<BR><BR>2.2.3
dx1源程序<BR><BR>2.2.3.1
dx1主要文件的组成为:工程文件(dx1.bpr)、窗口文件(main.cpp)、头文件(main.h)。<BR><BR>2.2.3.2
头文件main.h<BR><BR>#ifndef mainH<BR><BR>#define
mainH<BR><BR>//---------------------------------------------------------------------------<BR><BR>#include
<Classes.hpp><BR><BR>#include <Controls.hpp><BR><BR>#include
<StdCtrls.hpp><BR><BR>#include
<Forms.hpp><BR><BR>//---------------------------------------------------------------------------<BR><BR>class
TForm1 : public TForm<BR><BR>{<BR><BR>__published: // IDE-managed
Components<BR><BR>(略)<BR><BR>private: // User
declarations<BR><BR>LPDIRECTDRAW FAR lplpDD; /* 获得的 DirectDraw 接口指针
*/<BR><BR>LPDIRECTDRAW2 FAR lplpDD2; /* 获得的 DirectDraw2 接口指针
*/<BR><BR>public: // User declarations<BR><BR>__fastcall
TForm1(TComponent*
Owner);<BR><BR>};<BR><BR>//---------------------------------------------------------------------------<BR><BR>extern
PACKAGE TForm1
*Form1;<BR><BR>//---------------------------------------------------------------------------<BR><BR>#endif<BR><BR>2.2.3.3
程序文件main.cpp<BR><BR>#include <vcl.h><BR><BR>#include
"d:\tools\dx5sdk\sdk\inc\ddraw.h"<BR><BR>#pragma hdrstop<BR><BR>#include
"main.h"<BR><BR>//---------------------------------------------------------------------------<BR><BR>#pragma
package(smart_init)<BR><BR>#pragma resource "*.dfm"<BR><BR>TForm1
*Form1;<BR><BR>LPGUID FAR lpDevices[10]; /* 保存枚举设备的标识指针 */<BR><BR>struct
DisplayModes { DWORD Width,Height,Depth,Rate; }
DisplayMode[100];<BR><BR>/* 保存显示设备支持的显示方式
*/<BR><BR>//---------------------------------------------------------------------------<BR><BR>__fastcall
TForm1::TForm1(TComponent* Owner)<BR><BR>:
TForm(Owner)<BR><BR>{<BR><BR>}<BR><BR>//设备枚举回调函数---------------------------------------------------------------------------<BR><BR>BOOL
WINAPI EnumDeviceCallBack(GUID FAR *lpGUID,LPSTR lpDevice,<BR><BR>LPSTR
lpDeviceName,<BR><BR>LPVOID lpContext)<BR><BR>{ static char
i=0;<BR><BR>lpDevices[i]=lpGUID;<BR><BR>i++;<BR><BR>Form1->ComboBox1->Items->Add((AnsiString)lpDevice+"--"+(AnsiString)lpDeviceName);<BR><BR>if(i<10)<BR><BR>return(DDENUMRET_OK);<BR><BR>else<BR><BR>return(DDENUMRET_CANCEL);<BR><BR>}<BR><BR>//枚举设备---------------------------------------------------------------------------<BR><BR>void
__fastcall TForm1::Button1Click(TObject
*Sender)<BR><BR>{<BR><BR>ComboBox1->Clear();<BR><BR>if(FAILED(DirectDrawEnumerate(EnumDeviceCallBack,NULL)))<BR><BR>Edit1->Text="Enumerate
Devices failed!";<BR><BR>else<BR><BR>Edit1->Text="Enumerate Devices
OK!";<BR><BR>ComboBox1->ItemIndex=0;<BR><BR>Button1->Enabled=false;<BR><BR>Button2->Enabled=true;<BR><BR>}<BR><BR>//创建DirectDraw对象---------------------------------------------------------------------------<BR><BR>void
__fastcall TForm1::Button2Click(TObject *Sender)<BR><BR>{<BR><BR>LPGUID
FAR
lpD=lpDevices[ComboBox1->ItemIndex];<BR><BR>if(FAILED(DirectDrawCreate(lpD,&lplpDD,NULL)))<BR><BR>Edit1->Text="DirectDraw
Create failed!";<BR><BR>else<BR><BR>{<BR><BR>Edit1->Text="DirectDraw
Create
OK!";<BR><BR>ComboBox1->Enabled=false;<BR><BR>Button2->Enabled=false;<BR><BR>Button3->Enabled=true;<BR><BR>}<BR><BR>}<BR><BR>//获得IDirectDraw2接口---------------------------------------------------------------------------<BR><BR>void
__fastcall TForm1::Button3Click(TObject
*Sender)<BR><BR>{<BR><BR>if(FAILED(lplpDD->QueryInterface(IID_IDirectDraw2,(LPVOID
*)&lplpDD2)))<BR><BR>Edit1->Text="Get IDriectDraw2 Interface
Failed!";<BR><BR>else<BR><BR>{<BR><BR>Edit1->Text="Get IDriectDraw2
Interface OK!";<BR><BR>lplpDD->Release(); /* 释放IdirectDraw接口
*/<BR><BR>Button3->Enabled=false;<BR><BR>Button4->Enabled=true;<BR><BR>}<BR><BR>}<BR><BR>//设置协作级别---------------------------------------------------------------------------<BR><BR>void
__fastcall TForm1::Button4Click(TObject *Sender)<BR><BR>{<BR><BR>DWORD
dwFlags=0;<BR><BR>if(CheckBox1->Checked)
dwFlags=dwFlags|DDSCL_ALLOWMODEX;<BR><BR>if(CheckBox2->Checked)
dwFlags=dwFlags|DDSCL_ALLOWREBOOT;<BR><BR>if(CheckBox3->Checked)
dwFlags=dwFlags|DDSCL_EXCLUSIVE;<BR><BR>if(CheckBox4->Checked)
dwFlags=dwFlags|DDSCL_FULLSCREEN;<BR><BR>if(CheckBox5->Checked)
dwFlags=dwFlags|DDSCL_NORMAL;<BR><BR>if(CheckBox6->Checked)
dwFlags=dwFlags|DDSCL_NOWINDOWCHANGES;<BR><BR>if(FAILED(lplpDD2->SetCooperativeLevel(Handle,dwFlags)))<BR><BR>Edit1->Text="Set
set cooperative level
Failed!";<BR><BR>else<BR><BR>{ <BR><BR>Edit1->Text="Set
cooperative level
OK!";<BR><BR>GroupBox2->Enabled=false;<BR><BR>Button4->Enabled=false;<BR><BR>Button5->Enabled=true;<BR><BR>}<BR><BR>}<BR><BR>//枚举显示模式的回调函数---------------------------------------------------------------------------<BR><BR>BOOL
WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC lpDesc,<BR><BR>LPVOID
lpContext)<BR><BR>{<BR><BR>static int i=0;<BR><BR>char
buff[256];<BR><BR>wsprintf(buff,"%dx%dx%dx%d",<BR><BR>lpDesc->dwWidth,<BR><BR>lpDesc->dwHeight,<BR><BR>lpDesc->ddpfPixelFormat.dwRGBBitCount,<BR><BR>lpDesc->dwRefreshRate);<BR><BR>Form1->ComboBox2->Items->Add(buff);<BR><BR>DisplayMode[i].Width=lpDesc->dwWidth;<BR><BR>DisplayMode[i].Height=lpDesc->dwHeight;<BR><BR>DisplayMode[i].Depth=lpDesc->ddpfPixelFormat.dwRGBBitCount;<BR><BR>DisplayMode[i].Rate=lpDesc->dwRefreshRate;<BR><BR>i++;<BR><BR>if(i<100)<BR><BR>return(DDENUMRET_OK);<BR><BR>else<BR><BR>return(DDENUMRET_CANCEL);<BR><BR>}<BR><BR>//枚举显示模式---------------------------------------------------------------------------<BR><BR>void
__fastcall TForm1::Button5Click(TObject
*Sender)<BR><BR>{<BR><BR>ComboBox2->Clear();<BR><BR>if(FAILED(lplpDD2->EnumDisplayModes(DDEDM_STANDARDVGAMODES,<BR><BR>NULL,<BR><BR>NULL,<BR><BR>(LPDDENUMMODESCALLBACK)EnumDisplayModesCallBack)))<BR><BR>Edit1->Text="Enumerate
Display Modes
failed!";<BR><BR>else<BR><BR>{<BR><BR>Edit1->Text="Enumerate Display
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -