?? dxmut.cs
字號:
//--------------------------------------------------------------------------------------
// File: DXMUT.cs
//
// DirectX SDK Managed Direct3D sample framework
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
using System;
using System.Collections;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace Microsoft.Samples.DirectX.UtilityToolkit
{
/// <summary>
/// Managed Utility Framework Class
/// </summary>
public sealed class Framework : IDisposable
{
#region Class Data
// Constants for command line arguments
private const string CmdAdapter = "adapter";
private const string CmdWindowed = "windowed";
private const string CmdFullscreen = "fullscreen";
private const string CmdForceHardware = "forcehal";
private const string CmdForceRef = "forceref";
private const string CmdPureHwVp = "forcepurehwvp";
private const string CmdForceHwVp = "forcehwvp";
private const string CmdForceSwVp = "forceswvp";
private const string CmdWidth = "width";
private const string CmdHeight = "height";
private const string CmdStartx = "startx";
private const string CmdStarty = "starty";
private const string CmdConstantFrame = "constantframetime";
private const string CmdQuitAfterFrame = "quitafterframe";
private const string CmdNoErrorBoxes = "noerrormsgboxes";
// Delegate used for disposing application
private delegate void DisposeDelegate();
// Constants for minimum window size
private const int MinimumWindowSizeX = 200;
private const int MinimumWindowSizeY = 200;
public const int DefaultSizeWidth = 640;
public const int DefaultSizeHeight = 480;
// Default starting size
private static readonly System.Drawing.Size DefaultStartingSize = new System.Drawing.Size(DefaultSizeWidth, DefaultSizeHeight);
internal static readonly System.Drawing.Size MinWindowSize = new System.Drawing.Size(MinimumWindowSizeX, MinimumWindowSizeY);
public static readonly IntPtr TrueIntPtr = new IntPtr(1);
private const string WindowClassName = "ManagedDirect3DWindowClass";
// What about the stored data?
private FrameworkData State;
// Last shown error
private Exception lastDisplayedMessage = null;
// Has the framework been disposed already
private bool isDisposed = false;
// Did the toggle fullscreen happen when maximized?
private bool toggleMaximized = false;
#endregion
#region Creation
/// <summary>
/// Constructor, init data here
/// </summary>
public Framework()
{
State = new FrameworkData();
}
#endregion
#region Setting up callbacks
// Interface 'callbacks'
public void SetCallbackInterface(IFrameworkCallback callback) { State.CallbackInterface = callback; }
public void SetDeviceCreationInterface(IDeviceCreation callback) { State.DeviceCreationInterface = callback; }
// Event 'callbacks'
/// <summary>The event fired for disposing of the device</summary>
public event EventHandler Disposing;
/// <summary>The event fired for when the device is lost</summary>
public event EventHandler DeviceLost;
/// <summary>The event fired for when the device is created</summary>
public event DeviceEventHandler DeviceCreated;
/// <summary>The event fired for when the device is reset</summary>
public event DeviceEventHandler DeviceReset;
public void SetWndProcCallback(WndProcCallback callback) { State.WndProcFunction = callback; }
#endregion
/// <summary>
/// Optionally parses the command line and sets if default hotkeys are handled
/// Possible command line parameters are:
/// -adapter:# forces app to use this adapter # (fails if the adapter doesn't exist)
/// -windowed forces app to start windowed
/// -fullscreen forces app to start full screen
/// -forceHardware forces app to use Hardware (fails if Hardware doesn't exist)
/// -forceReference forces app to use Reference (fails if Reference doesn't exist)
/// -forcepurehwvp forces app to use pure HWVP (fails if device doesn't support it)
/// -forcehwvp forces app to use HWVP (fails if device doesn't support it)
/// -forceswvp forces app to use SWVP
/// -width:# forces app to use # for width. for full screen, it will pick the closest possible supported mode
/// -height:# forces app to use # for height. for full screen, it will pick the closest possible supported mode
/// -startx:# forces app to use # for the x coord of the window position for windowed mode
/// -starty:# forces app to use # for the y coord of the window position for windowed mode
/// -constantframetime:# forces app to use constant frame time, where # is the time/frame in seconds
/// -quitafterframe:x forces app to quit after # frames
/// -noerrormsgboxes prevents the display of message boxes generated by the framework so the application can be run without user interaction
///
/// Hotkeys handled by default are:
/// ESC app exits
/// Alt-Enter toggle between full screen & windowed
/// F2 device selection dialog
/// F3 toggle Hardware/Reference
/// F8 toggle wire-frame mode
/// Pause pauses time
/// </summary>
public void Initialize(bool isParsingCommandLine, bool handleDefaultKeys, bool showMessageBoxOnError)
{
State.WasInitCalled = true;
// Turn off event handling for the MDX runtime, this will
// increase performance and remove potential working set issues
Device.IsUsingEventHandlers = false;
// Increase
// Store this data
State.IsShowingMsgBoxOnError = showMessageBoxOnError;
State.IsHandlingDefaultHotkeys = handleDefaultKeys;
// Reset the timer period (ignore any failures)
try
{ NativeMethods.timeBeginPeriod(1); }
catch { System.Diagnostics.Debugger.Log(9, string.Empty, "Could not set time period.\r\n" ); }
if (isParsingCommandLine)
{
ParseCommandLine();
}
// Reset the timer
FrameworkTimer.Reset();
State.IsInited = true;
}
/// <summary>
/// Parses the command line for parameters. See Initialize() for list
/// </summary>
private void ParseCommandLine()
{
string[] args = System.Environment.GetCommandLineArgs(); // Ignore the first one since that's the executable name
// Go through each argument, skipping the first one
for (int i = 1; i < args.Length; i++)
{
string argument = string.Empty;
if ((args[i].StartsWith("-")) || (args[i].StartsWith("-")))
{
argument = args[i].Substring(1, args[i].Length - 1);
}
else
continue;
if (argument.ToLower().StartsWith(CmdAdapter + ":"))
{
try
{ State.OverrideAdapterOrdinal = int.Parse(argument.Substring(CmdAdapter.Length + 1, argument.Length - (CmdAdapter.Length + 1))); }
catch (FormatException){}
}
else if (string.Compare(argument, CmdWindowed, true) == 0)
{
State.IsOverridingWindowed = true;
}
else if (string.Compare(argument, CmdFullscreen, true) == 0)
{
State.IsOverridingFullScreen = true;
}
else if (string.Compare(argument, CmdForceHardware, true) == 0)
{
State.IsOverridingForceHardware = true;
}
else if (string.Compare(argument, CmdForceRef, true) == 0)
{
State.IsOverridingForceReference = true;
}
else if (string.Compare(argument, CmdPureHwVp, true) == 0)
{
State.IsOverridingForcePureHardwareVertexProcessing = true;
}
else if (string.Compare(argument, CmdForceHwVp, true) == 0)
{
State.IsOverridingForceHardwareVertexProcessing = true;
}
else if (string.Compare(argument, CmdForceSwVp, true) == 0)
{
State.IsOverridingForceSoftwareVertexProcessing = true;
}
else if (argument.ToLower().StartsWith(CmdWidth + ":"))
{
try
{ State.OverrideWidth = int.Parse(argument.Substring(CmdWidth.Length + 1, argument.Length - (CmdWidth.Length + 1))); }
catch (FormatException){}
}
else if (argument.ToLower().StartsWith(CmdHeight + ":"))
{
try
{ State.OverrideHeight = int.Parse(argument.Substring(CmdHeight.Length + 1, argument.Length - (CmdHeight.Length + 1))); }
catch (FormatException){}
}
else if (argument.ToLower().StartsWith(CmdStartx + ":"))
{
try
{ State.OverrideStartX = int.Parse(argument.Substring(CmdStartx.Length + 1, argument.Length - (CmdStartx.Length + 1))); }
catch (FormatException){}
}
else if (argument.ToLower().StartsWith(CmdStarty + ":"))
{
try
{ State.OverrideStartY = int.Parse(argument.Substring(CmdStarty.Length + 1, argument.Length - (CmdStarty.Length + 1))); }
catch (FormatException){}
}
else if (argument.ToLower().StartsWith(CmdConstantFrame + ":"))
{
float timePerFrame = 0.033f; // Default to this time
try
{
timePerFrame = float.Parse(argument.Substring(CmdConstantFrame.Length + 1, argument.Length - (CmdConstantFrame.Length + 1)));
}
catch (FormatException){}
State.OverrideConstantTimePerFrame = timePerFrame;
State.IsOverridingConstantFrameTime = true;
}
else if (argument.ToLower().StartsWith(CmdQuitAfterFrame + ":"))
{
try
{ State.OverrideQuitAfterFrame = int.Parse(argument.Substring(CmdQuitAfterFrame.Length + 1, argument.Length - (CmdQuitAfterFrame.Length + 1))); }
catch (FormatException){}
}
else if (string.Compare(argument, CmdNoErrorBoxes, true) == 0)
{
State.IsShowingMsgBoxOnError = false;
}
else
System.Diagnostics.Debugger.Log(9, string.Empty, string.Format("Unrecognized flag: {0}\r\n", argument));
}
}
/// <summary>
/// Creates a window with the specified title, icon, menu, and starting position. If Init hasn't been
/// called, this will call with default params. Instead of calling this, you can call SetWindow
/// to use an existing window
/// </summary>
public void CreateWindow(string windowTitle, System.Drawing.Icon icon,
System.Windows.Forms.MainMenu menu, int x, int y)
{
if (State.IsInsideDeviceCallback)
throw new InvalidOperationException("You cannot create a window from inside a callback.");
State.WasWindowCreateCalled = true;
// Are we inited?
if (!State.IsInited)
{
// If Init was already called and failed, fail again
if (State.WasInitCalled)
{
throw new InvalidOperationException("Initialize was already called and failed.");
}
// Call initialize with default params
Initialize(true, true, true);
}
// Is there already a window created?
if (State.WindowFocus == null)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -