📄 ddhandler.cs
字号:
#region using
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX.DirectDraw;
#endregion
namespace DDGameHelper
{
/// <summary>
/// DirectDrawHandler
/// </summary>
public class DDHandler
{
#region 受保护的成员
/// <summary>
/// 指定一个 form 用于图像输出
/// </summary>
protected Form _ownerForm;
/// <summary>
/// DirectDraw 设备
/// </summary>
protected Device _device = null;
/// <summary>
/// 将输出 bind 到一个 form 的显示区域
/// </summary>
protected Clipper _clipper = null;
/// <summary>
/// 主画布
/// </summary>
protected Surface _surfacePrimary = null;
/// <summary>
/// 离屏画布
/// </summary>
protected Surface _surfaceSecondary = null;
/// <summary>
/// 输出用form的内部尺寸
/// </summary>
protected Rectangle _clientSize;
/// <summary>
/// 是否全屏显示
/// </summary>
protected bool _isFullScreen;
#endregion
#region 公共成员定义
/// <summary>
/// 当前 DirectDraw 的设备
/// </summary>
public Device Device{get{return _device;}}
/// <summary>
/// 用于绘制图像的离屏画布
/// </summary>
public Surface RenderSurface{get{return _surfaceSecondary;}}
/// <summary>
/// 用于输出到显示器的主画布
/// </summary>
public Surface PrimarySurface{get{return _surfacePrimary;}}
/// <summary>
/// 是否以全屏方式输出
/// </summary>
public Boolean IsFullScreen{get{return _isFullScreen;}set{_isFullScreen=value;}}
#endregion
#region 构造函数。负责初始化 DirectDraw 设备, Surface 并将 DirectDraw 设备 bind 到 form
/// <summary>
/// 构造函数。负责初始化 DDraw 设备, Surface 并将 DirectDraw 设备 bind 到 form
/// </summary>
public DDHandler(Form ownerForm)
{
_ownerForm = ownerForm;
_clientSize=new Rectangle(0,0,_ownerForm.ClientSize.Width,_ownerForm.ClientSize.Height);
_isFullScreen=false;
}
#endregion
#region 创建并初始化
/// <summary>
/// 创建并初始化 device
/// </summary>
public bool Init(ref string errmsg)
{
_device = new Device();
if(_isFullScreen)
{
_ownerForm.FormBorderStyle= FormBorderStyle.None;
_device.SetCooperativeLevel(_ownerForm, CooperativeLevelFlags.FullscreenExclusive);
try
{
_device.SetDisplayMode(_clientSize.Width, _clientSize.Height, 16, 0, true);// w*h 32位色默认刷新,标准vesa模式
}
catch(UnsupportedException)
{
errmsg="Device doesn't support required mode. Sample will now exit.";
return false;
}
}
else
{
_device.SetCooperativeLevel(_ownerForm, CooperativeLevelFlags.Normal);
}
CreateSurfaces();
return true;
}
/// <summary>
/// 创建并初始化 surface
/// </summary>
public void CreateSurfaces()
{
SurfaceDescription desc = new SurfaceDescription();
_clipper = new Clipper(_device);
_clipper.Window = _ownerForm; //将输出 bind 到 form 的显示区域
desc.SurfaceCaps.PrimarySurface = true;
if(_isFullScreen) //全屏方式的图像输出可以利用到硬件加速
{
desc.SurfaceCaps.Flip = true;
desc.SurfaceCaps.Complex = true;
desc.BackBufferCount = 1;
}
_surfacePrimary = new Surface(desc, _device);
_surfacePrimary.Clipper = _clipper;
desc.Clear();
if(_isFullScreen)
{
//全屏方式的 surface 定义
desc.SurfaceCaps.BackBuffer = true;
_surfaceSecondary = _surfacePrimary.GetAttachedSurface(desc.SurfaceCaps);
}
else
{
//窗口方式的 surface 定义
desc.Width = _surfacePrimary.SurfaceDescription.Width;
desc.Height = _surfacePrimary.SurfaceDescription.Height;
desc.SurfaceCaps.OffScreenPlain = true;
_surfaceSecondary = new Surface(desc, _device);
}
}
#endregion
#region 将离屏画布的内容 flip 到主输出画布上
/// <summary>
/// 将离屏画布的内容 flip 到主输出画布上
/// </summary>
public void Flip()
{
if (!_ownerForm.Created)return; // 此步确保 form 已经创建完成
if (_surfacePrimary == null || _surfaceSecondary == null)return; // 此步确保 surface 是否丢失
try // 将 render surface 的内容 整到 primary surface 上去(具体整法依赖于窗口或是全屏模式)
{
if(_isFullScreen)
{
_surfacePrimary.Flip(_surfaceSecondary, FlipFlags.Wait);
}
else
{
Rectangle rect=new Rectangle(_ownerForm.PointToScreen(new Point(0,0)),new Size(_ownerForm.ClientSize.Width,_ownerForm.ClientSize.Height));
_surfacePrimary.Draw(rect, _surfaceSecondary, _clientSize, DrawFlags.Wait);
}
}
catch (SurfaceLostException)
{
CreateSurfaces(); //如果 surface 丢失,重建之
}
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -