⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 20010322003.htm

📁 C++Builder教学大全
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC 

      lpDDSurfaceDesc&nbsp;<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-&gt;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-&gt;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 

      &lt;Classes.hpp&gt;<BR><BR>#include &lt;Controls.hpp&gt;<BR><BR>#include 

      &lt;StdCtrls.hpp&gt;<BR><BR>#include 

      &lt;Forms.hpp&gt;<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 &lt;vcl.h&gt;<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-&gt;ComboBox1-&gt;Items-&gt;Add((AnsiString)lpDevice+"--"+(AnsiString)lpDeviceName);<BR><BR>if(i&lt;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-&gt;Clear();<BR><BR>if(FAILED(DirectDrawEnumerate(EnumDeviceCallBack,NULL)))<BR><BR>Edit1-&gt;Text="Enumerate 

      Devices failed!";<BR><BR>else<BR><BR>Edit1-&gt;Text="Enumerate Devices 

      OK!";<BR><BR>ComboBox1-&gt;ItemIndex=0;<BR><BR>Button1-&gt;Enabled=false;<BR><BR>Button2-&gt;Enabled=true;<BR><BR>}<BR><BR>//创建DirectDraw对象---------------------------------------------------------------------------<BR><BR>void 

      __fastcall TForm1::Button2Click(TObject *Sender)<BR><BR>{<BR><BR>LPGUID 

      FAR 

      lpD=lpDevices[ComboBox1-&gt;ItemIndex];<BR><BR>if(FAILED(DirectDrawCreate(lpD,&amp;lplpDD,NULL)))<BR><BR>Edit1-&gt;Text="DirectDraw 

      Create failed!";<BR><BR>else<BR><BR>{<BR><BR>Edit1-&gt;Text="DirectDraw 

      Create 

      OK!";<BR><BR>ComboBox1-&gt;Enabled=false;<BR><BR>Button2-&gt;Enabled=false;<BR><BR>Button3-&gt;Enabled=true;<BR><BR>}<BR><BR>}<BR><BR>//获得IDirectDraw2接口---------------------------------------------------------------------------<BR><BR>void 

      __fastcall TForm1::Button3Click(TObject 

      *Sender)<BR><BR>{<BR><BR>if(FAILED(lplpDD-&gt;QueryInterface(IID_IDirectDraw2,(LPVOID 

      *)&amp;lplpDD2)))<BR><BR>Edit1-&gt;Text="Get IDriectDraw2 Interface 

      Failed!";<BR><BR>else<BR><BR>{<BR><BR>Edit1-&gt;Text="Get IDriectDraw2 

      Interface OK!";<BR><BR>lplpDD-&gt;Release(); /* 释放IdirectDraw接口 

      */<BR><BR>Button3-&gt;Enabled=false;<BR><BR>Button4-&gt;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-&gt;Checked) 

      dwFlags=dwFlags|DDSCL_ALLOWMODEX;<BR><BR>if(CheckBox2-&gt;Checked) 

      dwFlags=dwFlags|DDSCL_ALLOWREBOOT;<BR><BR>if(CheckBox3-&gt;Checked) 

      dwFlags=dwFlags|DDSCL_EXCLUSIVE;<BR><BR>if(CheckBox4-&gt;Checked) 

      dwFlags=dwFlags|DDSCL_FULLSCREEN;<BR><BR>if(CheckBox5-&gt;Checked) 

      dwFlags=dwFlags|DDSCL_NORMAL;<BR><BR>if(CheckBox6-&gt;Checked) 

      dwFlags=dwFlags|DDSCL_NOWINDOWCHANGES;<BR><BR>if(FAILED(lplpDD2-&gt;SetCooperativeLevel(Handle,dwFlags)))<BR><BR>Edit1-&gt;Text="Set 

      set cooperative level 

      Failed!";<BR><BR>else<BR><BR>{&nbsp;<BR><BR>Edit1-&gt;Text="Set 

      cooperative level 

      OK!";<BR><BR>GroupBox2-&gt;Enabled=false;<BR><BR>Button4-&gt;Enabled=false;<BR><BR>Button5-&gt;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-&gt;dwWidth,<BR><BR>lpDesc-&gt;dwHeight,<BR><BR>lpDesc-&gt;ddpfPixelFormat.dwRGBBitCount,<BR><BR>lpDesc-&gt;dwRefreshRate);<BR><BR>Form1-&gt;ComboBox2-&gt;Items-&gt;Add(buff);<BR><BR>DisplayMode[i].Width=lpDesc-&gt;dwWidth;<BR><BR>DisplayMode[i].Height=lpDesc-&gt;dwHeight;<BR><BR>DisplayMode[i].Depth=lpDesc-&gt;ddpfPixelFormat.dwRGBBitCount;<BR><BR>DisplayMode[i].Rate=lpDesc-&gt;dwRefreshRate;<BR><BR>i++;<BR><BR>if(i&lt;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-&gt;Clear();<BR><BR>if(FAILED(lplpDD2-&gt;EnumDisplayModes(DDEDM_STANDARDVGAMODES,<BR><BR>NULL,<BR><BR>NULL,<BR><BR>(LPDDENUMMODESCALLBACK)EnumDisplayModesCallBack)))<BR><BR>Edit1-&gt;Text="Enumerate 

      Display Modes 

      failed!";<BR><BR>else<BR><BR>{<BR><BR>Edit1-&gt;Text="Enumerate Display 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -