(原創) 如何使用C#與DrectDraw在Full-Screen模式下繪製直線? (.NET) (DirectX)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectDraw;
namespace DrectDrawLab {
public partial class DrawFullScreenLine : Form {
int _width = 1280;
int _height = 800;
// DirectDraw Device
Device _device = null;
Clipper _clipper = null;
// Front Surface
Surface _frontSurface = null;
// Back Surface
Surface _backSurface = null;
public static void Main() {
DrawFullScreenLine frm = new DrawFullScreenLine();
Application.Exit();
}
public DrawFullScreenLine() {
InitializeComponent();
// Create DirectDraw Device
this.createDevice();
// Create Clipper
this.createClipper();
// Create Front Surface
this.createFrontSurface();
// Create Back Surface
this.createBackSurface();
// Show the window
this.Show();
// Start message loop
this.startLoop();
}
// Step 1. Device Creation
void createDevice() {
this.SetBounds(0, 0, _width, _height);
this.FormBorderStyle = FormBorderStyle.None;
// Create new DirectDraw device
_device = new Device();
// Set FullScreen mode, owner is this form
_device.SetCooperativeLevel(this, CooperativeLevelFlags.FullscreenExclusive);
// Set width & height & color bit
_device.SetDisplayMode(_width, _height, 16, 0, false);
}
// Step 2.Clipper Creation
void createClipper() {
_clipper = new Clipper(_device);
_clipper.ClipList = new Rectangle[] {new Rectangle(0, 0, _width, _height)};
}
// Step 3.Front Surface Creation
void createFrontSurface() {
// Create new SurfaceDescription to create Surface
SurfaceDescription desc = new SurfaceDescription();
// To create new Front Surface
desc.SurfaceCaps.PrimarySurface = true;
// To create new Back Buffer Surface
desc.SurfaceCaps.Complex = true;
// To enable Flip operation
desc.SurfaceCaps.Flip = true;
// Set Back Buffer count
desc.BackBufferCount = 1;
// Create new Front Surface
_frontSurface = new Surface(desc, _device);
// Fill Front Surface with color
_frontSurface.ColorFill(Color.Pink);
}
// Step 4.Back Surface Creation
void createBackSurface() {
// Create new SurfaceCaps to describe Surface Capabilities
SurfaceCaps caps = new SurfaceCaps();
// Enable BackBuffer
caps.BackBuffer = true;
// Get the attached surface that matches the caps, which will be the backbuffer.
_backSurface = _frontSurface.GetAttachedSurface(caps);
// Fill Back Surface with Color
_backSurface.ColorFill(Color.Pink);
// Set Back Surface fore color
_backSurface.ForeColor = Color.Black;
// Set clipper associated to Back Surface
_backSurface.Clipper = _clipper;
}
// Step 5.Draw line
void renderGraphics() {
if (!this.Created)
return;
if (_frontSurface == null || _backSurface == null)
return;
// Fill back color
_backSurface.ColorFill(Color.Pink);
// Fill fore color
_backSurface.FillColor = Color.Blue;
// Draw line by DirectDraw
_backSurface.DrawLine(0, 0, 300, 300);
// Draw Front Surface by Back Surface
Rectangle srcRect = new Rectangle(0, 0, _width, _height);
_frontSurface.Draw(this.RectangleToScreen(this.ClientRectangle), _backSurface, srcRect, DrawFlags.DoNotWait);
}
// Message Loop
void startLoop() {
while (this.Created) {
this.renderGraphics();
Application.DoEvents();
}
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectDraw;
namespace DrectDrawLab {
public partial class DrawFullScreenLine : Form {
int _width = 1280;
int _height = 800;
// DirectDraw Device
Device _device = null;
Clipper _clipper = null;
// Front Surface
Surface _frontSurface = null;
// Back Surface
Surface _backSurface = null;
public static void Main() {
DrawFullScreenLine frm = new DrawFullScreenLine();
Application.Exit();
}
public DrawFullScreenLine() {
InitializeComponent();
// Create DirectDraw Device
this.createDevice();
// Create Clipper
this.createClipper();
// Create Front Surface
this.createFrontSurface();
// Create Back Surface
this.createBackSurface();
// Show the window
this.Show();
// Start message loop
this.startLoop();
}
// Step 1. Device Creation
void createDevice() {
this.SetBounds(0, 0, _width, _height);
this.FormBorderStyle = FormBorderStyle.None;
// Create new DirectDraw device
_device = new Device();
// Set FullScreen mode, owner is this form
_device.SetCooperativeLevel(this, CooperativeLevelFlags.FullscreenExclusive);
// Set width & height & color bit
_device.SetDisplayMode(_width, _height, 16, 0, false);
}
// Step 2.Clipper Creation
void createClipper() {
_clipper = new Clipper(_device);
_clipper.ClipList = new Rectangle[] {new Rectangle(0, 0, _width, _height)};
}
// Step 3.Front Surface Creation
void createFrontSurface() {
// Create new SurfaceDescription to create Surface
SurfaceDescription desc = new SurfaceDescription();
// To create new Front Surface
desc.SurfaceCaps.PrimarySurface = true;
// To create new Back Buffer Surface
desc.SurfaceCaps.Complex = true;
// To enable Flip operation
desc.SurfaceCaps.Flip = true;
// Set Back Buffer count
desc.BackBufferCount = 1;
// Create new Front Surface
_frontSurface = new Surface(desc, _device);
// Fill Front Surface with color
_frontSurface.ColorFill(Color.Pink);
}
// Step 4.Back Surface Creation
void createBackSurface() {
// Create new SurfaceCaps to describe Surface Capabilities
SurfaceCaps caps = new SurfaceCaps();
// Enable BackBuffer
caps.BackBuffer = true;
// Get the attached surface that matches the caps, which will be the backbuffer.
_backSurface = _frontSurface.GetAttachedSurface(caps);
// Fill Back Surface with Color
_backSurface.ColorFill(Color.Pink);
// Set Back Surface fore color
_backSurface.ForeColor = Color.Black;
// Set clipper associated to Back Surface
_backSurface.Clipper = _clipper;
}
// Step 5.Draw line
void renderGraphics() {
if (!this.Created)
return;
if (_frontSurface == null || _backSurface == null)
return;
// Fill back color
_backSurface.ColorFill(Color.Pink);
// Fill fore color
_backSurface.FillColor = Color.Blue;
// Draw line by DirectDraw
_backSurface.DrawLine(0, 0, 300, 300);
// Draw Front Surface by Back Surface
Rectangle srcRect = new Rectangle(0, 0, _width, _height);
_frontSurface.Draw(this.RectangleToScreen(this.ClientRectangle), _backSurface, srcRect, DrawFlags.DoNotWait);
}
// Message Loop
void startLoop() {
while (this.Created) {
this.renderGraphics();
Application.DoEvents();
}
}
}
}