<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>customcontrol &#8211; Sanity Free Coding</title>
	<atom:link href="http://www.sanity-free.com/tag/customcontrol/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sanity-free.com</link>
	<description>Methods to the Madness</description>
	<lastBuildDate>Thu, 20 Nov 2025 04:45:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>http://sanity-free.org/wp-content/uploads/2025/10/sanity-free-512-150x150.jpg</url>
	<title>customcontrol &#8211; Sanity Free Coding</title>
	<link>http://www.sanity-free.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>An IPAddress Control (the Win32 SysIPAddress32 control in C#)</title>
		<link>http://www.sanity-free.com/an_ipaddress_control_the_win32_sysipaddress32_control_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Sun, 30 Jul 2006 18:00:52 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[customcontrol]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=179</guid>

					<description><![CDATA[The Common Controls library from the Platform SDK provides a control that Microsoft failed to provide a .NET counterpart to: the IPAddress Control (known as SysIPAddress32). Quite a while ago I wrote a C# / .NET control that wrapped the functionality of the SysIPAddress32 control from comctl32.dll I had a much better implementation back then [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The Common Controls library from the Platform SDK provides a control that Microsoft failed to provide a .NET counterpart to: the <code>IPAddress</code> Control (known as SysIPAddress32).<br></p>



<figure class="wp-block-image size-large"><img decoding="async" src="/wp-content/uploads/2025/10/tcpip_properties.gif" alt=""/></figure>



<p>Quite a while ago I wrote a C# / .NET control that wrapped the functionality of the <code>SysIPAddress32</code> control from <code>comctl32.dll</code><br></p>



<figure class="wp-block-image size-large"><img decoding="async" src="/wp-content/uploads/2025/10/csharp_ipaddress_ctrl.gif" alt=""/></figure>



<p>I had a much better implementation back then (with quite a few nice things included), but the hard drive that it lived on has since died, and I just haven&#8217;t wanted to spend the time putting all that stuff back into the control.<br><br>Some time after having written the &#8220;nice&#8221; version of this control, I posted the following code to another website. Now, it&#8217;s all I have left of the original. There is a known problem with the handle to the font being disposed incorrectly, but the code that fixed it, was given to me by a software engineer who worked at Microsoft that went by <em>jfo</em>, and I did a cut/paste of the solution without really paying much attention to it (kind of regretting that now&#8230;). You may notice all the <em>system</em> fonts will always be displayed in BOLD in the forms designer (even when the font is not set to bold). This goes away a runtime, it&#8217;s caused by an improperly disposed handle during design time.<br><br>Anyway, here it is, my <code>IPAddress</code> Control:<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/******************************************************/
/*          NULLFX FREE SOFTWARE LICENSE              */
/******************************************************/
/*  IPAddressControl                                  */
/*  by: Steve Whitley                                 */
/*  © 2004 NullFX Software                            */
/*                                                    */
/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */
/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */
/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */
/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */
/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */
/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */
/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */
/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */
/*                                                    */
/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */
/* AND LICENSES (MEANING THIS TEXT).                  */
/*                                                    */
/******************************************************/


namespace NullFX.Controls {
    using System;
    using System.Net;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using System.Drawing;
    &#91;StructLayout(LayoutKind.Sequential)&#93;
    public struct Nmhdr {
        public IntPtr HWndFrom;
        public UIntPtr IdFrom;
        public int Code;
    }
    &#91;StructLayout(LayoutKind.Sequential)&#93;
    public struct NmIPAddress {
        public Nmhdr Hdr;
        public int Field;
        public int Value;
    }
    &#91;StructLayout(LayoutKind.Sequential)&#93;
    public struct InitCommonControlsEX {
        public int Size;
        public int Icc;
    }
    public enum IPField { OctetOne = 0, OctetTwo = 1, OctetThree = 2, OctetFour = 3 }
    public delegate void FieldChangedHandler(object sender, FieldChangedEventArgs e);
    public class FieldChangedEventArgs : EventArgs {
        private int _field, _value;
        public int Field {
            get { return _field; }
        }
        public int Value {
            get { return _value; }
        }
        public FieldChangedEventArgs(int field, int value)
            : base() {
            _field = field;
            _value = value;
        }
    }
    public class IPAddressControl : TextBox {
        private const int WM_NOTIFY = 0x004E,
            WM_USER = 0x0400,
            WM_REFLECT = WM_USER + 0x1C00,
            IPN_FIRST = -860,
            IPM_SETRANGE = (WM_USER + 103),
            IPM_GETADDRESS = (WM_USER + 102),
            IPM_SETADDRESS = (WM_USER + 101),
            IPM_CLEARADDRESS = (WM_USER + 100),
            IPM_ISBLANK = (WM_USER + 105),
            ICC_INTERNET_CLASSES = 0x00000800,
            CS_VREDRAW = 0x0001,
            CS_HREDRAW = 0x0002,
            CS_DBLCLKS = 0x0008,
            CS_GLOBALCLASS = 0x4000,
            WS_CHILD = 0x40000000,
            WS_VISIBLE = 0x10000000,
            WS_TABSTOP = 0x00010000,
            WS_EX_RIGHT = 0x00001000,
            WS_EX_LEFT = 0x00000000,
            WS_EX_RTLREADING = 0x00002000,
            WS_EX_LTRREADING = 0x00000000,
            WS_EX_LEFTSCROLLBAR = 0x00004000,
            WS_EX_RIGHTSCROLLBAR = 0x00000000,
            WS_EX_NOPARENTNOTIFY = 0x00000004,
            WS_EX_CLIENTEDGE = 0x00000200;
        private int[] values = new int&#91;4&#93;;
        bool initialized = false;		
        public event FieldChangedHandler FieldChanged;
        public IPAddressControl()
            : base() {
            for(int i = 0; i &lt; 4; i++)
                values&#91;i&#93; = 0;
        }
        &#91;DllImport("comctl32")&#93;
        static extern bool InitCommonControlsEx(ref InitCommonControlsEX lpInitCtrls);

        protected virtual void OnFieldChanged(FieldChangedEventArgs e) {
            if(FieldChanged != null) FieldChanged(this, e);
        }
        protected override CreateParams CreateParams {
            get {
                if(!initialized) {
                    InitCommonControlsEX ic = new InitCommonControlsEX();
                    ic.Size = Marshal.SizeOf(typeof(InitCommonControlsEX));
                    ic.Icc = ICC_INTERNET_CLASSES;
                    initialized = InitCommonControlsEx(ref ic);
                }
                if(initialized) {
                    CreateParams cp = base.CreateParams;
                    cp.ClassName = "SysIPAddress32";
                    cp.Height = 23;
                    cp.ClassStyle = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_GLOBALCLASS;
                    cp.Style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | 0x80;
                    cp.ExStyle = WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE;
                    if(RightToLeft == RightToLeft.No || 
                      (RightToLeft == RightToLeft.Inherit &amp;&amp; 
                       Parent.RightToLeft == RightToLeft.No )) {
                        cp.ExStyle |= WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR;
                    } else {
                        cp.ExStyle |= WS_EX_RIGHT | WS_EX_RTLREADING | WS_EX_LEFTSCROLLBAR;
                    }
                    return cp;
                } else {
                    return base.CreateParams;
                }
            }
        }
        public bool SetIPRange(IPField field, byte lowValue, byte highValue) {
            if(!initialized) return false;		
            Message m = Message.Create(
                                  Handle, 
                                  IPM_SETRANGE, 
                                  (IntPtr)((int)field), 
                                  MakeRange(lowValue, highValue));
            WndProc(ref m);
            return m.Result.ToInt32() > 0;
        }
        public System.Net.IPAddress IPAddress {
            get {
                if(!initialized) return IPAddress.None;			
                return IPAddress.Parse(base.Text);
            }
        }
        public bool IsBlank {
            get {
                if(!initialized) return !(base.Text.Length > 0);
                Message m = Message.Create(Handle, IPM_ISBLANK, IntPtr.Zero, IntPtr.Zero);
                WndProc(ref m);
                return m.Result.ToInt32() > 0;
            }
        }
        new public void Clear() {
            if(!initialized) {
                base.Clear();
                return;
            }		
            Message m = Message.Create(Handle, IPM_CLEARADDRESS, IntPtr.Zero, IntPtr.Zero);
            WndProc(ref m);
        }
        private System.Net.IPAddress GetIpAddress(IntPtr ip) {
            if(!initialized) return IPAddress.None;		
            return new IPAddress(ip.ToInt64());
        }
        private IntPtr MakeRange(byte low, byte high) {
            return (IntPtr)((int)((high &lt;&lt; 8) + low));
        }
        protected override void WndProc(ref Message m) {
            if(m.Msg == (WM_REFLECT + WM_NOTIFY)) {
                NmIPAddress ipInfo = (NmIPAddress)Marshal.PtrToStructure(m.LParam,
                                                                   typeof(NmIPAddress));
                if(ipInfo.Hdr.Code == IPN_FIRST) {
                    if(values&#91;ipInfo.Field&#93; != ipInfo.Value) {
                        values&#91;ipInfo.Field&#93; = ipInfo.Value;
                        OnFieldChanged(
                          new FieldChangedEventArgs(ipInfo.Field, ipInfo.Value));
                    }
                }
            }
            base.WndProc(ref m);
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*          NULLFX FREE SOFTWARE LICENSE              */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*  IPAddressControl                                  */</span></span>
<span class="line"><span style="color: #008000">/*  by: Steve Whitley                                 */</span></span>
<span class="line"><span style="color: #008000">/*  © 2004 NullFX Software                            */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */</span></span>
<span class="line"><span style="color: #008000">/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */</span></span>
<span class="line"><span style="color: #008000">/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */</span></span>
<span class="line"><span style="color: #008000">/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */</span></span>
<span class="line"><span style="color: #008000">/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */</span></span>
<span class="line"><span style="color: #008000">/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */</span></span>
<span class="line"><span style="color: #008000">/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */</span></span>
<span class="line"><span style="color: #008000">/* AND LICENSES (MEANING THIS TEXT).                  */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">namespace</span><span style="color: #000000"> </span><span style="color: #267F99">NullFX</span><span style="color: #000000">.</span><span style="color: #267F99">Controls</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Net</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Windows</span><span style="color: #000000">.</span><span style="color: #267F99">Forms</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Runtime</span><span style="color: #000000">.</span><span style="color: #267F99">InteropServices</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Diagnostics</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Drawing</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">StructLayout</span><span style="color: #000000">(</span><span style="color: #001080">LayoutKind</span><span style="color: #000000">.</span><span style="color: #001080">Sequential</span><span style="color: #000000">)&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">struct</span><span style="color: #000000"> </span><span style="color: #267F99">Nmhdr</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> </span><span style="color: #001080">HWndFrom</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #267F99">UIntPtr</span><span style="color: #000000"> </span><span style="color: #001080">IdFrom</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">Code</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">StructLayout</span><span style="color: #000000">(</span><span style="color: #001080">LayoutKind</span><span style="color: #000000">.</span><span style="color: #001080">Sequential</span><span style="color: #000000">)&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">struct</span><span style="color: #000000"> </span><span style="color: #267F99">NmIPAddress</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #267F99">Nmhdr</span><span style="color: #000000"> </span><span style="color: #001080">Hdr</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">Field</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">Value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">StructLayout</span><span style="color: #000000">(</span><span style="color: #001080">LayoutKind</span><span style="color: #000000">.</span><span style="color: #001080">Sequential</span><span style="color: #000000">)&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">struct</span><span style="color: #000000"> </span><span style="color: #267F99">InitCommonControlsEX</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">Size</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">Icc</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">enum</span><span style="color: #000000"> </span><span style="color: #267F99">IPField</span><span style="color: #000000"> { </span><span style="color: #001080">OctetOne</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #001080">OctetTwo</span><span style="color: #000000"> = </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #001080">OctetThree</span><span style="color: #000000"> = </span><span style="color: #098658">2</span><span style="color: #000000">, </span><span style="color: #001080">OctetFour</span><span style="color: #000000"> = </span><span style="color: #098658">3</span><span style="color: #000000"> }</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">delegate</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #267F99">FieldChangedHandler</span><span style="color: #000000">(</span><span style="color: #0000FF">object</span><span style="color: #000000"> </span><span style="color: #001080">sender</span><span style="color: #000000">, </span><span style="color: #267F99">FieldChangedEventArgs</span><span style="color: #000000"> </span><span style="color: #001080">e</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">FieldChangedEventArgs</span><span style="color: #000000"> : </span><span style="color: #267F99">EventArgs</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">_field</span><span style="color: #000000">, </span><span style="color: #001080">_value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">Field</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">_field</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">Value</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000"> { </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">_value</span><span style="color: #000000">; }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">FieldChangedEventArgs</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">field</span><span style="color: #000000">, </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">value</span><span style="color: #000000">)</span></span>
<span class="line"><span style="color: #000000">            : </span><span style="color: #0000FF">base</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">_field</span><span style="color: #000000"> = </span><span style="color: #001080">field</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">_value</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">IPAddressControl</span><span style="color: #000000"> : </span><span style="color: #267F99">TextBox</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">WM_NOTIFY</span><span style="color: #000000"> = </span><span style="color: #098658">0x004E</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WM_USER</span><span style="color: #000000"> = </span><span style="color: #098658">0x0400</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WM_REFLECT</span><span style="color: #000000"> = </span><span style="color: #001080">WM_USER</span><span style="color: #000000"> + </span><span style="color: #098658">0x1C00</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">IPN_FIRST</span><span style="color: #000000"> = -</span><span style="color: #098658">860</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">IPM_SETRANGE</span><span style="color: #000000"> = (</span><span style="color: #001080">WM_USER</span><span style="color: #000000"> + </span><span style="color: #098658">103</span><span style="color: #000000">),</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">IPM_GETADDRESS</span><span style="color: #000000"> = (</span><span style="color: #001080">WM_USER</span><span style="color: #000000"> + </span><span style="color: #098658">102</span><span style="color: #000000">),</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">IPM_SETADDRESS</span><span style="color: #000000"> = (</span><span style="color: #001080">WM_USER</span><span style="color: #000000"> + </span><span style="color: #098658">101</span><span style="color: #000000">),</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">IPM_CLEARADDRESS</span><span style="color: #000000"> = (</span><span style="color: #001080">WM_USER</span><span style="color: #000000"> + </span><span style="color: #098658">100</span><span style="color: #000000">),</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">IPM_ISBLANK</span><span style="color: #000000"> = (</span><span style="color: #001080">WM_USER</span><span style="color: #000000"> + </span><span style="color: #098658">105</span><span style="color: #000000">),</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">ICC_INTERNET_CLASSES</span><span style="color: #000000"> = </span><span style="color: #098658">0x00000800</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">CS_VREDRAW</span><span style="color: #000000"> = </span><span style="color: #098658">0x0001</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">CS_HREDRAW</span><span style="color: #000000"> = </span><span style="color: #098658">0x0002</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">CS_DBLCLKS</span><span style="color: #000000"> = </span><span style="color: #098658">0x0008</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">CS_GLOBALCLASS</span><span style="color: #000000"> = </span><span style="color: #098658">0x4000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_CHILD</span><span style="color: #000000"> = </span><span style="color: #098658">0x40000000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_VISIBLE</span><span style="color: #000000"> = </span><span style="color: #098658">0x10000000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_TABSTOP</span><span style="color: #000000"> = </span><span style="color: #098658">0x00010000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_EX_RIGHT</span><span style="color: #000000"> = </span><span style="color: #098658">0x00001000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_EX_LEFT</span><span style="color: #000000"> = </span><span style="color: #098658">0x00000000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_EX_RTLREADING</span><span style="color: #000000"> = </span><span style="color: #098658">0x00002000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_EX_LTRREADING</span><span style="color: #000000"> = </span><span style="color: #098658">0x00000000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_EX_LEFTSCROLLBAR</span><span style="color: #000000"> = </span><span style="color: #098658">0x00004000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_EX_RIGHTSCROLLBAR</span><span style="color: #000000"> = </span><span style="color: #098658">0x00000000</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_EX_NOPARENTNOTIFY</span><span style="color: #000000"> = </span><span style="color: #098658">0x00000004</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">WS_EX_CLIENTEDGE</span><span style="color: #000000"> = </span><span style="color: #098658">0x00000200</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000">[] </span><span style="color: #001080">values</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000">&#91;</span><span style="color: #098658">4</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">initialized</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;		</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">event</span><span style="color: #000000"> </span><span style="color: #267F99">FieldChangedHandler</span><span style="color: #000000"> </span><span style="color: #001080">FieldChanged</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">IPAddressControl</span><span style="color: #000000">()</span></span>
<span class="line"><span style="color: #000000">            : </span><span style="color: #0000FF">base</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">for</span><span style="color: #000000">(</span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">i</span><span style="color: #000000"> = </span><span style="color: #098658">0</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000"> &lt; </span><span style="color: #098658">4</span><span style="color: #000000">; </span><span style="color: #001080">i</span><span style="color: #000000">++)</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">values</span><span style="color: #000000">&#91;</span><span style="color: #001080">i</span><span style="color: #000000">&#93; = </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;comctl32&quot;</span><span style="color: #000000">)&#93;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">InitCommonControlsEx</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #267F99">InitCommonControlsEX</span><span style="color: #000000"> </span><span style="color: #001080">lpInitCtrls</span><span style="color: #000000">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">virtual</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">OnFieldChanged</span><span style="color: #000000">(</span><span style="color: #267F99">FieldChangedEventArgs</span><span style="color: #000000"> </span><span style="color: #001080">e</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">FieldChanged</span><span style="color: #000000"> != </span><span style="color: #0000FF">null</span><span style="color: #000000">) </span><span style="color: #795E26">FieldChanged</span><span style="color: #000000">(</span><span style="color: #0000FF">this</span><span style="color: #000000">, </span><span style="color: #001080">e</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #267F99">CreateParams</span><span style="color: #000000"> </span><span style="color: #001080">CreateParams</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(!</span><span style="color: #001080">initialized</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #267F99">InitCommonControlsEX</span><span style="color: #000000"> </span><span style="color: #001080">ic</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">InitCommonControlsEX</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">ic</span><span style="color: #000000">.</span><span style="color: #001080">Size</span><span style="color: #000000"> = </span><span style="color: #001080">Marshal</span><span style="color: #000000">.</span><span style="color: #795E26">SizeOf</span><span style="color: #000000">(</span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">InitCommonControlsEX</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">ic</span><span style="color: #000000">.</span><span style="color: #001080">Icc</span><span style="color: #000000"> = </span><span style="color: #001080">ICC_INTERNET_CLASSES</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">initialized</span><span style="color: #000000"> = </span><span style="color: #795E26">InitCommonControlsEx</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">ic</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">initialized</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #267F99">CreateParams</span><span style="color: #000000"> </span><span style="color: #001080">cp</span><span style="color: #000000"> = </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">CreateParams</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">cp</span><span style="color: #000000">.</span><span style="color: #001080">ClassName</span><span style="color: #000000"> = </span><span style="color: #A31515">&quot;SysIPAddress32&quot;</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">cp</span><span style="color: #000000">.</span><span style="color: #001080">Height</span><span style="color: #000000"> = </span><span style="color: #098658">23</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">cp</span><span style="color: #000000">.</span><span style="color: #001080">ClassStyle</span><span style="color: #000000"> = </span><span style="color: #001080">CS_VREDRAW</span><span style="color: #000000"> | </span><span style="color: #001080">CS_HREDRAW</span><span style="color: #000000"> | </span><span style="color: #001080">CS_DBLCLKS</span><span style="color: #000000"> | </span><span style="color: #001080">CS_GLOBALCLASS</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">cp</span><span style="color: #000000">.</span><span style="color: #001080">Style</span><span style="color: #000000"> = </span><span style="color: #001080">WS_CHILD</span><span style="color: #000000"> | </span><span style="color: #001080">WS_VISIBLE</span><span style="color: #000000"> | </span><span style="color: #001080">WS_TABSTOP</span><span style="color: #000000"> | </span><span style="color: #098658">0x80</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">cp</span><span style="color: #000000">.</span><span style="color: #001080">ExStyle</span><span style="color: #000000"> = </span><span style="color: #001080">WS_EX_NOPARENTNOTIFY</span><span style="color: #000000"> | </span><span style="color: #001080">WS_EX_CLIENTEDGE</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">RightToLeft</span><span style="color: #000000"> == </span><span style="color: #001080">RightToLeft</span><span style="color: #000000">.</span><span style="color: #001080">No</span><span style="color: #000000"> || </span></span>
<span class="line"><span style="color: #000000">                      (</span><span style="color: #001080">RightToLeft</span><span style="color: #000000"> == </span><span style="color: #001080">RightToLeft</span><span style="color: #000000">.</span><span style="color: #001080">Inherit</span><span style="color: #000000"> &amp;&amp; </span></span>
<span class="line"><span style="color: #000000">                       </span><span style="color: #001080">Parent</span><span style="color: #000000">.</span><span style="color: #001080">RightToLeft</span><span style="color: #000000"> == </span><span style="color: #001080">RightToLeft</span><span style="color: #000000">.</span><span style="color: #001080">No</span><span style="color: #000000"> )) {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">cp</span><span style="color: #000000">.</span><span style="color: #001080">ExStyle</span><span style="color: #000000"> |= </span><span style="color: #001080">WS_EX_LEFT</span><span style="color: #000000"> | </span><span style="color: #001080">WS_EX_LTRREADING</span><span style="color: #000000"> | </span><span style="color: #001080">WS_EX_RIGHTSCROLLBAR</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">cp</span><span style="color: #000000">.</span><span style="color: #001080">ExStyle</span><span style="color: #000000"> |= </span><span style="color: #001080">WS_EX_RIGHT</span><span style="color: #000000"> | </span><span style="color: #001080">WS_EX_RTLREADING</span><span style="color: #000000"> | </span><span style="color: #001080">WS_EX_LEFTSCROLLBAR</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">cp</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">CreateParams</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">SetIPRange</span><span style="color: #000000">(</span><span style="color: #267F99">IPField</span><span style="color: #000000"> </span><span style="color: #001080">field</span><span style="color: #000000">, </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">lowValue</span><span style="color: #000000">, </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">highValue</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(!</span><span style="color: #001080">initialized</span><span style="color: #000000">) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;		</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> = </span><span style="color: #001080">Message</span><span style="color: #000000">.</span><span style="color: #795E26">Create</span><span style="color: #000000">(</span></span>
<span class="line"><span style="color: #000000">                                  </span><span style="color: #001080">Handle</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                                  </span><span style="color: #001080">IPM_SETRANGE</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                                  (</span><span style="color: #267F99">IntPtr</span><span style="color: #000000">)((</span><span style="color: #0000FF">int</span><span style="color: #000000">)</span><span style="color: #001080">field</span><span style="color: #000000">), </span></span>
<span class="line"><span style="color: #000000">                                  </span><span style="color: #795E26">MakeRange</span><span style="color: #000000">(</span><span style="color: #001080">lowValue</span><span style="color: #000000">, </span><span style="color: #001080">highValue</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Result</span><span style="color: #000000">.</span><span style="color: #795E26">ToInt32</span><span style="color: #000000">() &gt; </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Net</span><span style="color: #000000">.</span><span style="color: #267F99">IPAddress</span><span style="color: #000000"> </span><span style="color: #001080">IPAddress</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(!</span><span style="color: #001080">initialized</span><span style="color: #000000">) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">IPAddress</span><span style="color: #000000">.</span><span style="color: #001080">None</span><span style="color: #000000">;			</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">IPAddress</span><span style="color: #000000">.</span><span style="color: #795E26">Parse</span><span style="color: #000000">(</span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">Text</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">IsBlank</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(!</span><span style="color: #001080">initialized</span><span style="color: #000000">) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> !(</span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">Text</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000"> &gt; </span><span style="color: #098658">0</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> = </span><span style="color: #001080">Message</span><span style="color: #000000">.</span><span style="color: #795E26">Create</span><span style="color: #000000">(</span><span style="color: #001080">Handle</span><span style="color: #000000">, </span><span style="color: #001080">IPM_ISBLANK</span><span style="color: #000000">, </span><span style="color: #001080">IntPtr</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000">, </span><span style="color: #001080">IntPtr</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Result</span><span style="color: #000000">.</span><span style="color: #795E26">ToInt32</span><span style="color: #000000">() &gt; </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Clear</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(!</span><span style="color: #001080">initialized</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">Clear</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }		</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> = </span><span style="color: #001080">Message</span><span style="color: #000000">.</span><span style="color: #795E26">Create</span><span style="color: #000000">(</span><span style="color: #001080">Handle</span><span style="color: #000000">, </span><span style="color: #001080">IPM_CLEARADDRESS</span><span style="color: #000000">, </span><span style="color: #001080">IntPtr</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000">, </span><span style="color: #001080">IntPtr</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Net</span><span style="color: #000000">.</span><span style="color: #267F99">IPAddress</span><span style="color: #000000"> </span><span style="color: #795E26">GetIpAddress</span><span style="color: #000000">(</span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> </span><span style="color: #001080">ip</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(!</span><span style="color: #001080">initialized</span><span style="color: #000000">) </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">IPAddress</span><span style="color: #000000">.</span><span style="color: #001080">None</span><span style="color: #000000">;		</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">IPAddress</span><span style="color: #000000">(</span><span style="color: #001080">ip</span><span style="color: #000000">.</span><span style="color: #795E26">ToInt64</span><span style="color: #000000">());</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> </span><span style="color: #795E26">MakeRange</span><span style="color: #000000">(</span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">low</span><span style="color: #000000">, </span><span style="color: #0000FF">byte</span><span style="color: #000000"> </span><span style="color: #001080">high</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> (</span><span style="color: #267F99">IntPtr</span><span style="color: #000000">)((</span><span style="color: #0000FF">int</span><span style="color: #000000">)((</span><span style="color: #001080">high</span><span style="color: #000000"> &lt;&lt; </span><span style="color: #098658">8</span><span style="color: #000000">) + </span><span style="color: #001080">low</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == (</span><span style="color: #001080">WM_REFLECT</span><span style="color: #000000"> + </span><span style="color: #001080">WM_NOTIFY</span><span style="color: #000000">)) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">NmIPAddress</span><span style="color: #000000"> </span><span style="color: #001080">ipInfo</span><span style="color: #000000"> = (</span><span style="color: #267F99">NmIPAddress</span><span style="color: #000000">)</span><span style="color: #001080">Marshal</span><span style="color: #000000">.</span><span style="color: #795E26">PtrToStructure</span><span style="color: #000000">(</span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">LParam</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                                                                   </span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">NmIPAddress</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">ipInfo</span><span style="color: #000000">.</span><span style="color: #001080">Hdr</span><span style="color: #000000">.</span><span style="color: #001080">Code</span><span style="color: #000000"> == </span><span style="color: #001080">IPN_FIRST</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">values</span><span style="color: #000000">&#91;</span><span style="color: #001080">ipInfo</span><span style="color: #000000">.</span><span style="color: #001080">Field</span><span style="color: #000000">&#93; != </span><span style="color: #001080">ipInfo</span><span style="color: #000000">.</span><span style="color: #001080">Value</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">values</span><span style="color: #000000">&#91;</span><span style="color: #001080">ipInfo</span><span style="color: #000000">.</span><span style="color: #001080">Field</span><span style="color: #000000">&#93; = </span><span style="color: #001080">ipInfo</span><span style="color: #000000">.</span><span style="color: #001080">Value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #795E26">OnFieldChanged</span><span style="color: #000000">(</span></span>
<span class="line"><span style="color: #000000">                          </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">FieldChangedEventArgs</span><span style="color: #000000">(</span><span style="color: #001080">ipInfo</span><span style="color: #000000">.</span><span style="color: #001080">Field</span><span style="color: #000000">, </span><span style="color: #001080">ipInfo</span><span style="color: #000000">.</span><span style="color: #001080">Value</span><span style="color: #000000">));</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>It does have one wrapped event from the original control and that is <code>FieldChanged</code>, which provides feedback when each octet is changed (similar to <code>TextChanged</code> for a text box, but only fires after the user has entered the entire text for an octet). Likewise, if the value of an octet is larger than a byte, it is automatically changed back to 255 (i.e., the max value of a byte). When the event fires, it passes back, the octet that was changed, and its value.<br><br>You can specify the <code>IP Range</code> (which the original control allows, and I&#8217;ve wrapped into this control as well) so that you can edit the control to only accept a specified IP Address Range.<br><br>I&#8217;ve also provided Native <code>Clear</code> functionality as well as the <code>IsBlank</code> from the original control. I added a <code>System.Net.IPAddress</code> property so that when accessing the <code>IPAddress</code> of the control, you didn&#8217;t need to parse the <code>System.Net.IPAddress</code> every time. My original control completely removed the <code>Text</code> property so that you get / set the <code>IPAddress</code> through this property, but alas, that functionality doesn&#8217;t exist in this control.<br><br>UPDATE: 8/25/2006 &#8211; I Made two changes to the source code, 1. added some Initialization logic to keep <code>InitCommonCtrls</code> from being called multiple times and, 2. added styles for <code>ClassStyle</code>, <code>StyleEX</code> and <code>Style</code> to keep an exception from being thrown in certain cases when the <code>WM_GETTEXTLENGTH</code> message was sent.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A Simple Line Control</title>
		<link>http://www.sanity-free.com/simple_line_control.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Sun, 29 May 2005 18:00:15 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[customcontrol]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=45</guid>

					<description><![CDATA[Some time ago, I was working on a clone of Solitaire (the one that comes with windows), and I needed a line control (for&#8230; surprise surprise&#8230; the about box) like the one shown in its about window: after a brisk 2 seconds I came up with the following class: Now to talk over a few [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Some time ago, I was working on a clone of Solitaire (the one that comes with windows), and I needed a line control (for&#8230; surprise surprise&#8230; the about box) like the one shown in its about window:<br></p>



<figure class="wp-block-image size-large"><img decoding="async" src="/wp-content/uploads/2025/10/aboutwindow.gif" alt="Example Line Control"/><figcaption class="wp-element-caption">Example Line Control</figcaption></figure>



<p>after a brisk 2 seconds I came up with the following class:</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/******************************************************/
/*          NULLFX FREE SOFTWARE LICENSE              */
/******************************************************/
/*  Line Control                                      */
/*  by: Steve Whitley                                 */
/*  © 2005 NullFX Software                            */
/*                                                    */
/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */
/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */
/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */
/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */
/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */
/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */
/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */
/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */
/*                                                    */
/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */
/* AND LICENSES (MEANING THIS TEXT).                  */
/*                                                    */
/******************************************************/

namespace NullFX.Controls {
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Windows.Forms;
    using System.Windows.Forms.Design;
    &#91;Designer(typeof(Line.LineDesigner))&#93;
    public class Line : Control {
        internal class LineDesigner : ControlDesigner {
            public override SelectionRules SelectionRules {
                get {
                    return SelectionRules.LeftSizeable |
                        SelectionRules.RightSizeable |
                        SelectionRules.Visible |
                        SelectionRules.Moveable;
                }
            }

        }
        private FlatStyle _flatStyle;
        private Pen _systemPen;
        private Container components = null;
        &#91;Category("Appearance"), 
        Description(
        "Determines the display of the control" +
        "when the users move the mouse over the control" +
        "and click")&#93;
        public FlatStyle FlatStyle {
            get{return _flatStyle;}
            set{
                _flatStyle = value;
                Invalidate();
            }
        }
        public Line() {
            _flatStyle = FlatStyle.Standard;
            _systemPen = 
                  new Pen(SystemColors.ControlDark, 2);
            SetStyle(ControlStyles.AllPaintingInWmPaint |
                ControlStyles.DoubleBuffer|
                ControlStyles.ResizeRedraw|
                ControlStyles.UserPaint, true);
        }		 
        protected override void Dispose( bool disposing ) {
            if( disposing ) {
                if( components != null ) {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
        protected override Size DefaultSize {
            get {
                return new System.Drawing.Size(120, 2);
            }
        } 
        protected override void OnPaint(PaintEventArgs pe) {
            switch(_flatStyle) { 
                case FlatStyle.Flat:
                case FlatStyle.Popup:
                case FlatStyle.Standard: {
                    pe.Graphics.FillRectangle(
                       SystemBrushes.ControlLightLight, 
                       0, 0, Width, 2);
                    pe.Graphics.FillRectangle(
                       SystemBrushes.ControlDark, 
                       0, 0, Width - 1, Height / 2); 
                }break;
                case System.Windows.Forms.FlatStyle.System: {
                    pe.Graphics.DrawLine(_systemPen, 
                                             0, 1, Width, 1);
                }break;
                default:
                    goto case FlatStyle.Standard; 
            }
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*          NULLFX FREE SOFTWARE LICENSE              */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*  Line Control                                      */</span></span>
<span class="line"><span style="color: #008000">/*  by: Steve Whitley                                 */</span></span>
<span class="line"><span style="color: #008000">/*  © 2005 NullFX Software                            */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */</span></span>
<span class="line"><span style="color: #008000">/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */</span></span>
<span class="line"><span style="color: #008000">/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */</span></span>
<span class="line"><span style="color: #008000">/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */</span></span>
<span class="line"><span style="color: #008000">/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */</span></span>
<span class="line"><span style="color: #008000">/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */</span></span>
<span class="line"><span style="color: #008000">/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */</span></span>
<span class="line"><span style="color: #008000">/* AND LICENSES (MEANING THIS TEXT).                  */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">namespace</span><span style="color: #000000"> </span><span style="color: #267F99">NullFX</span><span style="color: #000000">.</span><span style="color: #267F99">Controls</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Collections</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">ComponentModel</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Drawing</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Data</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Windows</span><span style="color: #000000">.</span><span style="color: #267F99">Forms</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Windows</span><span style="color: #000000">.</span><span style="color: #267F99">Forms</span><span style="color: #000000">.</span><span style="color: #267F99">Design</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    &#91;</span><span style="color: #267F99">Designer</span><span style="color: #000000">(</span><span style="color: #0000FF">typeof</span><span style="color: #000000">(</span><span style="color: #267F99">Line</span><span style="color: #000000">.</span><span style="color: #267F99">LineDesigner</span><span style="color: #000000">))&#93;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">Line</span><span style="color: #000000"> : </span><span style="color: #267F99">Control</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">internal</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">LineDesigner</span><span style="color: #000000"> : </span><span style="color: #267F99">ControlDesigner</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #267F99">SelectionRules</span><span style="color: #000000"> </span><span style="color: #001080">SelectionRules</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">SelectionRules</span><span style="color: #000000">.</span><span style="color: #001080">LeftSizeable</span><span style="color: #000000"> |</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">SelectionRules</span><span style="color: #000000">.</span><span style="color: #001080">RightSizeable</span><span style="color: #000000"> |</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">SelectionRules</span><span style="color: #000000">.</span><span style="color: #001080">Visible</span><span style="color: #000000"> |</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #001080">SelectionRules</span><span style="color: #000000">.</span><span style="color: #001080">Moveable</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #267F99">FlatStyle</span><span style="color: #000000"> </span><span style="color: #001080">_flatStyle</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #267F99">Pen</span><span style="color: #000000"> </span><span style="color: #001080">_systemPen</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #267F99">Container</span><span style="color: #000000"> </span><span style="color: #001080">components</span><span style="color: #000000"> = </span><span style="color: #0000FF">null</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        &#91;</span><span style="color: #267F99">Category</span><span style="color: #000000">(</span><span style="color: #A31515">&quot;Appearance&quot;</span><span style="color: #000000">), </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #267F99">Description</span><span style="color: #000000">(</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #A31515">&quot;Determines the display of the control&quot;</span><span style="color: #000000"> +</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #A31515">&quot;when the users move the mouse over the control&quot;</span><span style="color: #000000"> +</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #A31515">&quot;and click&quot;</span><span style="color: #000000">)&#93;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #267F99">FlatStyle</span><span style="color: #000000"> </span><span style="color: #001080">FlatStyle</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000">{</span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">_flatStyle</span><span style="color: #000000">;}</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">set</span><span style="color: #000000">{</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">_flatStyle</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #795E26">Invalidate</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #795E26">Line</span><span style="color: #000000">() {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">_flatStyle</span><span style="color: #000000"> = </span><span style="color: #001080">FlatStyle</span><span style="color: #000000">.</span><span style="color: #001080">Standard</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">_systemPen</span><span style="color: #000000"> = </span></span>
<span class="line"><span style="color: #000000">                  </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Pen</span><span style="color: #000000">(</span><span style="color: #001080">SystemColors</span><span style="color: #000000">.</span><span style="color: #001080">ControlDark</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #795E26">SetStyle</span><span style="color: #000000">(</span><span style="color: #001080">ControlStyles</span><span style="color: #000000">.</span><span style="color: #001080">AllPaintingInWmPaint</span><span style="color: #000000"> |</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">ControlStyles</span><span style="color: #000000">.</span><span style="color: #001080">DoubleBuffer</span><span style="color: #000000">|</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">ControlStyles</span><span style="color: #000000">.</span><span style="color: #001080">ResizeRedraw</span><span style="color: #000000">|</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">ControlStyles</span><span style="color: #000000">.</span><span style="color: #001080">UserPaint</span><span style="color: #000000">, </span><span style="color: #0000FF">true</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }		 </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">Dispose</span><span style="color: #000000">( </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">disposing</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">( </span><span style="color: #001080">disposing</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">( </span><span style="color: #001080">components</span><span style="color: #000000"> != </span><span style="color: #0000FF">null</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">components</span><span style="color: #000000">.</span><span style="color: #795E26">Dispose</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">Dispose</span><span style="color: #000000">( </span><span style="color: #001080">disposing</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #267F99">Size</span><span style="color: #000000"> </span><span style="color: #001080">DefaultSize</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Drawing</span><span style="color: #000000">.</span><span style="color: #267F99">Size</span><span style="color: #000000">(</span><span style="color: #098658">120</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        } </span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">OnPaint</span><span style="color: #000000">(</span><span style="color: #267F99">PaintEventArgs</span><span style="color: #000000"> </span><span style="color: #001080">pe</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">switch</span><span style="color: #000000">(</span><span style="color: #001080">_flatStyle</span><span style="color: #000000">) { </span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">case</span><span style="color: #000000"> </span><span style="color: #267F99">FlatStyle</span><span style="color: #000000">.</span><span style="color: #267F99">Flat</span><span style="color: #000000">:</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">case</span><span style="color: #000000"> </span><span style="color: #267F99">FlatStyle</span><span style="color: #000000">.</span><span style="color: #267F99">Popup</span><span style="color: #000000">:</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">case</span><span style="color: #000000"> </span><span style="color: #267F99">FlatStyle</span><span style="color: #000000">.</span><span style="color: #267F99">Standard</span><span style="color: #000000">: {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">pe</span><span style="color: #000000">.</span><span style="color: #001080">Graphics</span><span style="color: #000000">.</span><span style="color: #795E26">FillRectangle</span><span style="color: #000000">(</span></span>
<span class="line"><span style="color: #000000">                       </span><span style="color: #001080">SystemBrushes</span><span style="color: #000000">.</span><span style="color: #001080">ControlLightLight</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                       </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #001080">Width</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">pe</span><span style="color: #000000">.</span><span style="color: #001080">Graphics</span><span style="color: #000000">.</span><span style="color: #795E26">FillRectangle</span><span style="color: #000000">(</span></span>
<span class="line"><span style="color: #000000">                       </span><span style="color: #001080">SystemBrushes</span><span style="color: #000000">.</span><span style="color: #001080">ControlDark</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                       </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #001080">Width</span><span style="color: #000000"> - </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #001080">Height</span><span style="color: #000000"> / </span><span style="color: #098658">2</span><span style="color: #000000">); </span></span>
<span class="line"><span style="color: #000000">                }</span><span style="color: #AF00DB">break</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">case</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Windows</span><span style="color: #000000">.</span><span style="color: #267F99">Forms</span><span style="color: #000000">.</span><span style="color: #267F99">FlatStyle</span><span style="color: #000000">.</span><span style="color: #267F99">System</span><span style="color: #000000">: {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">pe</span><span style="color: #000000">.</span><span style="color: #001080">Graphics</span><span style="color: #000000">.</span><span style="color: #795E26">DrawLine</span><span style="color: #000000">(</span><span style="color: #001080">_systemPen</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                                             </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #001080">Width</span><span style="color: #000000">, </span><span style="color: #098658">1</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                }</span><span style="color: #AF00DB">break</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">default</span><span style="color: #000000">:</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">goto</span><span style="color: #000000"> </span><span style="color: #AF00DB">case</span><span style="color: #000000"> </span><span style="color: #001080">FlatStyle</span><span style="color: #000000">.</span><span style="color: #001080">Standard</span><span style="color: #000000">; </span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Now to talk over a few points in this very simple control.<br><br>There were 2 requirements I had for the control:</p>



<ol class="wp-block-list">
<li>It had to have an inherent size when I dragged it onto the canvass</li>



<li>it had to keep its aspect ratio (meaning I couldn&#8217;t make it look inconsistent)</li>
</ol>



<p>I was able to accomplish this using a class designer, and by overriding the <code>DefaultSize</code> property of the control. I could have gotten much more fancy with the control, but since I was going to be the only one using it (well&#8230; that was the plan anyway :D), I kept it super simple.<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>protected override Size DefaultSize {
    get {
        return new System.Drawing.Size(120, 2);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #001080">Size</span><span style="color: #000000"> </span><span style="color: #001080">DefaultSize</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #001080">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Drawing</span><span style="color: #000000">.</span><span style="color: #267F99">Size</span><span style="color: #000000">(</span><span style="color: #098658">120</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>This allows the control to default to this size. Anytime the control needs its base size, it uses the <code>DefaultSize</code> property. My first iteration of this control actually set the size property in the <code>InitializeComponent</code> method, but after reading up on it, using the <code>DefaultSize</code> property and specifying its size is the better solution.<br><br>The next thing was to keep its aspect ratio. This is achieved by providing my control with a designer. There are lots of articles out there on how to implement a designer, so I&#8217;ll leave that for another topic, and just discuss what I used in the designer to accomplish this.<br>There is a property in the <code>ControlDesigner</code> called <code>SelectionRules</code>. This tells the control host at design time, how it can be used. Here&#8217;s our designer class. It&#8217;s actually an inner class of the Line control.</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>internal class LineDesigner : ControlDesigner {
	public override SelectionRules SelectionRules {
		get {
			return SelectionRules.LeftSizeable |
				SelectionRules.RightSizeable |
				SelectionRules.Visible |
				SelectionRules.Moveable;
		}
	}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">internal</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">LineDesigner</span><span style="color: #000000"> : </span><span style="color: #267F99">ControlDesigner</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">	</span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #267F99">SelectionRules</span><span style="color: #000000"> </span><span style="color: #001080">SelectionRules</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">		</span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">			</span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">SelectionRules</span><span style="color: #000000">.</span><span style="color: #001080">LeftSizeable</span><span style="color: #000000"> |</span></span>
<span class="line"><span style="color: #000000">				</span><span style="color: #001080">SelectionRules</span><span style="color: #000000">.</span><span style="color: #001080">RightSizeable</span><span style="color: #000000"> |</span></span>
<span class="line"><span style="color: #000000">				</span><span style="color: #001080">SelectionRules</span><span style="color: #000000">.</span><span style="color: #001080">Visible</span><span style="color: #000000"> |</span></span>
<span class="line"><span style="color: #000000">				</span><span style="color: #001080">SelectionRules</span><span style="color: #000000">.</span><span style="color: #001080">Moveable</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">		}</span></span>
<span class="line"><span style="color: #000000">	}</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Notice we&#8217;re only overriding the <code>SelectionRules</code> property. It returns a bit flag value of which types of selection are possible in the designer. I didn&#8217;t want the control to be sized up or down, so I left those selection rules out. I did want it to be able to be sized right or left, and movable (and obviously visible), so these are the rules I return.<br><br>Other than this, all we need is to draw the line. This is achieved by overriding the <code>OnPaint</code> function in the control. I have provided functionality (however ugly it may be) for flat style, but for simplicity, I&#8217;ll speak to the normal line.<br>The line in the about box has a highlight line and a shadow line. In our <code>OnPaint</code> method, I draw both lines using <code>Control.Dark</code> and <code>Control.LightLight</code> colors (this is so these colors can match whatever theme is being used).</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>case FlatStyle.Standard: {
	pe.Graphics.FillRectangle( SystemBrushes.ControlLightLight, 0, 0, Width, 2 );
	pe.Graphics.FillRectangle( SystemBrushes.ControlDark, 0, 0, Width - 1, Height / 2 );
}break;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #001080">case</span><span style="color: #000000"> </span><span style="color: #001080">FlatStyle</span><span style="color: #000000">.</span><span style="color: #001080">Standard</span><span style="color: #000000">: {</span></span>
<span class="line"><span style="color: #000000">	</span><span style="color: #001080">pe</span><span style="color: #000000">.</span><span style="color: #001080">Graphics</span><span style="color: #000000">.</span><span style="color: #795E26">FillRectangle</span><span style="color: #000000">( </span><span style="color: #001080">SystemBrushes</span><span style="color: #000000">.</span><span style="color: #001080">ControlLightLight</span><span style="color: #000000">, </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #001080">Width</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">	</span><span style="color: #001080">pe</span><span style="color: #000000">.</span><span style="color: #001080">Graphics</span><span style="color: #000000">.</span><span style="color: #795E26">FillRectangle</span><span style="color: #000000">( </span><span style="color: #001080">SystemBrushes</span><span style="color: #000000">.</span><span style="color: #001080">ControlDark</span><span style="color: #000000">, </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #098658">0</span><span style="color: #000000">, </span><span style="color: #001080">Width</span><span style="color: #000000"> - </span><span style="color: #098658">1</span><span style="color: #000000">, </span><span style="color: #001080">Height</span><span style="color: #000000"> / </span><span style="color: #098658">2</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">}</span><span style="color: #AF00DB">break</span><span style="color: #000000">;</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>Anyway, this is my simple line control.<br><br><a class="sf-downloads" href="/wp-content/uploads/2025/10/NullFX.Controls.Line_.zip" target="_blank" rel="noreferrer noopener nofollow">Download the Binary Here.</a></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Numeric Text Box: A Number Only Text Box Control in C#</title>
		<link>http://www.sanity-free.com/numeric_text_box_number_only_text_box_control_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Thu, 14 Apr 2005 18:00:57 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[customcontrol]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[numerictextbox]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=32</guid>

					<description><![CDATA[Here&#8217;s my numeric only text control. I&#8217;ll admit there&#8217;s not much too it, and there are masked edit controls, but for those who dare&#8230; What this does, is watch the Windows Message Queue for incoming messages (specifically WM_KEYDOWN and WM_PASTE). If a key has been pressed, it will look to see if the key is [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Here&#8217;s my numeric only text control. I&#8217;ll admit there&#8217;s not much too it, and there are masked edit controls, but for those who dare&#8230;<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/******************************************************/
/*          NULLFX FREE SOFTWARE LICENSE              */
/******************************************************/
/*  NumericTextBox Library                            */
/*  by: Steve Whitley                                 */
/*  © 2005 NullFX Software                            */
/*                                                    */
/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */
/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */
/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */
/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */
/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */
/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */
/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */
/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */
/*                                                    */
/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */
/* AND LICENSES (MEANING THIS TEXT).                  */
/*                                                    */
/******************************************************/

namespace NullFX.Controls {
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Windows.Forms;

    public class NumericTextBox : TextBox {
        static NumberFormatInfo CurrentNumberFormat = 
               CultureInfo.CurrentCulture.NumberFormat;
        const int WM_KEYDOWN = 0x0100,
                  WM_PASTE = 0x0302;

        public decimal Value {
            set { Text = value.ToString ( ); }
            get {
                decimal.TryParse ( Text, out decimal tmpValue );
                return tmpValue;
            }
        }

        public override bool PreProcessMessage ( ref Message msg ) {
            if ( msg.Msg == WM_KEYDOWN ) {
                Keys keys = ( Keys ) msg.WParam.ToInt32 ( );
                bool isPaste = keys == Keys.V &amp;&amp; ModifierKeys == Keys.Control;
                bool isNumeric = IsNumeric ( keys );
                bool isKeyValid = IsKeyValid ( keys );
                if ( isNumeric | isKeyValid ) {
                    return false;
                } else if ( isPaste ) {
                    IDataObject obj = Clipboard.GetDataObject ( );
                    string input = ( string ) obj.GetData ( typeof ( string ) );
                    if ( !IsInputOrTextNumeric ( input ) ) {
                        return true;
                    }
                    return false;
                } else {
                    return true;
                }
            } else {
                return base.PreProcessMessage ( ref msg );
            }
        }

        protected override void WndProc ( ref Message m ) {
            if ( m.Msg == WM_PASTE ) {
                IDataObject obj = Clipboard.GetDataObject ( );
                string input = ( string ) obj.GetData ( typeof ( string ) );
                if ( !IsInputOrTextNumeric ( input ) ) {
                    m.Result = ( IntPtr ) 0;
                    return;
                }

            }
            base.WndProc ( ref m );
        }

        private bool IsNumeric ( Keys key ) {
            return ( ( key >= Keys.D0 &amp;&amp; key &lt;= Keys.D9 ) ||
                   ( key >= Keys.NumPad0 &amp;&amp; key &lt;= Keys.NumPad9 ) ) &amp;&amp;
                   ModifierKeys != Keys.Shift;
        }

        private bool IsKeyValid ( Keys key ) {
            bool ctrl = key == Keys.Control;
            bool ctrlZ = key == Keys.Z &amp;&amp; ModifierKeys == Keys.Control,
                 ctrlX = key == Keys.X &amp;&amp; ModifierKeys == Keys.Control,
                 ctrlC = key == Keys.C &amp;&amp; ModifierKeys == Keys.Control,
                 ctrlV = key == Keys.V &amp;&amp; ModifierKeys == Keys.Control,
                 homeEnd = key == Keys.Home | key == Keys.End,
                 del = key == Keys.Delete,
                 bksp = key == Keys.Back,
                 arrows = ( key == Keys.Up ) | ( key == Keys.Down ) | 
                          ( key == Keys.Left ) | ( key == Keys.Right );
            bool standardTests = ctrl | del | bksp | arrows | homeEnd | 
                                 ctrlC | ctrlX | ctrlV | ctrlZ;
            bool containsTokenChar = false;
            if ( !standardTests ) {
                string token = VKtoChar ( key );
                containsTokenChar = validTokens.ContainsKey ( token );
                if ( token != CurrentNumberFormat.CurrencyGroupSeparator &amp;&amp; 
                    Text.Contains ( token ) ) {
                    containsTokenChar = false;
                }
                if ( !IsInputOrTextNumeric ( token ) ) {
                    containsTokenChar = false;
                }
            }
            return standardTests | containsTokenChar;
        }

        private bool IsInputOrTextNumeric ( string tokenOrInput ) {
            string tmp = Text;
            string inserted = tmp.Insert ( SelectionStart, tokenOrInput );
            if ( !decimal.TryParse ( inserted, out decimal result ) ) {
                return false;
            }
            return true;
        }

        private static string VKtoChar ( Keys key ) {
            StringBuilder sb = new StringBuilder ( 256 );
            byte[] keystate = new byte&#91;256&#93;;
            if ( GetKeyboardState ( keystate ) ) {
                uint scanCode = MapVirtualKey ( ( uint ) key, 2 );
                int res = ToUnicode ( ( uint ) key, scanCode, keystate, sb, 256, 2 );
            }
            return sb.ToString ( );
        }

        static Dictionary&lt;string, string> validTokens = 
                                      new Dictionary&lt;string, string> ( );

        static NumericTextBox ( ) {
            validTokens.Add ( CurrentNumberFormat.NegativeSign, "" );
            validTokens.Add ( CurrentNumberFormat.NumberDecimalSeparator, "" );
            validTokens.Add ( CurrentNumberFormat.CurrencyGroupSeparator, "" );
        }

        &#91;DllImport ( "user32.dll", SetLastError = true )&#93;
        private static extern bool GetKeyboardState ( byte[] receivingBuffer );

        &#91;DllImport ( "user32.dll", SetLastError = true )&#93;
        private static extern int ToUnicode ( uint virtualKey, uint scanCode, 
            byte[] keyState, &#91;Out, MarshalAs ( UnmanagedType.LPWStr, SizeConst = 256 )&#93;  
            StringBuilder buffer, int bufferSize, uint flags );
        &#91;DllImport ( "user32.dll" )&#93;
        private static extern uint MapVirtualKey ( uint keyCode, uint mapType );
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*          NULLFX FREE SOFTWARE LICENSE              */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*  NumericTextBox Library                            */</span></span>
<span class="line"><span style="color: #008000">/*  by: Steve Whitley                                 */</span></span>
<span class="line"><span style="color: #008000">/*  © 2005 NullFX Software                            */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */</span></span>
<span class="line"><span style="color: #008000">/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */</span></span>
<span class="line"><span style="color: #008000">/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */</span></span>
<span class="line"><span style="color: #008000">/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */</span></span>
<span class="line"><span style="color: #008000">/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */</span></span>
<span class="line"><span style="color: #008000">/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */</span></span>
<span class="line"><span style="color: #008000">/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */</span></span>
<span class="line"><span style="color: #008000">/* AND LICENSES (MEANING THIS TEXT).                  */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">namespace</span><span style="color: #000000"> </span><span style="color: #267F99">NullFX</span><span style="color: #000000">.</span><span style="color: #267F99">Controls</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Collections</span><span style="color: #000000">.</span><span style="color: #267F99">Generic</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Globalization</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Runtime</span><span style="color: #000000">.</span><span style="color: #267F99">InteropServices</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Text</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Windows</span><span style="color: #000000">.</span><span style="color: #267F99">Forms</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">NumericTextBox</span><span style="color: #000000"> : </span><span style="color: #267F99">TextBox</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #267F99">NumberFormatInfo</span><span style="color: #000000"> </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000"> = </span></span>
<span class="line"><span style="color: #000000">               </span><span style="color: #001080">CultureInfo</span><span style="color: #000000">.</span><span style="color: #001080">CurrentCulture</span><span style="color: #000000">.</span><span style="color: #001080">NumberFormat</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">WM_KEYDOWN</span><span style="color: #000000"> = </span><span style="color: #098658">0x0100</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                  </span><span style="color: #001080">WM_PASTE</span><span style="color: #000000"> = </span><span style="color: #098658">0x0302</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">decimal</span><span style="color: #000000"> </span><span style="color: #001080">Value</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">set</span><span style="color: #000000"> { </span><span style="color: #001080">Text</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">.</span><span style="color: #795E26">ToString</span><span style="color: #000000"> ( ); }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">decimal</span><span style="color: #000000">.</span><span style="color: #795E26">TryParse</span><span style="color: #000000"> ( </span><span style="color: #001080">Text</span><span style="color: #000000">, </span><span style="color: #0000FF">out</span><span style="color: #000000"> </span><span style="color: #0000FF">decimal</span><span style="color: #000000"> </span><span style="color: #001080">tmpValue</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">tmpValue</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">PreProcessMessage</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">msg</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">msg</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">WM_KEYDOWN</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">Keys</span><span style="color: #000000"> </span><span style="color: #001080">keys</span><span style="color: #000000"> = ( </span><span style="color: #267F99">Keys</span><span style="color: #000000"> ) </span><span style="color: #001080">msg</span><span style="color: #000000">.</span><span style="color: #001080">WParam</span><span style="color: #000000">.</span><span style="color: #795E26">ToInt32</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isPaste</span><span style="color: #000000"> = </span><span style="color: #001080">keys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">V</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isNumeric</span><span style="color: #000000"> = </span><span style="color: #795E26">IsNumeric</span><span style="color: #000000"> ( </span><span style="color: #001080">keys</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isKeyValid</span><span style="color: #000000"> = </span><span style="color: #795E26">IsKeyValid</span><span style="color: #000000"> ( </span><span style="color: #001080">keys</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">isNumeric</span><span style="color: #000000"> | </span><span style="color: #001080">isKeyValid</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">isPaste</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #267F99">IDataObject</span><span style="color: #000000"> </span><span style="color: #001080">obj</span><span style="color: #000000"> = </span><span style="color: #001080">Clipboard</span><span style="color: #000000">.</span><span style="color: #795E26">GetDataObject</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">input</span><span style="color: #000000"> = ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> ) </span><span style="color: #001080">obj</span><span style="color: #000000">.</span><span style="color: #795E26">GetData</span><span style="color: #000000"> ( </span><span style="color: #0000FF">typeof</span><span style="color: #000000"> ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> ) );</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #795E26">IsInputOrTextNumeric</span><span style="color: #000000"> ( </span><span style="color: #001080">input</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">PreProcessMessage</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">msg</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">WndProc</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">WM_PASTE</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">IDataObject</span><span style="color: #000000"> </span><span style="color: #001080">obj</span><span style="color: #000000"> = </span><span style="color: #001080">Clipboard</span><span style="color: #000000">.</span><span style="color: #795E26">GetDataObject</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">input</span><span style="color: #000000"> = ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> ) </span><span style="color: #001080">obj</span><span style="color: #000000">.</span><span style="color: #795E26">GetData</span><span style="color: #000000"> ( </span><span style="color: #0000FF">typeof</span><span style="color: #000000"> ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> ) );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #795E26">IsInputOrTextNumeric</span><span style="color: #000000"> ( </span><span style="color: #001080">input</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Result</span><span style="color: #000000"> = ( </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> ) </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">WndProc</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsNumeric</span><span style="color: #000000"> ( </span><span style="color: #267F99">Keys</span><span style="color: #000000"> </span><span style="color: #001080">key</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> ( ( </span><span style="color: #001080">key</span><span style="color: #000000"> &gt;= </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">D0</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">key</span><span style="color: #000000"> &lt;= </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">D9</span><span style="color: #000000"> ) ||</span></span>
<span class="line"><span style="color: #000000">                   ( </span><span style="color: #001080">key</span><span style="color: #000000"> &gt;= </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">NumPad0</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">key</span><span style="color: #000000"> &lt;= </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">NumPad9</span><span style="color: #000000"> ) ) &amp;&amp;</span></span>
<span class="line"><span style="color: #000000">                   </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> != </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Shift</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsKeyValid</span><span style="color: #000000"> ( </span><span style="color: #267F99">Keys</span><span style="color: #000000"> </span><span style="color: #001080">key</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">ctrl</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">ctrlZ</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Z</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">ctrlX</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">X</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">ctrlC</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">C</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">ctrlV</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">V</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">homeEnd</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Home</span><span style="color: #000000"> | </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">End</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">del</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Delete</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">bksp</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Back</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">arrows</span><span style="color: #000000"> = ( </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Up</span><span style="color: #000000"> ) | ( </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Down</span><span style="color: #000000"> ) | </span></span>
<span class="line"><span style="color: #000000">                          ( </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Left</span><span style="color: #000000"> ) | ( </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Right</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">standardTests</span><span style="color: #000000"> = </span><span style="color: #001080">ctrl</span><span style="color: #000000"> | </span><span style="color: #001080">del</span><span style="color: #000000"> | </span><span style="color: #001080">bksp</span><span style="color: #000000"> | </span><span style="color: #001080">arrows</span><span style="color: #000000"> | </span><span style="color: #001080">homeEnd</span><span style="color: #000000"> | </span></span>
<span class="line"><span style="color: #000000">                                 </span><span style="color: #001080">ctrlC</span><span style="color: #000000"> | </span><span style="color: #001080">ctrlX</span><span style="color: #000000"> | </span><span style="color: #001080">ctrlV</span><span style="color: #000000"> | </span><span style="color: #001080">ctrlZ</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #001080">standardTests</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">token</span><span style="color: #000000"> = </span><span style="color: #795E26">VKtoChar</span><span style="color: #000000"> ( </span><span style="color: #001080">key</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000"> = </span><span style="color: #001080">validTokens</span><span style="color: #000000">.</span><span style="color: #795E26">ContainsKey</span><span style="color: #000000"> ( </span><span style="color: #001080">token</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">token</span><span style="color: #000000"> != </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000">.</span><span style="color: #001080">CurrencyGroupSeparator</span><span style="color: #000000"> &amp;&amp; </span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">Text</span><span style="color: #000000">.</span><span style="color: #795E26">Contains</span><span style="color: #000000"> ( </span><span style="color: #001080">token</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #795E26">IsInputOrTextNumeric</span><span style="color: #000000"> ( </span><span style="color: #001080">token</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">standardTests</span><span style="color: #000000"> | </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsInputOrTextNumeric</span><span style="color: #000000"> ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">tokenOrInput</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">tmp</span><span style="color: #000000"> = </span><span style="color: #001080">Text</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">inserted</span><span style="color: #000000"> = </span><span style="color: #001080">tmp</span><span style="color: #000000">.</span><span style="color: #795E26">Insert</span><span style="color: #000000"> ( </span><span style="color: #001080">SelectionStart</span><span style="color: #000000">, </span><span style="color: #001080">tokenOrInput</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #0000FF">decimal</span><span style="color: #000000">.</span><span style="color: #795E26">TryParse</span><span style="color: #000000"> ( </span><span style="color: #001080">inserted</span><span style="color: #000000">, </span><span style="color: #0000FF">out</span><span style="color: #000000"> </span><span style="color: #0000FF">decimal</span><span style="color: #000000"> </span><span style="color: #001080">result</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #795E26">VKtoChar</span><span style="color: #000000"> ( </span><span style="color: #267F99">Keys</span><span style="color: #000000"> </span><span style="color: #001080">key</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">StringBuilder</span><span style="color: #000000"> </span><span style="color: #001080">sb</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">StringBuilder</span><span style="color: #000000"> ( </span><span style="color: #098658">256</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">keystate</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #795E26">GetKeyboardState</span><span style="color: #000000"> ( </span><span style="color: #001080">keystate</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">scanCode</span><span style="color: #000000"> = </span><span style="color: #795E26">MapVirtualKey</span><span style="color: #000000"> ( ( </span><span style="color: #0000FF">uint</span><span style="color: #000000"> ) </span><span style="color: #001080">key</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">res</span><span style="color: #000000"> = </span><span style="color: #795E26">ToUnicode</span><span style="color: #000000"> ( ( </span><span style="color: #0000FF">uint</span><span style="color: #000000"> ) </span><span style="color: #001080">key</span><span style="color: #000000">, </span><span style="color: #001080">scanCode</span><span style="color: #000000">, </span><span style="color: #001080">keystate</span><span style="color: #000000">, </span><span style="color: #001080">sb</span><span style="color: #000000">, </span><span style="color: #098658">256</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">sb</span><span style="color: #000000">.</span><span style="color: #795E26">ToString</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #267F99">Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; </span><span style="color: #001080">validTokens</span><span style="color: #000000"> = </span></span>
<span class="line"><span style="color: #000000">                                      </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; ( );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #795E26">NumericTextBox</span><span style="color: #000000"> ( ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">validTokens</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000"> ( </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000">.</span><span style="color: #001080">NegativeSign</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">validTokens</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000"> ( </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000">.</span><span style="color: #001080">NumberDecimalSeparator</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">validTokens</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000"> ( </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000">.</span><span style="color: #001080">CurrencyGroupSeparator</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;user32.dll&quot;</span><span style="color: #000000">, </span><span style="color: #001080">SetLastError</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000"> )&#93;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">GetKeyboardState</span><span style="color: #000000"> ( </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">receivingBuffer</span><span style="color: #000000"> );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;user32.dll&quot;</span><span style="color: #000000">, </span><span style="color: #001080">SetLastError</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000"> )&#93;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #795E26">ToUnicode</span><span style="color: #000000"> ( </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">virtualKey</span><span style="color: #000000">, </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">scanCode</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">keyState</span><span style="color: #000000">, &#91;</span><span style="color: #267F99">Out</span><span style="color: #000000">, </span><span style="color: #267F99">MarshalAs</span><span style="color: #000000"> ( </span><span style="color: #001080">UnmanagedType</span><span style="color: #000000">.</span><span style="color: #001080">LPWStr</span><span style="color: #000000">, </span><span style="color: #001080">SizeConst</span><span style="color: #000000"> = </span><span style="color: #098658">256</span><span style="color: #000000"> )&#93;  </span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">StringBuilder</span><span style="color: #000000"> </span><span style="color: #001080">buffer</span><span style="color: #000000">, </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">bufferSize</span><span style="color: #000000">, </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">flags</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;user32.dll&quot;</span><span style="color: #000000"> )&#93;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #795E26">MapVirtualKey</span><span style="color: #000000"> ( </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">keyCode</span><span style="color: #000000">, </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">mapType</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>What this does, is watch the Windows Message Queue for incoming messages (specifically <code>WM_KEYDOWN</code> and <code>WM_PASTE</code>). If a key has been pressed, it will look to see if the key is actually a number. It also looks to see if a paste command has been sent. if a key has been pressed and it is a numeric key (there are a few more keys for convenience sake) or the paste operation has been invoked (the contents of the paste operation are checked to make sure that anything that gets pasted is a number, else it fails to paste in the data) and its contents are numeric, allows that data to be pasted into the textbox.</p>



<p>Since originally posting this control on my older website, I&#8217;ve made some minor updates, checking the key pressed against its text character, checking to see if the resulting value will parse as a decimal and adding a few more keystroke character checks in there.<br><br>For Clarity sake, <code>PreProcessMessage</code> is invoked before the Message is sent into the message queue. If the control handles this message, it returns true, and the message ends there. If it returns false, it will send the Message into the message pump for further processing. <code>WndProc</code> is similar to <code>WindowProc</code> in win32, and one can filter messages sent here like they used to in standard windows programming. In this sample, we&#8217;re peeking at the <code>KEYDOWN</code> message, in the <code>PreProcessMessage</code> function. Commands are not sent through here, but are passed in <code>WndProc</code>, where we can listen, and handle this Message ourselves (because we need to check the contents of the clip board for numeric data).<br><br>If <code>PreProcessMessage</code>&#8216;s Message contains numeric or one of our allowed keys, it returns false which forces the base TextBox to handle the instruction like normal, if not it returns true meaning we&#8217;ve handled it and it doesn&#8217;t get passed into the base TextBox control and nothing flows to the textbox. If <code>WndProc</code> receives a numeric only string in the clip board, then it sends the message to the base TextBox</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">);</span></span></code></pre></div>
</blockquote>



<p>if the clipboard contains alpha or other data, it sets the <code>LResult</code> to <code>0</code>, and returns without passing the message to the base TextBox effectively saying we&#8217;ve handled the message, and there&#8217;s no need to process it any further.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ScrollableRichTextBox</title>
		<link>http://www.sanity-free.com/scrollablerichtextbox.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Mon, 19 Apr 2004 18:00:24 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[customcontrol]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[scrollablerichtextbox]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=26</guid>

					<description><![CDATA[The standard RichTextBox&#8217;s &#8220;Auto-Scroll&#8221; functionality is so obscure, that most rarely ever find out how to use it. This class appends text and gives the option for the user to scroll to the bottom of the textbox. There used to be a threading problem which would throw an unhandled exception every now and then, but [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The standard RichTextBox&#8217;s &#8220;Auto-Scroll&#8221; functionality is so obscure, that most rarely ever find out how to use it. This class appends text and gives the option for the user to scroll to the bottom of the textbox.</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/******************************************************/
/*          NULLFX FREE SOFTWARE LICENSE              */
/******************************************************/
/*  ScrollableRichTextBox Library                     */
/*  by: Steve Whitley                                 */
/*  © 2005 NullFX Software                            */
/*                                                    */
/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */
/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */
/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */
/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */
/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */
/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */
/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */
/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */
/*                                                    */
/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */
/* AND LICENSES (MEANING THIS TEXT).                  */
/*                                                    */
/******************************************************/

namespace NullFX.Controls {
    using System;
    using System.Windows.Forms;
    /// &lt;summary>
    /// This components adds a much lacking function
    /// "Scroll to the end" which is missing
    /// from the original rich text box.
    /// &lt;/summary>
    public class ScrollableRichTextBox : RichTextBox {
        // constants for the message sending
        const int WM_VSCROLL = 0x0115;
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_SETFOCUS = 0x0007;
        const int WM_KILLFOCUS = 0x0008;
        readonly IntPtr SB_ENDSCROLL = (IntPtr)8;
        readonly IntPtr SB_BOTTOM = (IntPtr)7;
        // flag we use to determine if we can scroll
        bool _scrollable = true;
        private delegate void AppendTextDelegate(string text, bool scrollToEnd);
        public void AppendText(string text, bool scrollToEnd) {
            if(InvokeRequired) {
                Invoke(new AppendTextDelegate(AppendText), 
                           new object[] {text, scrollToEnd});
            }else {
                decimal length = base.Text.Length + text.Length;
                if(length >= base.MaxLength) base.Clear();
                base.Text += text;
                if(_scrollable &amp;&amp; scrollToEnd) {
                    if(IntPtr.Zero != base.Handle) {
                        base.SelectionStart = base.Text.Length;
                        Message m = Message.Create(
                            base.Handle, 
                            WM_VSCROLL, 
                            SB_BOTTOM, IntPtr.Zero);
                        base.WndProc(ref m);
                    }
                }
            }

        }

        protected override void WndProc(ref Message m) {
            // if we're in a scroll set the scrolling flag 
            // to false &amp; skip theauto scroll
            if((m.Msg == WM_LBUTTONDOWN) 
                || m.Msg == WM_VSCROLL 
                &amp;&amp; m.WParam != SB_BOTTOM) {
                _scrollable = false;
            }

            // if we are done scrolling, set the falg to true &amp; do the scrolling
            if(m.Msg == WM_VSCROLL &amp;&amp; m.WParam == SB_ENDSCROLL) {
                _scrollable = true;
            }
            // HACK: this keeps the user from setting the cursor in the textbox
            //  because that causes problems if they do
            if(m.Msg == WM_SETFOCUS &amp;&amp; base.ReadOnly) m.Msg = WM_KILLFOCUS;

            base.WndProc (ref m);
        }
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*          NULLFX FREE SOFTWARE LICENSE              */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*  ScrollableRichTextBox Library                     */</span></span>
<span class="line"><span style="color: #008000">/*  by: Steve Whitley                                 */</span></span>
<span class="line"><span style="color: #008000">/*  © 2005 NullFX Software                            */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */</span></span>
<span class="line"><span style="color: #008000">/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */</span></span>
<span class="line"><span style="color: #008000">/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */</span></span>
<span class="line"><span style="color: #008000">/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */</span></span>
<span class="line"><span style="color: #008000">/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */</span></span>
<span class="line"><span style="color: #008000">/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */</span></span>
<span class="line"><span style="color: #008000">/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */</span></span>
<span class="line"><span style="color: #008000">/* AND LICENSES (MEANING THIS TEXT).                  */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">namespace</span><span style="color: #000000"> </span><span style="color: #267F99">NullFX</span><span style="color: #000000">.</span><span style="color: #267F99">Controls</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Windows</span><span style="color: #000000">.</span><span style="color: #267F99">Forms</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #008000">    /// </span><span style="color: #800000">&lt;summary&gt;</span></span>
<span class="line"><span style="color: #008000">    /// This components adds a much lacking function</span></span>
<span class="line"><span style="color: #008000">    /// &quot;Scroll to the end&quot; which is missing</span></span>
<span class="line"><span style="color: #008000">    /// from the original rich text box.</span></span>
<span class="line"><span style="color: #008000">    /// </span><span style="color: #800000">&lt;/summary&gt;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">ScrollableRichTextBox</span><span style="color: #000000"> : </span><span style="color: #267F99">RichTextBox</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #008000">        // constants for the message sending</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">WM_VSCROLL</span><span style="color: #000000"> = </span><span style="color: #098658">0x0115</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">WM_LBUTTONDOWN</span><span style="color: #000000"> = </span><span style="color: #098658">0x0201</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">WM_SETFOCUS</span><span style="color: #000000"> = </span><span style="color: #098658">0x0007</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">WM_KILLFOCUS</span><span style="color: #000000"> = </span><span style="color: #098658">0x0008</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> </span><span style="color: #001080">SB_ENDSCROLL</span><span style="color: #000000"> = (</span><span style="color: #267F99">IntPtr</span><span style="color: #000000">)</span><span style="color: #098658">8</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">readonly</span><span style="color: #000000"> </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> </span><span style="color: #001080">SB_BOTTOM</span><span style="color: #000000"> = (</span><span style="color: #267F99">IntPtr</span><span style="color: #000000">)</span><span style="color: #098658">7</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #008000">        // flag we use to determine if we can scroll</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">_scrollable</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">delegate</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #267F99">AppendTextDelegate</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">text</span><span style="color: #000000">, </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">scrollToEnd</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">AppendText</span><span style="color: #000000">(</span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">text</span><span style="color: #000000">, </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">scrollToEnd</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">InvokeRequired</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #795E26">Invoke</span><span style="color: #000000">(</span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">AppendTextDelegate</span><span style="color: #000000">(</span><span style="color: #001080">AppendText</span><span style="color: #000000">), </span></span>
<span class="line"><span style="color: #000000">                           </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">object</span><span style="color: #000000">[] {</span><span style="color: #001080">text</span><span style="color: #000000">, </span><span style="color: #001080">scrollToEnd</span><span style="color: #000000">});</span></span>
<span class="line"><span style="color: #000000">            }</span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">decimal</span><span style="color: #000000"> </span><span style="color: #001080">length</span><span style="color: #000000"> = </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">Text</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000"> + </span><span style="color: #001080">text</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">length</span><span style="color: #000000"> &gt;= </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">MaxLength</span><span style="color: #000000">) </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">Clear</span><span style="color: #000000">();</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">Text</span><span style="color: #000000"> += </span><span style="color: #001080">text</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">_scrollable</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">scrollToEnd</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">IntPtr</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000"> != </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">Handle</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">SelectionStart</span><span style="color: #000000"> = </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">Text</span><span style="color: #000000">.</span><span style="color: #001080">Length</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> = </span><span style="color: #001080">Message</span><span style="color: #000000">.</span><span style="color: #795E26">Create</span><span style="color: #000000">(</span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">Handle</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #001080">WM_VSCROLL</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">                            </span><span style="color: #001080">SB_BOTTOM</span><span style="color: #000000">, </span><span style="color: #001080">IntPtr</span><span style="color: #000000">.</span><span style="color: #001080">Zero</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #008000">            // if we&#39;re in a scroll set the scrolling flag </span></span>
<span class="line"><span style="color: #008000">            // to false &amp; skip theauto scroll</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">((</span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">WM_LBUTTONDOWN</span><span style="color: #000000">) </span></span>
<span class="line"><span style="color: #000000">                || </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">WM_VSCROLL</span><span style="color: #000000"> </span></span>
<span class="line"><span style="color: #000000">                &amp;&amp; </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">WParam</span><span style="color: #000000"> != </span><span style="color: #001080">SB_BOTTOM</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">_scrollable</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #008000">            // if we are done scrolling, set the falg to true &amp; do the scrolling</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">WM_VSCROLL</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">WParam</span><span style="color: #000000"> == </span><span style="color: #001080">SB_ENDSCROLL</span><span style="color: #000000">) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">_scrollable</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #008000">            // HACK: this keeps the user from setting the cursor in the textbox</span></span>
<span class="line"><span style="color: #008000">            //  because that causes problems if they do</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000">(</span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">WM_SETFOCUS</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #001080">ReadOnly</span><span style="color: #000000">) </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> = </span><span style="color: #001080">WM_KILLFOCUS</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">WndProc</span><span style="color: #000000"> (</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">);</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span>
<span class="line"></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>There used to be a threading problem which would throw an unhandled exception every now and then, but due to <a href="https://docs.microsoft.com/en-us/archive/blogs/jfoscoding/updating-your-richtextbox-safely">an article recently published on msdn blogs</a> this has been fixed, and the change is reflected above.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
