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

📄 ddhandler.cs

📁 这是网上下载的很好的串口发短信的程序! 是用VC++来做的
💻 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 + -