using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace System.Windows.Forms { public partial class MaskedHexBox : UserControl { public MaskedHexBox() { InitializeComponent(); SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ContainerControl, true); this.isAddressMask = true; txtMaskedHexBox.KeyDown += new KeyEventHandler(txtMaskedHexBox_KeyDown); txtMaskedHexBox.TextAlign = HorizontalAlignment.Right; } private void MaskedHexBox_KeyDown(object sender, KeyEventArgs e) { } private void MaskedHexBox_KeyPress(object sender, KeyPressEventArgs e) { } void txtMaskedHexBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode > Keys.F && e.KeyCode <= Keys.Z && !e.Control && !e.Alt) { e.SuppressKeyPress = true; } } new public Font Font { get { return base.Font; } set { base.Font = value; txtMaskedHexBox.Font = value; btnCopy.Font = value; btnPaste.Font = value; } } private string Mask { get { return txtMaskedHexBox.Mask; } set { txtMaskedHexBox.Mask = value; } } private bool _ReadOnly; public virtual bool ReadOnly { get { return _ReadOnly; } set { _ReadOnly = value; if (_ReadOnly) { txtMaskedHexBox.Enabled = false; } else { txtMaskedHexBox.Enabled = true; } } } public override string Text { get { return txtMaskedHexBox.Text.PadRight(this.TextLength + 2, '0'); } set { txtMaskedHexBox.Text = value; } } public ulong Value { get { return this.ToUInt64(); } set { switch (this.TextLength) { case 0: case 1: case 2: this.Text = string.Format("0x{0:x2}", value); break; case 3: case 4: this.Text = string.Format("0x{0:x4}", value); break; case 5: case 6: case 7: case 8: this.Text = string.Format("0x{0:x8}", value); break; default: this.Text = string.Format("0x{0:x" + this.TextLength + "}", value); break; } } } private bool _isAddressMask; public bool isAddressMask { get { return _isAddressMask; } set { _isAddressMask = value; if (value) { this.CreateTypeSize(); } } } public void CreateTypeSize() where T : IConvertible { Type type = typeof(T); this.TextLength = Marshal.SizeOf(type) * 2; this.MaxLength = this.TextLength; } private int _MaxLength; public int MaxLength { get { return _MaxLength; } set { _MaxLength = value; } } private int _TextLength; public int TextLength { get { return _TextLength; } set { StringBuilder mask = new StringBuilder(); mask.Append("\\0x"); if (this.MaxLength <= sizeof(uint) * 2) { switch (value) { case 0: case 1: case 2: _TextLength = 2; mask.Append(this.CreateMask(_TextLength)); break; case 3: case 4: _TextLength = 4; mask.Append(this.CreateMask(_TextLength)); break; case 5: case 6: case 7: case 8: default: _TextLength = 8; mask.Append(this.CreateMask(_TextLength)); break; } } else { switch (value) { case 0: case 1: case 2: _TextLength = 2; mask.Append(this.CreateMask(_TextLength)); break; case 3: case 4: _TextLength = 4; mask.Append(this.CreateMask(_TextLength)); break; case 5: case 6: case 7: case 8: _TextLength = 8; mask.Append(this.CreateMask(_TextLength)); break; default: _TextLength = value; mask.Append(this.CreateMask(_TextLength)); break; } } this.Mask = mask.ToString(); } } private string CreateMask(int length) { StringBuilder mask = new StringBuilder(); for (int i = 0; i < length; i++) { mask.Append("C"); } return mask.ToString(); } private void btnCopy_Click(object sender, EventArgs e) { Clipboard.SetData(DataFormats.Text, this.Text); } private void btnPaste_Click(object sender, EventArgs e) { if (this.ReadOnly) return; this.Text = (string)Clipboard.GetData(DataFormats.Text); } private void txtMaskedHexBox_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) { } } #region MaskedHexBox Extensions public static class MaskedHexBoxExtensions { private static string GetSafeConversionString(this MaskedHexBox val) { StringBuilder builder = new StringBuilder(); if (val.Text == "0x") { builder.Append("0x"); for (int i = 0; i < val.TextLength; i++) { builder.Append("0"); } } else builder.Append(val.Text.Replace(" ", "")); return builder.ToString(); } public static byte ToByte(this MaskedHexBox val) { try { return Convert.ToByte(val.GetSafeConversionString(), 16); } catch { return 0; } } public static sbyte ToSByte(this MaskedHexBox val) { try { return Convert.ToSByte(val.GetSafeConversionString(), 16); } catch { return 0; } } public static Int16 ToInt16(this MaskedHexBox val) { try { return Convert.ToInt16(val.GetSafeConversionString(), 16); } catch { return 0; } } public static Int32 ToInt32(this MaskedHexBox val) { try { return Convert.ToInt32(val.GetSafeConversionString(), 16); } catch { return 0; } } public static Int64 ToInt64(this MaskedHexBox val) { try { return Convert.ToInt64(val.GetSafeConversionString(), 16); } catch { return 0; } } public static UInt16 ToUInt16(this MaskedHexBox val) { try { return Convert.ToUInt16(val.GetSafeConversionString(), 16); } catch { return 0; } } public static UInt32 ToUInt32(this MaskedHexBox val) { try { return Convert.ToUInt32(val.GetSafeConversionString(), 16); } catch { return 0; } } public static UInt64 ToUInt64(this MaskedHexBox val) { try { return Convert.ToUInt64(val.GetSafeConversionString(), 16); } catch { return 0; } } public static Single ToSingle(this MaskedHexBox val) { try { return Convert.ToSingle(val.ToUInt32()); } catch { return 0; } } public static double ToDouble(this MaskedHexBox val) { try { return Convert.ToDouble(val.ToUInt32()); } catch { return 0; } } public static decimal ToDecimal(this MaskedHexBox val) { try { return Convert.ToDecimal(val.ToUInt32()); } catch { return 0; } } //public static string ToString(this MaskedHexBox val) //{ // return Convert.ToString(val.ToUInt32(), 16); //} } #endregion }