📄 dxmutgui.cs
字号:
//--------------------------------------------------------------------------------------
// File: DXMUTGui.cs
//
// DirectX SDK Managed Direct3D GUI Sample Code
//
// 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>
/// Predefined control types
/// </summary>
public enum ControlType
{
StaticText,
Button,
CheckBox,
RadioButton,
ComboBox,
Slider,
ListBox,
EditBox,
Scrollbar,
}
/// <summary>
/// Possible states of a control
/// </summary>
public enum ControlState
{
Normal,
Disabled,
Hidden,
Focus,
MouseOver,
Pressed,
LastState // Should always be last
}
/// <summary>
/// Blends colors
/// </summary>
public struct BlendColor
{
public ColorValue[] States; // Modulate colors for all possible control states
public ColorValue Current; // Current color
/// <summary>Initialize the color blending</summary>
public void Initialize(ColorValue defaultColor, ColorValue disabledColor, ColorValue hiddenColor)
{
// Create the array
States = new ColorValue[(int)ControlState.LastState];
for(int i = 0; i < States.Length; i++)
{
States[i] = defaultColor;
}
// Store the data
States[(int)ControlState.Disabled] = disabledColor;
States[(int)ControlState.Hidden] = hiddenColor;
Current = hiddenColor;
}
/// <summary>Initialize the color blending</summary>
public void Initialize(ColorValue defaultColor) { Initialize( defaultColor, new ColorValue(0.5f, 0.5f, 0.5f, 0.75f),new ColorValue()); }
/// <summary>Blend the colors together</summary>
public void Blend(ControlState state, float elapsedTime, float rate)
{
if ((States == null) || (States.Length == 0) )
return; // Nothing to do
ColorValue destColor = States[(int)state];
Current = ColorOperator.Lerp(Current, destColor, 1.0f - (float)Math.Pow(rate, 30 * elapsedTime) );
}
/// <summary>Blend the colors together</summary>
public void Blend(ControlState state, float elapsedTime) { Blend(state, elapsedTime, 0.7f); }
}
/// <summary>
/// Contains all the display information for a given control type
/// </summary>
public struct ElementHolder
{
public ControlType ControlType;
public uint ElementIndex;
public Element Element;
}
/// <summary>
/// Contains all the display tweakables for a sub-control
/// </summary>
public class Element : ICloneable
{
#region Magic Numbers
#endregion
#region Instance Data
public uint TextureIndex; // Index of the texture for this Element
public uint FontIndex; // Index of the font for this Element
public DrawTextFormat textFormat; // The Format argument to draw text
public System.Drawing.Rectangle textureRect; // Bounding rectangle of this element on the composite texture
public BlendColor TextureColor;
public BlendColor FontColor;
#endregion
/// <summary>Set the texture</summary>
public void SetTexture(uint tex, System.Drawing.Rectangle texRect, ColorValue defaultTextureColor)
{
// Store data
TextureIndex = tex;
textureRect = texRect;
TextureColor.Initialize(defaultTextureColor);
}
/// <summary>Set the texture</summary>
public void SetTexture(uint tex, System.Drawing.Rectangle texRect) { SetTexture(tex, texRect, Dialog.WhiteColorValue); }
/// <summary>Set the font</summary>
public void SetFont(uint font, ColorValue defaultFontColor, DrawTextFormat format)
{
// Store data
FontIndex = font;
textFormat = format;
FontColor.Initialize(defaultFontColor);
}
/// <summary>Set the font</summary>
public void SetFont(uint font){ SetFont(font, Dialog.WhiteColorValue, DrawTextFormat.Center | DrawTextFormat.VerticalCenter ); }
/// <summary>
/// Refresh this element
/// </summary>
public void Refresh()
{
if (TextureColor.States != null)
TextureColor.Current = TextureColor.States[(int)ControlState.Hidden];
if (FontColor.States != null)
FontColor.Current = FontColor.States[(int)ControlState.Hidden];
}
#region ICloneable Members
/// <summary>Clone an object</summary>
public Element Clone()
{
Element e = new Element();
e.TextureIndex = this.TextureIndex;
e.FontIndex = this.FontIndex;
e.textFormat = this.textFormat;
e.textureRect = this.textureRect;
e.TextureColor = this.TextureColor;
e.FontColor = this.FontColor;
return e;
}
/// <summary>Clone an object</summary>
object ICloneable.Clone() { throw new NotSupportedException("Use the strongly typed clone.");}
#endregion
}
#region Dialog Resource Manager
/// <summary>
/// Structure for shared textures
/// </summary>
public class TextureNode
{
public string Filename;
public Texture Texture;
public uint Width;
public uint Height;
}
/// <summary>
/// Structure for shared fonts
/// </summary>
public class FontNode
{
public string FaceName;
public Font Font;
public uint Height;
public FontWeight Weight;
}
/// <summary>
/// Manages shared resources of dialogs
/// </summary>
public sealed class DialogResourceManager
{
private StateBlock dialogStateBlock; // Stateblock shared amongst all dialogs
private Sprite dialogSprite; // Sprite used for drawing
public StateBlock StateBlock { get { return dialogStateBlock; } }
public Sprite Sprite { get { return dialogSprite; } }
private Device device; // Device
// Lists of textures/fonts
private ArrayList textureCache = new ArrayList();
private ArrayList fontCache = new ArrayList();
#region Creation
/// <summary>Do not allow creation</summary>
private DialogResourceManager() {
device = null;
dialogSprite = null;
dialogStateBlock = null;
}
private static DialogResourceManager localObject = null;
public static DialogResourceManager GetGlobalInstance()
{
if (localObject == null)
localObject = new DialogResourceManager();
return localObject;
}
#endregion
/// <summary>Gets a font node from the cache</summary>
public FontNode GetFontNode(int index) { return fontCache[index] as FontNode; }
/// <summary>Gets a texture node from the cache</summary>
public TextureNode GetTextureNode(int index) { return textureCache[index] as TextureNode; }
/// <summary>Gets the device</summary>
public Device Device { get { return device; } }
/// <summary>
/// Adds a font to the resource manager
/// </summary>
public int AddFont(string faceName, uint height, FontWeight weight)
{
// See if this font exists
for(int i = 0; i < fontCache.Count; i++)
{
FontNode fn = fontCache[i] as FontNode;
if ( (string.Compare(fn.FaceName, faceName, true) == 0) &&
fn.Height == height &&
fn.Weight == weight)
{
// Found it
return i;
}
}
// Doesn't exist, add a new one and try to create it
FontNode newNode = new FontNode();
newNode.FaceName = faceName;
newNode.Height = height;
newNode.Weight = weight;
fontCache.Add(newNode);
int fontIndex = fontCache.Count-1;
// If a device is available, try to create immediately
if (device != null)
CreateFont(fontIndex);
return fontIndex;
}
/// <summary>
/// Adds a texture to the resource manager
/// </summary>
public int AddTexture(string filename)
{
// See if this font exists
for(int i = 0; i < textureCache.Count; i++)
{
TextureNode tn = textureCache[i] as TextureNode;
if (string.Compare(tn.Filename, filename, true) == 0)
{
// Found it
return i;
}
}
// Doesn't exist, add a new one and try to create it
TextureNode newNode = new TextureNode();
newNode.Filename = filename;
textureCache.Add(newNode);
int texIndex = textureCache.Count-1;
// If a device is available, try to create immediately
if (device != null)
CreateTexture(texIndex);
return texIndex;
}
/// <summary>
/// Creates a font
/// </summary>
public void CreateFont(int font)
{
// Get the font node here
FontNode fn = GetFontNode(font);
if (fn.Font != null)
fn.Font.Dispose(); // Get rid of this
// Create the new font
fn.Font = new Font(device, (int)fn.Height, 0, fn.Weight, 1, false, CharacterSet.Default,
Precision.Default, FontQuality.Default, PitchAndFamily.DefaultPitch | PitchAndFamily.FamilyDoNotCare,
fn.FaceName);
}
/// <summary>
/// Creates a texture
/// </summary>
public void CreateTexture(int tex)
{
// Get the texture node here
TextureNode tn = GetTextureNode(tex);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -