<?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>Aaron Lerch &#187; ui</title>
	<atom:link href="http://www.aaronlerch.com/blog/category/ui/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aaronlerch.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 10 Mar 2010 12:45:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Watermarked edit controls</title>
		<link>http://www.aaronlerch.com/blog/2007/12/01/watermarked-edit-controls/</link>
		<comments>http://www.aaronlerch.com/blog/2007/12/01/watermarked-edit-controls/#comments</comments>
		<pubDate>Sat, 01 Dec 2007 21:58:48 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[windows forms]]></category>

		<guid isPermaLink="false">http://www.aaronlerch.com/blog/2007/12/01/watermarked-edit-controls/</guid>
		<description><![CDATA[Recently I wanted to use a WinForms TextBox with some &#8220;watermark text&#8221;, but had some trouble finding anything existing on the web. Which was surprising because of how ubiquitous they are. Turns out the terminology varies: cue, prompt, or watermark. And &#8220;watermark&#8221; is the least used.
Once I got my ducks in a row (by perusing [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I wanted to use a WinForms TextBox with some &#8220;watermark text&#8221;, but had some trouble finding anything existing on the web. Which was surprising because of how ubiquitous they are. Turns out the terminology varies: cue, prompt, or watermark. And &#8220;watermark&#8221; is the least used.</p>
<p>Once I got my ducks in a row (by perusing the <a href="http://msdn2.microsoft.com/en-us/library/bb775458.aspx">MSDN documentation on the Win32 edit control</a>, which is the foundation of the .NET TextBox anyway) I found a few resources online, but they either a) didn&#8217;t wrap the exact Win32 edit control behavior, or b) were just a one-off &#8220;send a message to the control like this&#8221;, when I&#8217;d prefer a more polished derived control with designer support, etc.</p>
<p>So I present <a href="http://www.aaronlerch.com/files/blog/CueTextBox.cs">CueTextBox.cs</a>, <a href="http://www.aaronlerch.com/files/blog/CueComboBox.cs">CueComboBox.cs</a>, and <a href="http://www.aaronlerch.com/files/blog/CueToolStripTextBox.cs">CueToolStripTextBox.cs</a>. Here&#8217;s a simple example that hosts all 3 of them:</p>
<p><a href="http://www.aaronlerch.com/files/blog/Watermarkededitcontrols_EEC3/image.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="217" alt="image" src="http://www.aaronlerch.com/files/blog/Watermarkededitcontrols_EEC3/image_thumb.png" width="233" border="0"></a></p>
<p>And, in the interest of making this as easy as possible to get, here is the code. It&#8217;s really a very simple extension &#8211; I&#8217;m not sure why this wasn&#8217;t included in the BCF (but I can guess: this will only work on Windows XP and higher, and only if visual styles are enabled).<br />Note that the downloaded versions have the license text, but I&#8217;ve left it off this page (the license from the downloaded files applies). Why do you care? <a href="http://www.codinghorror.com/blog/archives/000833.html">Let Jeff Atwood tell you.</a></p>
<div class="wlWriterSmartContent" id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:2e8d23c8-9c84-48bd-85d7-d65507fa38e0" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://www.aaronlerch.com/blog/2007/12/01/watermarked-edit-controls/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.aaronlerch.com/blog/2007/12/01/watermarked-edit-controls/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<p>CueTextbox.cs</p>
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> System.Runtime.InteropServices;

<span class="kwrd">namespace</span> Lerch.Samples
{
    <span class="kwrd">public</span> <span class="kwrd">class</span> CueTextBox : TextBox
    {
        <span class="preproc">#region</span> PInvoke Helpers

        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">uint</span> ECM_FIRST = 0x1500;
        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">uint</span> EM_SETCUEBANNER = ECM_FIRST + 1;

        [DllImport(<span class="str">"user32.dll"</span>, CharSet = CharSet.Auto, SetLastError = <span class="kwrd">false</span>)]
        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">extern</span> IntPtr SendMessage(HandleRef hWnd, <span class="kwrd">uint</span> Msg, IntPtr wParam, String lParam);

        <span class="preproc">#endregion</span> PInvoke Helpers

        <span class="preproc">#region</span> CueText

        <span class="kwrd">private</span> <span class="kwrd">string</span> _cueText = String.Empty;

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Gets or sets the text the &lt;see cref="TextBox"/&gt; will display as a cue to the user.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        [Description(<span class="str">"The text value to be displayed as a cue to the user."</span>)]
        [Category(<span class="str">"Appearance"</span>)]
        [DefaultValue(<span class="str">""</span>)]
        [Localizable(<span class="kwrd">true</span>)]
        <span class="kwrd">public</span> <span class="kwrd">string</span> CueText
        {
            get { <span class="kwrd">return</span> _cueText; }
            set
            {
                <span class="kwrd">if</span> (<span class="kwrd">value</span> == <span class="kwrd">null</span>)
                {
                    <span class="kwrd">value</span> = String.Empty;
                }

                <span class="kwrd">if</span> (!_cueText.Equals(<span class="kwrd">value</span>, StringComparison.CurrentCulture))
                {
                    _cueText = <span class="kwrd">value</span>;
                    UpdateCue();
                    OnCueTextChanged(EventArgs.Empty);
                }
            }
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Occurs when the &lt;see cref="CueText"/&gt; property value changes.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">event</span> EventHandler CueTextChanged;

        [EditorBrowsable(EditorBrowsableState.Advanced)]
        <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnCueTextChanged(EventArgs e)
        {
            EventHandler handler = CueTextChanged;
            <span class="kwrd">if</span> (handler != <span class="kwrd">null</span>)
            {
                handler(<span class="kwrd">this</span>, e);
            }
        }

        <span class="preproc">#endregion</span> CueText

        <span class="preproc">#region</span> ShowCueTextOnFocus

        <span class="kwrd">private</span> <span class="kwrd">bool</span> _showCueTextWithFocus = <span class="kwrd">false</span>;

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Gets or sets a value indicating whether the &lt;see cref="TextBox"/&gt; will display the &lt;see cref="CueText"/&gt;</span>
        <span class="rem">/// even when the control has focus.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        [Description(<span class="str">"Indicates whether the CueText will be displayed even when the control has focus."</span>)]
        [Category(<span class="str">"Appearance"</span>)]
        [DefaultValue(<span class="kwrd">false</span>)]
        [Localizable(<span class="kwrd">true</span>)]
        <span class="kwrd">public</span> <span class="kwrd">bool</span> ShowCueTextWithFocus
        {
            get { <span class="kwrd">return</span> _showCueTextWithFocus; }
            set
            {
                <span class="kwrd">if</span> (_showCueTextWithFocus != <span class="kwrd">value</span>)
                {
                    _showCueTextWithFocus = <span class="kwrd">value</span>;
                    UpdateCue();
                    OnShowCueTextWithFocusChanged(EventArgs.Empty);
                }
            }
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Occurs when the &lt;see cref="ShowCueTextWithFocus"/&gt; property value changes.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">event</span> EventHandler ShowCueTextWithFocusChanged;

        [EditorBrowsable(EditorBrowsableState.Advanced)]
        <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnShowCueTextWithFocusChanged(EventArgs e)
        {
            EventHandler handler = ShowCueTextWithFocusChanged;
            <span class="kwrd">if</span> (handler != <span class="kwrd">null</span>)
            {
                handler(<span class="kwrd">this</span>, e);
            }
        }

        <span class="preproc">#endregion</span> ShowCueTextOnFocus

        <span class="preproc">#region</span> Overrides

        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnHandleCreated(EventArgs e)
        {
            UpdateCue();

            <span class="kwrd">base</span>.OnHandleCreated(e);
        }

        <span class="preproc">#endregion</span> Overrides

        <span class="kwrd">private</span> <span class="kwrd">void</span> UpdateCue()
        {
            <span class="rem">// If the handle isn't yet created, </span>
            <span class="rem">// this will be called when it is created</span>
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.IsHandleCreated)
            {
                SendMessage(<span class="kwrd">new</span> HandleRef(<span class="kwrd">this</span>, <span class="kwrd">this</span>.Handle), EM_SETCUEBANNER, (_showCueTextWithFocus) ? <span class="kwrd">new</span> IntPtr(1) : IntPtr.Zero, _cueText);
            }
        }
    }
}</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>CueComboBox.cs</p>
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> System.Runtime.InteropServices;

<span class="kwrd">namespace</span> Lerch.Samples
{
    <span class="kwrd">public</span> <span class="kwrd">class</span> CueComboBox : ComboBox
    {
        <span class="preproc">#region</span> PInvoke Helpers

        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">uint</span> CB_SETCUEBANNER = 0x1703;

        [DllImport(<span class="str">"user32.dll"</span>, CharSet = CharSet.Auto, SetLastError = <span class="kwrd">false</span>)]
        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">extern</span> IntPtr SendMessage(HandleRef hWnd, <span class="kwrd">uint</span> Msg, IntPtr wParam, String lParam);

        <span class="preproc">#endregion</span> PInvoke Helpers

        <span class="preproc">#region</span> CueText

        <span class="kwrd">private</span> <span class="kwrd">string</span> _cueText = String.Empty;

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Gets or sets the text the &lt;see cref="ComboBox"/&gt; will display as a cue to the user.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        [Description(<span class="str">"The text value to be displayed as a cue to the user."</span>)]
        [Category(<span class="str">"Appearance"</span>)]
        [DefaultValue(<span class="str">""</span>)]
        [Localizable(<span class="kwrd">true</span>)]
        <span class="kwrd">public</span> <span class="kwrd">string</span> CueText
        {
            get { <span class="kwrd">return</span> _cueText; }
            set
            {
                <span class="kwrd">if</span> (<span class="kwrd">value</span> == <span class="kwrd">null</span>)
                {
                    <span class="kwrd">value</span> = String.Empty;
                }

                <span class="kwrd">if</span> (!_cueText.Equals(<span class="kwrd">value</span>, StringComparison.CurrentCulture))
                {
                    _cueText = <span class="kwrd">value</span>;
                    UpdateCue();
                    OnCueTextChanged(EventArgs.Empty);
                }
            }
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Occurs when the &lt;see cref="CueText"/&gt; property value changes.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">event</span> EventHandler CueTextChanged;

        [EditorBrowsable(EditorBrowsableState.Advanced)]
        <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnCueTextChanged(EventArgs e)
        {
            EventHandler handler = CueTextChanged;
            <span class="kwrd">if</span> (handler != <span class="kwrd">null</span>)
            {
                handler(<span class="kwrd">this</span>, e);
            }
        }

        <span class="preproc">#endregion</span> CueText

        <span class="preproc">#region</span> Overrides

        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnHandleCreated(EventArgs e)
        {
            UpdateCue();

            <span class="kwrd">base</span>.OnHandleCreated(e);
        }

        <span class="preproc">#endregion</span> Overrides

        <span class="kwrd">private</span> <span class="kwrd">void</span> UpdateCue()
        {
            <span class="rem">// If the handle isn't yet created, </span>
            <span class="rem">// this will be called when it is created</span>
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.IsHandleCreated)
            {
                SendMessage(<span class="kwrd">new</span> HandleRef(<span class="kwrd">this</span>, <span class="kwrd">this</span>.Handle), CB_SETCUEBANNER, IntPtr.Zero, _cueText);
            }
        }
    }
}</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>CueToolStripTextBox.cs</p>
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> System.Runtime.InteropServices;

<span class="kwrd">namespace</span> Lerch.Samples
{
    <span class="kwrd">public</span> <span class="kwrd">class</span> CueToolStripTextBox : ToolStripTextBox
    {
        <span class="kwrd">public</span> CueToolStripTextBox()
            : <span class="kwrd">base</span>()
        {
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.Control != <span class="kwrd">null</span>)
            {
                <span class="kwrd">this</span>.Control.HandleCreated += <span class="kwrd">new</span> EventHandler(OnControlHandleCreated);
            }
        }

        <span class="kwrd">public</span> CueToolStripTextBox(<span class="kwrd">string</span> name)
            : <span class="kwrd">base</span>(name)
        {
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.Control != <span class="kwrd">null</span>)
            {
                <span class="kwrd">this</span>.Control.HandleCreated += <span class="kwrd">new</span> EventHandler(OnControlHandleCreated);
            }
        }

        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Dispose(<span class="kwrd">bool</span> disposing)
        {
            <span class="kwrd">if</span> (disposing)
            {
                <span class="kwrd">if</span> (<span class="kwrd">this</span>.Control != <span class="kwrd">null</span>)
                {
                    <span class="kwrd">this</span>.Control.HandleCreated -= <span class="kwrd">new</span> EventHandler(OnControlHandleCreated);
                }
            }

            <span class="kwrd">base</span>.Dispose(disposing);
        }

        <span class="kwrd">void</span> OnControlHandleCreated(<span class="kwrd">object</span> sender, EventArgs e)
        {
            UpdateCue();
        }

        <span class="preproc">#region</span> PInvoke Helpers

        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">uint</span> ECM_FIRST = 0x1500;
        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">uint</span> EM_SETCUEBANNER = ECM_FIRST + 1;

        [DllImport(<span class="str">"user32.dll"</span>, CharSet = CharSet.Auto, SetLastError = <span class="kwrd">false</span>)]
        <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">extern</span> IntPtr SendMessage(HandleRef hWnd, <span class="kwrd">uint</span> Msg, IntPtr wParam, String lParam);

        <span class="preproc">#endregion</span> PInvoke Helpers

        <span class="preproc">#region</span> CueText

        <span class="kwrd">private</span> <span class="kwrd">string</span> _cueText = String.Empty;

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Gets or sets the text the &lt;see cref="TextBox"/&gt; will display as a cue to the user.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        [Description(<span class="str">"The text value to be displayed as a cue to the user."</span>)]
        [Category(<span class="str">"Appearance"</span>)]
        [DefaultValue(<span class="str">""</span>)]
        [Localizable(<span class="kwrd">true</span>)]
        <span class="kwrd">public</span> <span class="kwrd">string</span> CueText
        {
            get { <span class="kwrd">return</span> _cueText; }
            set
            {
                <span class="kwrd">if</span> (<span class="kwrd">value</span> == <span class="kwrd">null</span>)
                {
                    <span class="kwrd">value</span> = String.Empty;
                }

                <span class="kwrd">if</span> (!_cueText.Equals(<span class="kwrd">value</span>, StringComparison.CurrentCulture))
                {
                    _cueText = <span class="kwrd">value</span>;
                    UpdateCue();
                    OnCueTextChanged(EventArgs.Empty);
                }
            }
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Occurs when the &lt;see cref="CueText"/&gt; property value changes.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">event</span> EventHandler CueTextChanged;

        [EditorBrowsable(EditorBrowsableState.Advanced)]
        <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnCueTextChanged(EventArgs e)
        {
            EventHandler handler = CueTextChanged;
            <span class="kwrd">if</span> (handler != <span class="kwrd">null</span>)
            {
                handler(<span class="kwrd">this</span>, e);
            }
        }

        <span class="preproc">#endregion</span> CueText

        <span class="preproc">#region</span> ShowCueTextOnFocus

        <span class="kwrd">private</span> <span class="kwrd">bool</span> _showCueTextWithFocus = <span class="kwrd">false</span>;

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Gets or sets a value indicating whether the &lt;see cref="TextBox"/&gt; will display the &lt;see cref="CueText"/&gt;</span>
        <span class="rem">/// even when the control has focus.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        [Description(<span class="str">"Indicates whether the CueText will be displayed even when the control has focus."</span>)]
        [Category(<span class="str">"Appearance"</span>)]
        [DefaultValue(<span class="kwrd">false</span>)]
        [Localizable(<span class="kwrd">true</span>)]
        <span class="kwrd">public</span> <span class="kwrd">bool</span> ShowCueTextWithFocus
        {
            get { <span class="kwrd">return</span> _showCueTextWithFocus; }
            set
            {
                <span class="kwrd">if</span> (_showCueTextWithFocus != <span class="kwrd">value</span>)
                {
                    _showCueTextWithFocus = <span class="kwrd">value</span>;
                    UpdateCue();
                    OnShowCueTextWithFocusChanged(EventArgs.Empty);
                }
            }
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Occurs when the &lt;see cref="ShowCueTextWithFocus"/&gt; property value changes.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">event</span> EventHandler ShowCueTextWithFocusChanged;

        [EditorBrowsable(EditorBrowsableState.Advanced)]
        <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnShowCueTextWithFocusChanged(EventArgs e)
        {
            EventHandler handler = ShowCueTextWithFocusChanged;
            <span class="kwrd">if</span> (handler != <span class="kwrd">null</span>)
            {
                handler(<span class="kwrd">this</span>, e);
            }
        }

        <span class="preproc">#endregion</span> ShowCueTextOnFocus

        <span class="kwrd">private</span> <span class="kwrd">void</span> UpdateCue()
        {
            <span class="rem">// If the handle isn't yet created, </span>
            <span class="rem">// this will be called when it is created</span>
            <span class="kwrd">if</span> ((<span class="kwrd">this</span>.Control != <span class="kwrd">null</span>) &amp;&amp; (<span class="kwrd">this</span>.Control.IsHandleCreated))
            {
                SendMessage(<span class="kwrd">new</span> HandleRef(<span class="kwrd">this</span>.Control, <span class="kwrd">this</span>.Control.Handle), EM_SETCUEBANNER, (_showCueTextWithFocus) ? <span class="kwrd">new</span> IntPtr(1) : IntPtr.Zero, _cueText);
            }
        }
    }
}</pre>
<div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e2e2dc60-4112-4f74-a361-e496f9980058" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tags: <a href="http://technorati.com/tags/Windows%20Forms" rel="tag">Windows Forms</a>, <a href="http://technorati.com/tags/UI" rel="tag">UI</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronlerch.com/blog/2007/12/01/watermarked-edit-controls/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Decision Making and UI Design</title>
		<link>http://www.aaronlerch.com/blog/2007/08/15/decision-making-and-ui-design/</link>
		<comments>http://www.aaronlerch.com/blog/2007/08/15/decision-making-and-ui-design/#comments</comments>
		<pubDate>Wed, 15 Aug 2007 14:10:00 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[community]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.aaronlerch.com/blog/2007/08/15/decision-making-and-ui-design/</guid>
		<description><![CDATA[I was reflecting recently on what I thought made up a healthy decision making process.  I&#8217;m not a psychologist or anything, I just sometimes like to sit and think about weird stuff.  Here are 3 components that I think should be equally employed when making a decision&#8211;none of this is new, it&#8217;s all [...]]]></description>
			<content:encoded><![CDATA[<p>I was reflecting recently on what I thought made up a healthy decision making process.  I&#8217;m not a psychologist or anything, I just sometimes like to sit and think about weird stuff.  Here are 3 components that I think should be equally employed when making a decision&#8211;none of this is new, <a href="http://en.wikipedia.org/wiki/Decision_making" title="Wikipedia entry on Decision Making">it&#8217;s all been done</a>, and done much better:</p>
<ol>
<li><strong>Reason*</strong><br />
Rationality, morality, and logic.</li>
<li><strong>Intellect</strong><br />
Collecting and analyzing evidence, weighing feasibility, assessing situations, clarifying assumptions, etc.</li>
<li><strong>Emotion</strong><br />
Feelings, intuition, and instinct.</li>
</ol>
<p><font size="1">* Depending on how you interpret the word, Reason can be somewhat closely associated with both Intellect and Emotion.  Still, I felt like separating them out.</font></p>
<p>Ground breaking, eh? You know, my sister just got her Masters degree in Psychology from Northwestern University &#8211; maybe some of it rubbed off on me? Yeah.  But anyway, as I think about the 3 components I mentioned, something is missing. I think there&#8217;s a critical fourth component that we (at least in the western world) too often ignore:  <strong>Community</strong>.</p>
<p>I think many people would recognize that in the western world we&#8217;ve grown much more individualistic than people have been historically.  Families are &#8220;different&#8221;&#8211;more scattered, for example&#8211;and we no longer have structures like tribes or villages, all of which incorporate close nit communities of people living together day-by-day.  I&#8217;m not saying there aren&#8217;t valid reasons for our move away from small tight communities, or that it&#8217;s inherently bad, but I do think we&#8217;ve lost something in the process.</p>
<p>When we factor only Reason, Intellect, and Emotion into a decision, absent from Community, we miss all the other perspectives of Reason, Intellect, and Emotion that other people bring to the same situation&#8211;often more experienced perspectives.  Of course, we still need to be the ones that make the decision, and definitely I&#8217;m <em>not</em> advocating <a href="http://en.wikipedia.org/wiki/Groupthink" title="Wikipedia article on Groupthink">Groupthink</a>.</p>
<h3>Bringing It Back Home to UI Design</h3>
<p>So then I started thinking, how does this relate to User Interface design in particular, and application design in general?  When we make decisions surrounding user interfaces, which of the <em>four</em> components are we actively engaging?</p>
<p>Example: a &#8220;Tools-&gt;Options&#8221; dialog.  (C&#8217;mon, you know you&#8217;ve got one in your app, everybody&#8217;s doin&#8217; it!)<br />
Decision: What options should we expose?<br />
(Sub-decision: How should we expose those options?)</p>
<p><strong>Intellect</strong>, and to a certain extent Reason, tend to be the big drivers when deciding which configuration options to include.  Which options should we include? All of them, naturally! And how should we expose them? Numbers should be specified via a slider, textbox, or spin control, and a boolean flag should be a checkbox, etc.  Makes sense, and offers the user maximum control.  How should we organize it? Just slap them on some property sheets and be done with it. Just as long as they&#8217;re getting exposed.</p>
<p>But what about <strong>Emotion</strong>? I could expose all those options, but users are going to <em><font color="#804040">feel dirty</font></em> every time they are forced to open the Options dialog.  Or <strong>Reason/Morality</strong>: is it irrational or even <em>immoral</em> to offer esoteric configuration options?  Is it tantamount to actually inflicting pain on someone if we make them try to grok what the difference is between using &#8220;the default value&#8221;, &#8220;an override&#8221;, or &#8220;an override-then-the-default-depending on option C&#8221;, and to do so in such a way that seemingly doesn&#8217;t make sense <em>on purpose</em>?</p>
<p>What we really need, is to incorporate all 3 components along with <strong>Community</strong> in the decision making process.  In too many smaller software companies it&#8217;s developers using their Intellect, and nothing more.  Community provides the necessary ballast.  What is the intent of the application?  What do we even <em>want</em> users to be able to configure in the first place?  How will users <em>most likely</em> use the app? Will it line up with our intention, or will it diverge?  The questions can be endless, but of great value. And they should be asked!</p>
<p>How can we gain this communal component to decisions? <a href="http://www.communityhacker.com/">Roy Osherove</a> has some pretty good ideas, <em>for a start.</em>  But the real key, however you do it, is to actually ask people what they think, feel, and believe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronlerch.com/blog/2007/08/15/decision-making-and-ui-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>User Interface Gone Good</title>
		<link>http://www.aaronlerch.com/blog/2007/02/03/user-interface-gone-good/</link>
		<comments>http://www.aaronlerch.com/blog/2007/02/03/user-interface-gone-good/#comments</comments>
		<pubDate>Sat, 03 Feb 2007 16:32:00 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.aaronlerch.com/blog/2007/02/03/user-interface-gone-good/</guid>
		<description><![CDATA[Okay, I just ragged on an electronic Sudoku user interface, so now I equally want to commend an application for a user interface job well done in a small (but in my opinion significant) way.  The application? Skype.
Let me start by saying that I really agree with Jeff Atwood&#8217;s assessment of icons, toolbars, etc. [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, I just <a href="http://www.aaronlerch.com/blog/2007/02/user-interface-gone-bad.html">ragged on an electronic Sudoku user interface</a>, so now I equally want to commend an application for a user interface job well done in a small (but in my opinion significant) way.  The application? <a href="http://www.skype.com/">Skype</a>.</p>
<p>Let me start by saying that I really agree with <a href="http://www.codinghorror.com/blog/archives/000523.html">Jeff Atwood&#8217;s assessment</a> of icons, toolbars, etc. and how they relate to a user&#8217;s ability to interact with and understand an application. (I alluded to this in my last post.) I think this is evidenced by some of the improvements in Office 2007 &#8211; those guys spend a lot of time and money on usability, and it shows in the new interface.</p>
<p>Skype&#8217;s user interface has done a really good job with &#8220;fitting a lot into a little&#8221; by incrementally showing more information to the user, as they ask for it.  Sometimes the user directly asks for it.  Consider below where I progressively want to get more options about my Skype account:</p>
<p><a href="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype12.jpg" atomicselection="true"><img src="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype1_thumb.jpg" style="border-width: 0px" border="0" height="64" width="274" /></a><br />
<a href="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype22.jpg" atomicselection="true"><img src="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype2_thumb.jpg" style="border-width: 0px" border="0" height="114" width="275" /></a><br />
<a href="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype32.jpg" atomicselection="true"><img src="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype3_thumb.jpg" style="border-width: 0px" border="0" height="181" width="274" /></a></p>
<p>Other times the user doesn&#8217;t directly ask for more information.  Watch what happens as I increase the horizontal width of the window. I might be asking myself &#8220;What does the flag with the zero mean?&#8221;</p>
<p><a href="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype242.jpg" atomicselection="true"><img src="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype24_thumb.jpg" style="border-width: 0px" border="0" height="34" width="275" /></a><br />
<a href="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype252.jpg" atomicselection="true"><img src="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype25_thumb.jpg" style="border-width: 0px" border="0" height="37" width="311" /></a><br />
<a href="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype262.jpg" atomicselection="true"><img src="http://www.aaronlerch.com/files/blog/UserInterfaceGoneGood_E8B1/Skype26_thumb.jpg" style="border-width: 0px" border="0" height="39" width="339" /></a></p>
<p>These are two examples of how User Interface design, or at worst just putting some extra thought into your UI can make a big difference. These are also unfortunately the types of things that take extra time that is often not accounted for in the development schedule when the goal is to roll out a new feature, not a well-designed user interface. Maybe that&#8217;s where agile software development approaches like <a href="http://en.wikipedia.org/wiki/Scrum_(in_management)">Scrum</a> make a difference, I don&#8217;t know.</p>
<p><strong>Update:</strong> I apologize for the poor quality of the images, I had to take them using Alt+PrintScreen over Remote Desktop. I would&#8217;ve rather used <a href="http://weblogs.asp.net/kennykerr/">Kenny Kerr&#8217;s</a> <a href="http://weblogs.asp.net/kennykerr/archive/2007/01/28/window-clippings-1-5.aspx">Window Clippings</a>, but it doesn&#8217;t work over terminal services&#8211;something about needing a 32-bit color display. <img src='http://www.aaronlerch.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronlerch.com/blog/2007/02/03/user-interface-gone-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>User Interface Gone Bad</title>
		<link>http://www.aaronlerch.com/blog/2007/02/03/user-interface-gone-bad/</link>
		<comments>http://www.aaronlerch.com/blog/2007/02/03/user-interface-gone-bad/#comments</comments>
		<pubDate>Sat, 03 Feb 2007 15:50:00 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.aaronlerch.com/blog/2007/02/03/user-interface-gone-bad/</guid>
		<description><![CDATA[I was looking at an electronic Sudoku game my wife got for Christmas this year, and it struck me just how awful the user interface is.  And if you think the interface is bad, you should try actually using it! I think there&#8217;s some not-subtle lessons I can learn from this as a software [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.aaronlerch.com/files/blog/UserInterfaceGoneBad_DED6/sudoku4.jpg" atomicselection="true"><img src="http://www.aaronlerch.com/files/blog/UserInterfaceGoneBad_DED6/sudoku_thumb2.jpg" style="border-width: 0px" align="right" border="0" height="240" width="141" /></a>I was looking at an electronic <a href="http://en.wikipedia.org/wiki/Sudoku">Sudoku</a> game my wife got for Christmas this year, and it struck me just how awful the user interface is.  And if you think the interface is bad, you should try actually using it! I think there&#8217;s some not-subtle lessons I can learn from this as a software developer.  I have no idea who makes this device, or what possessed them to try in the first place. But apparently they&#8217;ve made at least one sale, so kudo&#8217;s to them.</p>
<p><a href="http://www.aaronlerch.com/files/blog/UserInterfaceGoneBad_DED6/sudokucontrols4.jpg" atomicselection="true"><img src="http://www.aaronlerch.com/files/blog/UserInterfaceGoneBad_DED6/sudokucontrols_thumb2.jpg" style="border-width: 0px" align="left" border="0" height="238" width="240" /></a> The top half of the device is a typical Sudoku grid.  To the left is a closer view of the controls on the lower half.  The first thing that stands out is that there is zero text except for the name of the game, and the difficulty levels. We are expected to either a) read an instruction manual, (not likely) &#8212; assuming we even have it &#8212; or b) guess what each button does by trial and error.  Let me ask you when the last time was that you sat down and read a gadget&#8217;s instruction manual before even turning it on? No way! You rip the thing open, and start playing.  While I recognize the need for instructions and manuals (systems are complicated, more often than not), a UI designer (and/or software developer) should work <strong>as hard as possible</strong> to enable a first-time user to enter the system and discover by exploring.</p>
<p>Given that&#8217;s what I did with this Sudoku game, the only buttons that I immediately understood were the directional arrows and the X (which cleared a square). Even a single word next to (or under) each button <a href="http://www.codinghorror.com/blog/archives/000523.html">would make a world of difference</a>.  And I&#8217;m sorry, but what on earth is the book supposed to mean? Easy, Medium, Hard, and Scholarly?  The button with four horizontal lines reminded me of something from the movie <a href="http://www.imdb.com/title/tt0119116/">The Fifth Element</a>, I was hopeful that pressing it would produce ultimate Love and banish evil forever, but nope, it actually didn&#8217;t even do anything (although I suppose it&#8217;s possible that at that moment in another universe a living meteor that was heading for earth simply &#8220;shut down&#8221; and I&#8217;ll never know).</p>
<p>All I have left to say is if you have this device, do <strong>not</strong> press the &#8220;Play&#8221; button during your game, because it instantly and irrevocably clears the board and starts a new game. &lt;sigh&gt; That was frustrating.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronlerch.com/blog/2007/02/03/user-interface-gone-bad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The extra five percent</title>
		<link>http://www.aaronlerch.com/blog/2006/08/11/the-extra-five-percent/</link>
		<comments>http://www.aaronlerch.com/blog/2006/08/11/the-extra-five-percent/#comments</comments>
		<pubDate>Fri, 11 Aug 2006 01:22:00 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.aaronlerch.com/blog/2006/08/11/the-extra-five-percent/</guid>
		<description><![CDATA[Software developers at my company are, naturally, grouped into teams that tackle (or “own”) respective portions of the platform we produce.  I’m on the client team which means we are responsible for most of the applications that users use to interface with the system.  I say most because some specific server-focused teams still [...]]]></description>
			<content:encoded><![CDATA[<p>Software developers at <a href="http://www.inin.com/">my company</a> are, naturally, grouped into teams that tackle (or “own”) respective portions of the platform we produce.  I’m on the client team which means we are responsible for most of the applications that users use to interface with the system.  I say <em>most</em> because some specific server-focused teams still develop and maintain their own client interfaces for administrators (even though we own the overall “admin” client application).</p>
<p>Anyway, I was recently promoted to a Team Lead in the client team (which is sort of a sub-team lead, actually), with my responsibilities being over the applications that are “user”-centric (bad description, I realize).  A better way to put it is the applications that end-users will use to interact with our system, as opposed to administrative applications, web-based applications (whether user or admin focused), or third-party development APIs.</p>
<p>In our first team meeting we discussed several things, but I brought up two items specifically.  The first was a quote from <a href="http://www.joelonsoftware.com/">Joel Spolsky’s</a> online (and print) book <a href="http://www.amazon.com/gp/product/1893115941/sr=8-3/qid=1155272159/ref=pd_bbs_3/104-8604263-0347135?ie=UTF8">User Interface Design for Programmers</a>.  He <a href="http://www.joelonsoftware.com/uibook/chapters/fog0000000057.html">says</a>:</p>
<blockquote dir="ltr" style="margin-right: 0px"><p>“A user interface is well-designed when the program behaves exactly how the user thought it would.”</p></blockquote>
<p>This is especially relevant to my team since our goal is not a “flashy” or “pretty” application (even though we desire both of them, and they both have their place).  We will ultimately be successful when our applications behave exactly like the user thinks it should and the little annoyances they experience <em>every second</em> from using our applications are removed.</p>
<p>The second thing I brought up was a principle I learned from several years ago when <a href="http://www.worth1000.com/stories/stats.asp?uid=38822&amp;display=photoshop">I used to participate</a> in the photoshop contests at <a href="http://www.worth1000.com/">Worth 1000</a>.  I don’t remember where I read it on the web site, but some advice offered by a more advanced “chopper” to wannabes included a final reminder that the difference between a good submission and a great submission—between 3rd place and 1st place—is the extra five percent effort put in at the end.  Often one does a good job on something and then whether due to the fatigue from working hard, complacency born from over-familiarity with the project, or some other unnamed factor, the end result is “good enough” and submitted.  It’s true that a good job was indeed done—something very functional was created, for example—but with 5% more effort it could go from good to <em>great</em>.  And I don’t necessarily mean great in that flashy, pretty, <a href="http://www.apple.com/macosx/leopard/">Mac</a> kind of great, but great in that it’s-so-usable-I-don’t-even-know-I’m-using-it sense.</p>
<p>I think a really good example of this principle was highlighted in a post by <a href="http://miksovsky.blogs.com/">Jan Miksovsky</a> where <a href="http://miksovsky.blogs.com/flowstate/2006/01/speed_tasks_wit.html">he writes about a well thought through, and extremely subtle feature of Microsoft Outlook</a>.</p>
<p>I’m going to be keeping my eyes open for work done on the web or the desktop that exhibit “the extra five percent” and look at what was done and how it was done.  Maybe if I find something interesting I’ll post it here… otherwise it’s back to tech posts for me!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronlerch.com/blog/2006/08/11/the-extra-five-percent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gaming and Application Development</title>
		<link>http://www.aaronlerch.com/blog/2006/04/26/gaming-and-application-development/</link>
		<comments>http://www.aaronlerch.com/blog/2006/04/26/gaming-and-application-development/#comments</comments>
		<pubDate>Wed, 26 Apr 2006 17:25:00 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.aaronlerch.com/blog/2006/04/26/gaming-and-application-development/</guid>
		<description><![CDATA[I ran across this article (and most specifically this excerpt) in my RSS reader this afternoon:
&#8220;Now an entire generation has grown up with a different set of games than any before it. The last thing they do is read the manual. Instead, they pick up the controller and start mashing buttons to see what happens. [...]]]></description>
			<content:encoded><![CDATA[<p>I ran across this article (and most specifically this excerpt) in my RSS reader this afternoon:</p>
<p>&#8220;Now an entire generation has grown up with a different set of games than any before it. The last thing they do is read the manual. Instead, they pick up the controller and start mashing buttons to see what happens. This isn&#8217;t a random process; it&#8217;s the essence of the scientific method and it&#8217;s a fundamentally different take on problem-solving than the linear, read-the-manual-first approach of their parents. The fact that they are learning in a totally new way &#8211; means they&#8217;ll treat the world as a place for creation, not consumption.&#8221; &#8211; <a href="http://www.wired.com/wired/archive/14.04/wright.html" target="_blank">Dream Machines</a></p>
<p>I really resonated with this, because I myself am very much someone they are describing.  I don&#8217;t read manuals (unless it&#8217;s really really complicated-looking), I just pick it up and start mashing buttons.  That posed problems when I purchased my new table saw, but that&#8217;s another story&#8230;</p>
<p>When it comes to application design/development, my own tendancies force me to lean heavily towards an application design that seeks to be intuitive, and works well for people who like to &#8220;see what happens&#8221;.  I want descriptive text that is simple and offers enough information that I get the gist of what will happen if I click the button/menu/link, but I still have to click to find out details, or to watch it work.  I want logically grouped options, I want to drill-down as far as I want to go, and then pop back out.  I don&#8217;t want any single action to initiate a never-ending action that has a &lt;gasp&gt;progress bar!&lt;/gasp&gt;.  (Unless I&#8217;m installing something, then I never want to touch it after it starts.)  I always want the option to cancel, save, or apply my changes at any moment.</p>
<p>The way I figure it, what I want is what users of my applications will want (on some level) and what I enjoy about a well-designed application is what my users will enjoy also.</p>
<p>via <a href="http://www.lukew.com/ff/entry.asp?335">Functioning Form</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronlerch.com/blog/2006/04/26/gaming-and-application-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Embedding Flash in C#</title>
		<link>http://www.aaronlerch.com/blog/2006/03/31/embedding-flash-in-c/</link>
		<comments>http://www.aaronlerch.com/blog/2006/03/31/embedding-flash-in-c/#comments</comments>
		<pubDate>Fri, 31 Mar 2006 12:33:00 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[ui]]></category>
		<category><![CDATA[visualization]]></category>
		<category><![CDATA[windows forms]]></category>

		<guid isPermaLink="false">http://www.aaronlerch.com/blog/2006/03/31/embedding-flash-in-c/</guid>
		<description><![CDATA[This is something I think you&#8217;d want to avoid like the plague, but it might have it&#8217;s benefits (as in the article&#8211;cheap charting).
Here&#8217;s the article
]]></description>
			<content:encoded><![CDATA[<p>This is something I think you&#8217;d want to avoid like the plague, but it might have it&#8217;s benefits (as in the article&#8211;cheap charting).</p>
<p><a href="http://www.macromedia.com/devnet/flash/articles/stock_history.html">Here&#8217;s the article</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronlerch.com/blog/2006/03/31/embedding-flash-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Importance of User Experience</title>
		<link>http://www.aaronlerch.com/blog/2006/03/23/the-importance-of-user-experience/</link>
		<comments>http://www.aaronlerch.com/blog/2006/03/23/the-importance-of-user-experience/#comments</comments>
		<pubDate>Thu, 23 Mar 2006 14:21:00 +0000</pubDate>
		<dc:creator>aaron</dc:creator>
				<category><![CDATA[ui]]></category>
		<category><![CDATA[user experience]]></category>

		<guid isPermaLink="false">http://www.aaronlerch.com/blog/2006/03/23/the-importance-of-user-experience/</guid>
		<description><![CDATA[A nice clean diagram illustrating the flow and importance of user experience.
 
  The Importance of User Experience
Originally uploaded by soldierant. 

]]></description>
			<content:encoded><![CDATA[<p>A nice clean diagram illustrating the flow and importance of user experience.</p>
<p style="float: none; margin-left: 10px; margin-bottom: 10px"> <a href="http://www.flickr.com/photos/bryce/106972762/" title="photo sharing"><img src="http://static.flickr.com/37/106972762_7fbced62e7_m.jpg" style="border: 2px solid #000000" /></a><br />
<span style="font-size: 0.9em; margin-top: 0px">  <a href="http://www.flickr.com/photos/bryce/106972762/">The Importance of User Experience</a><br />
Originally uploaded by <a href="http://www.flickr.com/people/bryce/">soldierant</a>. </span></p>
<p><br clear="all" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronlerch.com/blog/2006/03/23/the-importance-of-user-experience/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
