<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://zerosandtheone.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>VB.NET For Everyone! : VB.NET</title><link>http://zerosandtheone.com/blogs/vb/archive/tags/VB.NET/default.aspx</link><description>Tags: VB.NET</description><dc:language>en</dc:language><generator>CommunityServer 2008 (Build: 30417.1769)</generator><item><title>VB.NET Include a font as an embedded resource in your application</title><link>http://zerosandtheone.com/blogs/vb/archive/2009/11/20/vb-net-include-a-font-as-an-embedded-resource-in-your-application.aspx</link><pubDate>Fri, 20 Nov 2009 06:05:00 GMT</pubDate><guid isPermaLink="false">25aead6d-839f-4a6e-811a-c90be434890b:1057</guid><dc:creator>Matthew Kleinwaks</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://zerosandtheone.com/blogs/vb/rsscomments.aspx?PostID=1057</wfw:commentRss><comments>http://zerosandtheone.com/blogs/vb/archive/2009/11/20/vb-net-include-a-font-as-an-embedded-resource-in-your-application.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;Today I am going to show you how you can take a font file, and include it in your VB.NET WinForms application. This means you can load the font at runtime, and use it on your controls without requiring the user to have the font installed on their system. This can come in handy when you want to use a custom font, but your app needs to run without admin rights (because of ClickOnce or other least privileged requirements). Without admin rights you cannot install fonts on a system. (Note: I have seen some workarounds to this, but they require 3rd party utilities).&lt;/p&gt;
&lt;p&gt;This is a pretty simple example, and there is not a ton of code. So lets get right down to it:&lt;/p&gt;
&lt;p&gt;First lets see the end result.&lt;/p&gt;
&lt;p&gt;Here is what the form looks like when I run it normally&lt;/p&gt;
&lt;p&gt;&lt;img src="http://zerosandtheone.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vb.images/customfont1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Here is what the form looks like when I click the button and load the custom font (which happens to be a digital clock looking font)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img height="253" width="489" src="http://zerosandtheone.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vb.images/customfont2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The code to do this? Let&amp;#39;s take a look. I created a new Windows Forms application, and added a ttf (true type font) file to the resources section of my project. It will be stored under the &amp;quot;files&amp;quot; section of the resources, which means accessing this font in code from the resources will just return a byte array of the file.&lt;/p&gt;
&lt;p&gt;I created a module and put all the code needed to load the custom font in there. That way you can make quick calls to it to setup the custom font on your controls.&lt;/p&gt;
&lt;div style="FONT-FAMILY:Courier New;BACKGROUND:white;COLOR:black;FONT-SIZE:10pt;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:green;"&gt;&amp;#39;MATTHEW KLEINWAKS&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:green;"&gt;&amp;#39;ZerosAndTheOne.com&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:green;"&gt;&amp;#39;2009&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:green;"&gt;&amp;#39;CUSTOM FONT LOADED DYNAMICALLY FROM A RESOURCE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Imports&lt;/span&gt; System.Drawing.Text&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Imports&lt;/span&gt; System.Runtime.InteropServices&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Module&lt;/span&gt; CustomFont&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;PRIVATE FONT COLLECTION TO HOLD THE DYNAMIC FONT&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; _pfc &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; PrivateFontCollection = &lt;span style="COLOR:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Property&lt;/span&gt; GetInstance(&lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; Size &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Single&lt;/span&gt;, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; style &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; FontStyle) &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; Font&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;IF THIS IS THE FIRST TIME GETTING AN INSTANCE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;LOAD THE FONT FROM RESOURCES&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;If&lt;/span&gt; _pfc &lt;span style="COLOR:blue;"&gt;Is&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Then&lt;/span&gt; LoadFont()&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;RETURN A NEW FONT OBJECT BASED ON THE SIZE AND STYLE PASSED IN&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;New&lt;/span&gt; Font(_pfc.Families(0), Size, style)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Sub&lt;/span&gt; LoadFont()&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Try&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;INIT THE FONT COLLECTION&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _pfc = &lt;span style="COLOR:blue;"&gt;New&lt;/span&gt; PrivateFontCollection&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;LOAD MEMORY POINTER FOR FONT RESOURCE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; fontMemPointer &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; IntPtr = _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Marshal.AllocCoTaskMem( _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;My&lt;/span&gt;.Resources.DIGITALDREAMNARROW.Length)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;COPY THE DATA TO THE MEMORY LOCATION&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Marshal.Copy(&lt;span style="COLOR:blue;"&gt;My&lt;/span&gt;.Resources.DIGITALDREAMNARROW, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, fontMemPointer, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;My&lt;/span&gt;.Resources.DIGITALDREAMNARROW.Length)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;LOAD THE MEMORY FONT INTO THE PRIVATE FONT COLLECTION&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _pfc.AddMemoryFont(fontMemPointer, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;My&lt;/span&gt;.Resources.DIGITALDREAMNARROW.Length)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;FREE UNSAFE MEMORY&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Marshal.FreeCoTaskMem(fontMemPointer)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; Exception&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;ERROR LOADING FONT. HANDLE EXCEPTION HERE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Try&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Module&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It is pretty straight forward, and the code has comments so you can see what is going on.&lt;/p&gt;
&lt;p&gt;Then in the form, when the button is clicked, we make a single call to the module&amp;#39;s GetInstance method to return the font.&lt;/p&gt;
&lt;div style="font-family:Courier New;background:white;color:black;font-size:10pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Button1_Click(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.Object, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.EventArgs) _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;Handles&lt;/span&gt; Button1.Click&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Label1.Font = CustomFont.GetInstance(12, FontStyle.Bold)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT&lt;/strong&gt;: One key thing to note here, is that on the control you want to set this custom font on, you will need to set the &lt;strong&gt;UseCompatibleTextRendering&lt;/strong&gt; property to true (the default is false). If you don&amp;#39;t want to do this for some reason, then another method you can do is to use the given controls Paint event and custom draw the text using the custom font. However this is generally less ideal because not all controls fire paint events without tweaking them, and even some that do would put the burden on drawing the entire control in your hands. So setting &lt;strong&gt;UseCompatibleTextRendering&lt;/strong&gt; to true is the easier route to go.&lt;/p&gt;
&lt;p&gt;That is all there is to it. You can modify this to meet the specific needs of your application. Below is a link to download the WinForms application (VS2008) that contains the code (and font) used in this article.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://zerosandtheone.com/aggbug.aspx?PostID=1057" width="1" height="1"&gt;</description><enclosure url="http://zerosandtheone.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.10.57/EmbeddedFontExample.zip" length="23312" type="application/x-zip-compressed" /><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Font/default.aspx">Font</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Embedded+Resource/default.aspx">Embedded Resource</category></item><item><title>VB.NET How to tell if a user can elevate to admin rights in Vista and Windows 7</title><link>http://zerosandtheone.com/blogs/vb/archive/2009/07/29/vb-net-how-to-tell-if-a-user-can-elevate-to-admin-rights-in-vista-and-windows-7.aspx</link><pubDate>Wed, 29 Jul 2009 19:20:00 GMT</pubDate><guid isPermaLink="false">25aead6d-839f-4a6e-811a-c90be434890b:738</guid><dc:creator>Matthew Kleinwaks</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://zerosandtheone.com/blogs/vb/rsscomments.aspx?PostID=738</wfw:commentRss><comments>http://zerosandtheone.com/blogs/vb/archive/2009/07/29/vb-net-how-to-tell-if-a-user-can-elevate-to-admin-rights-in-vista-and-windows-7.aspx#comments</comments><description>&lt;p&gt;Generally finding out if a user has the permissions to do something involves trying to do that thing, and handling the access denied (error 5) exception that results.&lt;/p&gt;
&lt;p&gt;What if you wanted to know if a user is an admin though prior to doing some admin task via code? Normally this would be as easy as checking if the user is a member of the built in administrators group in Windows, however with Vista and Windows 7, the OS uses a split token so your user account runs with standard user permissions, but can elevate as needed to full admin rights.&lt;/p&gt;
&lt;p&gt;When a standard user does the same thing, and invokes some process that requires administrative rights, they will be prompted with a user id/password dialog, and must enter the credentials of an account that is an admin member on the system.&lt;/p&gt;
&lt;p&gt;My reason for having to look at this was due to a program where a process running as a standard user downloads some update files to&amp;nbsp;the user&amp;#39;s&amp;nbsp;temp folder, and then launches an application as administrator&amp;nbsp;to process those files. If the standard user gets a credentials dialog, and enters in alternate admin credentials, then the user profile changes, and the temp directory is now the admins temp directory, not the standard user&amp;#39;s. This created lots of problems, and while there were a few options for a resolution, most were going to be messy, and I opted to go for the following approach:&lt;/p&gt;
&lt;p&gt;When the user goes to download update files from the software, determine if they are an admin, and if not, determine if they CAN be an admin. If they can, then I know they will get the regular click through elevation prompt, and the profile will remain the same. However if they are not an admin, and they can not elevate to an admin, I can void the download, and inform the user the main download process should be invoked by an administrator. This will cause the temp files to be in the correct place, as well as some other environment variables that the program uses, and the update will succeed.&lt;/p&gt;
&lt;p&gt;So that was my reason for needing it, but I know that several other reasons could exist for wanting to know if a Vista/7 user is an admin, but not running currently as one.&lt;/p&gt;
&lt;p&gt;Ok so you probably came here for code and not to listen to my coding issues, so lets get down to it.&lt;/p&gt;
&lt;p&gt;Here is the entire class file. It consists of just a few API calls, as well as 3 public functions for you to consume.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;strong&gt;IsRunningAsAdmin()&lt;/strong&gt;&lt;/span&gt;: Does the standard check to simply determine if the user is in the administrators group. Will return false for admins running the process with reduced rights in Vista/7.&lt;br /&gt;&lt;span style="font-size:small;"&gt;&lt;strong&gt;CanElevateToAdmin()&lt;/strong&gt;: Uses the Windows API calls to determine if the user can elevate, or is elevated currently.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-size:small;"&gt;&lt;strong&gt;RunningStandardButCanElevate()&lt;/strong&gt;: Just a combination of the two above methods, as a shortcut to determine if the user can elevate to admin, but currently is not.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As you can probably tell by the method names, they are all boolean methods.&lt;/p&gt;
&lt;p&gt;One thing to note, is that the CanElevateToAdmin method will check the OS version, and only do the API calls when the major version is greater than 5. (5 being Windows XP, 6+ being Vista and up) Otherwise it simply does the standard admin check.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Sometimes the code formatting may look a little odd, it is just to avoid weird wrapping in the blog post. &lt;img src="http://zerosandtheone.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &lt;/p&gt;
&lt;div style="FONT-FAMILY:Courier New;BACKGROUND:#f9f9f9;COLOR:black;FONT-SIZE:11pt;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Imports&lt;/span&gt; System.Runtime.InteropServices&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Class&lt;/span&gt; AdminCheck&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#Region&lt;/span&gt; &lt;span style="COLOR:#a31515;"&gt;&amp;quot;CONSTANTS&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Const&lt;/span&gt; TOKEN_QUERY &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; UInt32 = &amp;amp;H8&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Const&lt;/span&gt; INT_SIZE &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Integer&lt;/span&gt; = 4&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#Region&lt;/span&gt; &lt;span style="COLOR:#a31515;"&gt;&amp;quot;ENUMERATIONS&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Enum&lt;/span&gt; TOKEN_ELEVATION_TYPE&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenElevationTypeDefault = 1&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenElevationTypeFull&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenElevationTypeLimited&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Enum&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Enum&lt;/span&gt; TOKEN_INFO_CLASS&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenUser = 1&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenGroups&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenPrivileges&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenOwner&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenPrimaryGroup&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenDefaultDacl&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenSource&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenType&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenImpersonationLevel&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenStatistics&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenRestrictedSids&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenSessionId&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenGroupsAndPrivileges&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenSessionReference&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenSandBoxInert&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenAuditPolicy&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenOrigin&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenElevationType&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenLinkedToken&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenElevation&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenHasRestrictions&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenAccessInformation&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenVirtualizationAllowed&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenVirtualizationEnabled&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenIntegrityLevel&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenUIAccess&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenMandatoryPolicy&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TokenLogonSid&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MaxTokenInfoClass&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39; MaxTokenInfoClass should always be the last enum&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Enum&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#Region&lt;/span&gt; &lt;span style="COLOR:#a31515;"&gt;&amp;quot;WIN API FUNCTIONS&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DllImport(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;)&amp;gt; _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Shared&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt; GetCurrentProcess() &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; IntPtr&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DllImport(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;advapi32.dll&amp;quot;&lt;/span&gt;, SetLastError:=&lt;span style="COLOR:blue;"&gt;True&lt;/span&gt;)&amp;gt; _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Shared&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt; OpenProcessToken(&lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; ProcessHandle &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; IntPtr, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; DesiredAccess &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; UInt32, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;ByRef&lt;/span&gt; TokenHandle &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; IntPtr) &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DllImport(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;advapi32.dll&amp;quot;&lt;/span&gt;, SetLastError:=&lt;span style="COLOR:blue;"&gt;True&lt;/span&gt;)&amp;gt; _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Shared&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt; GetTokenInformation( _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; TokenHandle &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; IntPtr, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; TokenInformationClass &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; TOKEN_INFO_CLASS, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; TokenInformation &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; IntPtr, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; TokenInformationLength &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Integer&lt;/span&gt;, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;ByRef&lt;/span&gt; ReturnLength &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;UInteger&lt;/span&gt;) &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#Region&lt;/span&gt; &lt;span style="COLOR:#a31515;"&gt;&amp;quot;PUBLIC METHODS&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; RETURNS TRUE WHEN THE CURRENT USER IS A MEMBER OF THE &lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; ADMINISTRATORS GROUP AND IS ALSO RUNNING THE PROCESS &lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; ELEVATED AS AN ADMINISTRATOR, OTHERWISE RETURNS FALSE.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="COLOR:green;"&gt;Boolean&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Shared&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt; IsRunningAsAdmin() &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;My&lt;/span&gt;.User.IsInRole(ApplicationServices.BuiltInRole.Administrator)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; RETURNS TRUE WHEN THE CURRENT USER CAN ELEVATE TO ADMINISTRATOR RIGHTS&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; OR ALREADY HAD ELEVATED TO ADMINISTRATOR RIGHTS,&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; OTHERWISE RETURNS FALSE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="COLOR:green;"&gt;Boolean&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Shared&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt; CanElevateToAdmin() &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;DETERMINE IF THE CURRENT USER IS ALREADY RUNNING WITH ADMIN RIGHTS&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; IsAdmin = IsRunningAsAdmin()&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;EXIT OUT NOW IF THE USER IS AN ADMIN, RETURNING TRUE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;THERE IS NO ELEVATION NEEDED IF THE USER IS ALREADY &lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;RUNNING WITH ADMIN RIGHTS&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;If&lt;/span&gt; IsAdmin &lt;span style="COLOR:blue;"&gt;Then&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;True&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;IF VISTA OR HIGHER, CHECK FOR SPLIT TOKEN&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;If&lt;/span&gt; Environment.OSVersion.Version.Major &amp;gt; 5 &lt;span style="COLOR:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Try&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; myToken &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; IntPtr&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; elevationType &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; TOKEN_ELEVATION_TYPE&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; dwSize &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;UInteger&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; pElevationType &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; IntPtr = Marshal.AllocHGlobal(INT_SIZE)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;GET A TOKEN REFERENCE FOR THE USER RUNNING THIS PROCESS&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, myToken)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;GET THE ELEVATION INFORMATION FOR THIS TOKEN&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; GetTokenInformation(myToken, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TOKEN_INFO_CLASS.TokenElevationType, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pElevationType, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; INT_SIZE, _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dwSize)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;CAST THE RESULT TO ENUM TYPE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elevationType = &lt;span style="COLOR:blue;"&gt;DirectCast&lt;/span&gt;( _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Marshal.ReadInt32(pElevationType),&amp;nbsp; _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TOKEN_ELEVATION_TYPE)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;FREE ALLOCATED UNMANAGED MEMORY&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Marshal.FreeHGlobal(pElevationType)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;DETERMINE THE RESULT OF THE ELEVATION CHECK&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;==============================================&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;TokenElevationTypeFull - User has a split token, &lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;and the process is running elevated&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;TokenElevationTypeLimited - User has a split token, &lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;but the process is not running elevated&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;TokenElevationTypeDefault - User is not using a split token&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;==============================================&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Return&lt;/span&gt; (elevationType = _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited) &lt;span style="COLOR:blue;"&gt;OrElse&lt;/span&gt; _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; (elevationType = _&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TOKEN_ELEVATION_TYPE.TokenElevationTypeFull)&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; Exception&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;LOG/HANDLE ERROR&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;RETURN FALSE IN EVENT OF ERROR&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;False&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Try&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Else&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;PRIOR TO VISTA, ONLY CHECK&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;NEEDED IS IF THE USER IS IN THE ADMIN GROUP&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Return&lt;/span&gt; IsAdmin&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; RETURNS TRUE WHEN USER IS RUNNING AS A STANDARD USER CURRENTLY&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; BUT CAN ELEVATE TO ADMIN RIGHTS WITH THEIR OWN CREDENTIALS&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; OTHERWISE RETURNS FALSE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="COLOR:green;"&gt;Boolean&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Shared&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt; RunningStandardButCanElevate() &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Return&lt;/span&gt; CanElevateToAdmin() &lt;span style="COLOR:blue;"&gt;And&lt;/span&gt; (&lt;span style="COLOR:blue;"&gt;Not&lt;/span&gt; IsRunningAsAdmin())&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Class&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Hopefully this will come in handy for anyone else that may be looking to determine this information. I did a good amount of searching around the web, and wasn&amp;#39;t able to find a good example of this, especially in Visual Basic.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a target="_blank" href="http://www.linkedin.com/in/robteixeira" class="null"&gt;Rob Teixeira&lt;/a&gt; for pointing me to GetTokenInformation API function, which enabled me to ultimately solve this issue.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://zerosandtheone.com/aggbug.aspx?PostID=738" width="1" height="1"&gt;</description><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/.NET/default.aspx">.NET</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Win7/default.aspx">Win7</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Vista/default.aspx">Vista</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Admin/default.aspx">Admin</category></item><item><title>SSL testing certificate and the .NET Framework</title><link>http://zerosandtheone.com/blogs/vb/archive/2009/07/13/ssl-testing-certificate-and-the-net-framework.aspx</link><pubDate>Mon, 13 Jul 2009 19:57:00 GMT</pubDate><guid isPermaLink="false">25aead6d-839f-4a6e-811a-c90be434890b:725</guid><dc:creator>Matthew Kleinwaks</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://zerosandtheone.com/blogs/vb/rsscomments.aspx?PostID=725</wfw:commentRss><comments>http://zerosandtheone.com/blogs/vb/archive/2009/07/13/ssl-testing-certificate-and-the-net-framework.aspx#comments</comments><description>&lt;p&gt;I was faced with an odd problem today. I needed to test an update for an application that is already in production. Normally this would be pretty simple to do in a staging environment of some sort, but that is what made this task different. There was none.&lt;/p&gt;
&lt;p&gt;Basically what I was given was an application to install (no source code) and information on where it downloads its updates from. It did the downloading using a WebClient and calls over HTTPS to a directory on an IIS webserver that doesn&amp;#39;t have anonymous access on. So the WebClient passes credentials as well over HTTPS to authenticate. The URLS were hard coded in the app, so I had no way to redirect them somewhere other than the live server, and that was what made this problem interesting.&lt;/p&gt;
&lt;p&gt;I had to get a little clever and get in MacGyver mode since this was going to take a good amount of mucking around with the system itself. Since this was just for testing, I didn&amp;#39;t mind screwing up the testbox, which was just a virtual machine anyway.&lt;/p&gt;
&lt;p&gt;My first issue was how to I redirect hard coded URLS that point to &lt;a href="https://www.somedomain.com/"&gt;https://www.somedomain.com/&lt;/a&gt; to my local IIS server where I had a&amp;nbsp;local&amp;nbsp;mirror of the update site&amp;#39;s contents. I ended up using the HOSTS file in Windows to accomplish this. Basically if you don&amp;#39;t know what the HOSTS file is, it is a file (located at %systemroot%\system32\drivers\etc\ on most Windows versions) that is a list of manual DNS resolutions at the machine level. Opening it will show you a single DNS resolution for localhost, which points to the system loopback of 127.0.0.1.&lt;/p&gt;
&lt;p&gt;I added an entry for the customers domain and the IP address of my local IIS server so it looked something like this:&lt;br /&gt;192.168.1.145 &lt;a href="http://www.somedomain.com"&gt;www.somedomain.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This made the testbox redirect to my local IIS IP address whenever a request was made for the actual domain.&lt;/p&gt;
&lt;p&gt;Ok so problem solved with redirecting the traffic, however at this point I was not aware that the calls were made over HTTPS. I soon found that out as the tests were failing because my local IIS had no SSL installed on it.&lt;/p&gt;
&lt;p&gt;Looking around for a way to make a testing certificate sounded like it was going to be somewhat of a process, even using some free tools like OpenSSL to create a self signed certificate for my testing purposes. Luckily&amp;nbsp;I found a free download from &lt;a target="_blank" href="http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=56FC92EE-A71A-4C73-B628-ADE629C89499&amp;amp;displaylang=en" class="null"&gt;Microsoft IIS resource kit&lt;/a&gt; (thanks to a&amp;nbsp;tip from&amp;nbsp;&lt;a target="_blank" href="http://msmvps.com/blogs/theproblemsolver/" class="null"&gt;Maurice de Beijer&lt;/a&gt;). It is geared towards IIS6, however it will install and at least do what is need for this task at least on XP Professional with IIS 5.1, which is what I was using for my testing server.&lt;/p&gt;
&lt;p&gt;Installing this resource kit gives you an entry in your start menu for &lt;strong&gt;IIS Resources -&amp;gt; SelfSSL&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This little command line utility will easily create and install a self signed certificate into IIS on the machine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So all done right? Well not exactly, this is where things got even more complicated.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So over to my testbox, I was able to connect to my local IIS when I type their domain in my browser due to the HOSTS file modification, however any requests for HTTPS versus HTTP would make IE yell foul that the cert&amp;nbsp;doesn&amp;#39;t match the domain, and also it was&amp;nbsp;not trusted or signed by a CA,&amp;nbsp;which of course is true, it was signed by me &lt;img src="http://zerosandtheone.com/emoticons/emotion-1.gif" alt="Smile" /&gt;.&lt;/p&gt;
&lt;p&gt;To fix this for IE I just needed to go into advanced options and uncheck the box to &amp;quot;warn about certificate address mismatch&amp;quot;. I also needed to continue through the IE warning and view the site. I clicked on the red cert error box once I was on the site, and selected to install the certificate to the machine. After doing these 2 steps, Internet Explorer worked just as it would if it was a legit signed cert from a legit CA. I imagine an alternative to this method would be to export the cert to a .cer file from the IIS box, and then copy it over to the testbox and import it manually using the certificates MMC snapin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So all done right? Nope.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So at this point I figured I was all done and was patting myself on the back for a job well done. Until I tried to actually run their app and deliver the update to it from my local IIS server. It just wouldn&amp;#39;t connect, and while it didn&amp;#39;t crash because of the exception handling in the application, it simply acted as if it could not find the internet site it was trying to. &lt;/p&gt;
&lt;p&gt;Examining some log files showed me the error was specifically this:&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&amp;quot;The underlying connection is closed: Could not establish trust relationship for the ssl/tls secure channel&amp;quot;&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;With an inner exception message of:&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&amp;quot;The remote certificate is invalid according to the validation procedure&amp;quot;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At this point I tried everything. I imported the self signed certificate into every possible store I could, I added the MMC snapin for certificates and added the cert to all levels in there (machine and user level). Simply nothing worked at all, I always would get the same error.&lt;/p&gt;
&lt;p&gt;Searching for information on this topic brings up mainly one answer, which is to use some code to custom validate certificates, and always return true. This would have been very easy, if I had the actual source code to work with, and not just a compiled application. If you do have that luxory, then this is the code you would use:&lt;/p&gt;
&lt;div style="font-family:Courier New;background:#f9f9f9;color:black;font-size:11pt;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Net&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Net.Security&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Security.Cryptography.X509Certificates&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Shared&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; customCertValidation(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt;, _&lt;/p&gt;
&lt;div style="font-family:Courier New;background:#f9f9f9;color:black;font-size:11pt;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; cert &lt;span style="color:blue;"&gt;As&lt;/span&gt; X509Certificate, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; chain &lt;span style="color:blue;"&gt;As&lt;/span&gt; X509Chain, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; errors &lt;span style="color:blue;"&gt;As&lt;/span&gt; SslPolicyErrors) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;USAGE&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; DoStuff()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;CALL THIS BEFORE ANY HTTPS CALLS THAT WILL FAIL WITH CERT ERROR&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ServicePointManager.ServerCertificateValidationCallback = _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;New&lt;/span&gt; System.Net.Security.RemoteCertificateValidationCallback(&lt;span style="color:blue;"&gt;AddressOf&lt;/span&gt; customCertValidation)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p style="margin:0px;"&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Note that you don&amp;#39;t have to simply return true, you can do whatever type of cert validation you want, and only return true under the conditions you want. Simply returning true and doing nothing else just says we don&amp;#39;t care about any of the cert details, just allow it.&lt;/p&gt;
&lt;p&gt;I was getting ready to admit defeat here, as it just did not look like there was a way to do this with a compiled application. I even tried sifting through the various .NET config files like machine.config and security.config looking for something. It just &amp;nbsp;was baffling me that I could add this cert to my trusted stores and IE was happy with that, but .NET was not. Then I came across some information about ServicePointManager in an application config file. This sounded interesting as if it would work, it would be something I could add to the existing application without needing to do anything with the binaries themselves.&lt;/p&gt;
&lt;p&gt;I added the following XML to the app.config file, and sure enough, it worked like a charm.&lt;/p&gt;
&lt;div style="font-family:Courier New;background:#f9f9f9;color:black;font-size:11pt;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.net&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;settings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;servicePointManager&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;checkCertificateName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;settings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.net&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So to recap what I did to get this all working:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edited HOSTS file on testbox to redirect URLs for a specific domain to my local IIS server&lt;/li&gt;
&lt;li&gt;Installed a self signed SSL cert on my IIS server using IIS Resource Kit SelfSSL utility&lt;/li&gt;
&lt;li&gt;Turned off option to warn about cert name mismatches in IE&lt;/li&gt;
&lt;li&gt;Navigated to HTTPS site in IE, got cert error&lt;/li&gt;
&lt;li&gt;Continued through and then clicked on red cert error and selected to install certificate to the local test machine&lt;/li&gt;
&lt;li&gt;Added config file (or append existing config file) with the above ServicePointManager settings, to not check cert names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After this, everything worked great, and my IIS acted just like their live server, and the app did not know the difference.&lt;/p&gt;
&lt;p&gt;Hopefully if someone comes across a similar issue, this may help them out. &lt;img src="http://zerosandtheone.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://zerosandtheone.com/aggbug.aspx?PostID=725" width="1" height="1"&gt;</description><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Certificates/default.aspx">Certificates</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Security/default.aspx">Security</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/SSL/default.aspx">SSL</category></item><item><title>.NET : Install your app and the .NET framework using INNO Setup</title><link>http://zerosandtheone.com/blogs/vb/archive/2008/06/23/vb-net-install-your-app-and-the-net-framework-using-inno-setup.aspx</link><pubDate>Mon, 23 Jun 2008 19:53:00 GMT</pubDate><guid isPermaLink="false">25aead6d-839f-4a6e-811a-c90be434890b:167</guid><dc:creator>Matthew Kleinwaks</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://zerosandtheone.com/blogs/vb/rsscomments.aspx?PostID=167</wfw:commentRss><comments>http://zerosandtheone.com/blogs/vb/archive/2008/06/23/vb-net-install-your-app-and-the-net-framework-using-inno-setup.aspx#comments</comments><description>&lt;p&gt;Today we are going to look at an alternative to using ClickOnce or
Windows Installer MSI to install an application written in .NET.&lt;/p&gt;
&lt;p&gt;This article is written for installing an application written in Microsoft .NET 2.0 (does not have to be VB specifically) and including the .NET Framework as part of your installation.&amp;nbsp; The concepts here can be applied to do the same for a .NET 1.1 or .NET 3.x installation, however some specific values will change, and some logic will change (like the fact that .NET 3.x will not run on any Windows below XP SP2, and .NET 2.0 does).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Some History&lt;br /&gt;&lt;/b&gt;One of the biggest problems with using an MSI
based installer, or ClickOnce to deploy your .NET application, is the
need to have multiple installation files. At the least, you generally
need 2, a setup.exe bootstrapper to kick things off, and the MSI file
which contains the actual files to install. This can be fine when
dealing with a CD based installation, but how about internet downloads?
Some make use of self extracting zip type files to extract the setup
files and launch the bootstrapper, others simply zip the files up and
expect you to unzip them and run the setup.exe. There are also 3rd
party apps like InstallShield and Wise, however I was looking for a
&amp;quot;free&amp;quot; approach to his.&lt;/p&gt;
&lt;p&gt;Depending on your target audience, you may want to have a nice, easy
to use, single setup.exe that people can download and run without any
extra hoops to jump through. &lt;/p&gt;
&lt;p&gt;INNO Setup is a free open source installer program written and
maintained by Jordan Russell. It has the ability to package everything
into a single setup.exe for easy deployment.&lt;/p&gt;
&lt;p&gt;Here are some links of importance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" title="Jordan Russell Homepage" href="http://www.jrsoftware.org/"&gt;JR Software Homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" title="INNO Setup 5.1.9" href="http://files.jrsoftware.org/ispack/ispack-5.1.9.exe"&gt;INNO Version used in this article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" title="Newest Inno Setup Download" href="http://www.jrsoftware.org/isdl.php#qsp"&gt;Newest INNO Version Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" title=".NET 2.0 Redist Download" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&amp;amp;displaylang=en"&gt;.NET 2.0 Redist File Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" title=".NET 2.0 (SP1) Redist Download" href="http://www.microsoft.com/downloads/details.aspx?familyid=79BC3B77-E02C-4AD3-AACF-A7633F706BA5&amp;amp;displaylang=en"&gt;.NET 2.0 (sp1) Redist File Download&lt;/a&gt; (&lt;i&gt;Note: This is a full version of .NET Framework, you don&amp;#39;t need the above link if you use this one.&lt;/i&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure you always download and install the QuickStart pack
installation of Inno versus just the standard one, as it includes a
preprocessor &lt;br /&gt;(similar to conditional compiler statements in VB with the # sign). More on this later.&lt;/p&gt;
&lt;p&gt;One thing to keep in mind as you start to use INNO Setup, is that it
is NOT a .NET installer. It is a generic installer for installing
anything from a full blown app, to possibly just a directory of
pictures. It is very flexible, albeit with a slight learning curve if
you are used to VB programming. I use VB for 95% of my programming, and
I found INNO&amp;#39;s Pascal Scripting to be pretty easy to pickup, and not
required in all cases of use.&lt;/p&gt;
&lt;p&gt;Inno setup files have .iss (Inno Setup Script) extensions, and they
are nothing more than plain text files. You can write them in notepad
if you wish, however using the INNO program gives you syntax
highlighting (plus it is free, and we need it to compile the script
when we are done).&lt;/p&gt;
&lt;p&gt;This article does not require you have existing knowledge of INNO Setup, however if you do, you will likely understand much of this article a bit better than those who do not. For those of you who are new to INNO Setup, this is not going to teach you everything you will want to know about it, so I suggest you visit the INNO website and look over some of the docs, tutorials, and newsgroups there. That being said, you can take this script and mostly change around values of the fields to fit your own application and have a working installer.&lt;/p&gt;
&lt;p&gt;This article is also not a tutorial on how to use INNO Setup. It is an article on how to use INNO Setup to install the .NET Framework. Yes there is a difference, and that difference is I am not going to go into great detail about what each property and method of the setup does. That would take a book, not a blog posting. &lt;img src="http://zerosandtheone.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Time to get down to business&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Ok, so now that we have gotten those facts out of the way, and you
have downloaded and installed either the specific version I used for
this example (5.1.9), or the newest version.&lt;br /&gt;&lt;i&gt;(Important note as of this article, the newest version of INNO 5.2.3 works fine with this script)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;So we are going to go through the entire setup file, section by section, and talk about what is going on.&lt;/p&gt;
&lt;ol&gt;&lt;/ol&gt;
&lt;p&gt;So open up INNO setup, and select &amp;quot;Create a new empty script file&amp;quot;,
or just click cancel on the welcome dialog. You will be at the script
editor window, which looks similar to a standard text editor like
notepad.&lt;/p&gt;
&lt;p&gt;Lets add some comments to the top of the script:&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;;Example
.NET Setup Script&lt;br /&gt;;written
in Inno Setup 5.1.9 (ISPP 5.1.8.0)&lt;br /&gt;;2008
Matthew Kleinwaks&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;;www.ZerosAndTheOne.com&lt;br /&gt;;change these comments as needed for your own app&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Now we will define some preprocessor variables&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;#define
SourceFileDir &amp;quot;c:\work\myapp&amp;quot;&lt;br /&gt;#define
IncludeFramework true&lt;br /&gt;#define IsExternal &amp;quot;&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;Basically, these preprocessor variables are generated BEFORE the script is compiled. This is useful to do things like set options. Perhaps you want to have a demo version as well as the full version of your product. You could use a preprocessor directive to indicate if its the demo or not, which can allow for boolean logic (if statements) to include one file or another based on if its a demo or not. That is just one example, but you get the idea.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;SourceFileDir &lt;/b&gt;is a directory on my machine where the release version
files of my actual application are. This would be the exe, dll files,
any support files that are part of the application itself, like
pictures, data files, eula, readme, etc.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IncludeFramework &lt;/b&gt;is simply a boolean to indicate if you want the framework packaged and installed. Sometimes it can be convenient to NOT include it.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IsExternal&lt;/b&gt; is also a directive that we will use to determine if in fact we want to package the app files with the setup.exe, or keep them separate. Obviously for a download we want them all to be part of one setup.exe file, however sometimes for distribution on CD, it is better to package the files loosely instead of all packed into one file. If you do want the files external, you should replace the &amp;quot;&amp;quot; in this line with &amp;quot;external&amp;quot; (including the quotes). More on why it works like that further down in the &lt;b&gt;[files]&lt;/b&gt; section.&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;So now lets write out the sections of the setup file. After that, we will create the code section to do all of our custom .NET installer coding.&lt;/p&gt;
&lt;p&gt;The first section is &lt;b&gt;[Setup]&lt;/b&gt;. It defines many of the properties that make up the installer&amp;#39;s look, feel, and many textual attributes.&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;[setup]&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;;name
of your application&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt; &lt;br /&gt;
AppName&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=MyApp&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;;repeat
name of application. (otherwise you get &lt;br /&gt;
;multiple entries in add/remove programs)&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;AppVerName&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=MyApp&lt;br /&gt;
&lt;span style="color:#339966;"&gt;;app publisher name&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;AppPublisher&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=zerosandtheone.com&lt;br /&gt;
&lt;span style="color:#339966;"&gt;;app publisher website URL&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;AppPublisherURL&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=http://www.zerosandtheone.com&lt;br /&gt;
&lt;span style="color:#339966;"&gt;;app publisher support URL&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;AppSupportURL&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=http://www.zerosandtheone.com/support&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;app
publisher updates URL&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;AppUpdatesURL&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=http://www.zerosandtheone.com&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;default
directory {pf} is a constant for&lt;br /&gt;;program
files. See INNO help for all constants&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;DefaultDirName&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;={pf}\zerosandtheone\MyApp&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;default
group name in the programs &lt;br /&gt;; section
of the start menu&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;DefaultGroupName&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=MyApp&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;Boolean
to disable allowing user to customize &lt;br /&gt;;start
menu entry during installation&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;DisableProgramGroupPage&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=yes&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;Boolean
to warn if directory user picks&lt;br /&gt;;already
exists&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;DirExistsWarning&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=no&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;directory
where uninstaller exe will be&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;this will
be where our app is&lt;br /&gt;;the
constant we use is {app}&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;UninstallFilesDir&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;={app}&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;Location
of the license file&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;LicenseFile&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;={#SourceFileDir}\eula.rtf&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;file
to show before install (I show sys requirements)&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;InfoBeforeFile&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;={#&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;SourceFileDir&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;}\sysreq.rtf&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;file
to show after install (I show readme)&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;InfoAfterFile&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;={#&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;SourceFileDir&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;}
eadme.txt&lt;span style="color:red;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;Custom
image to show on left side of installer&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;WizardImageFile&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;={#&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;SourceFileDir&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;}installlogo.bmp&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;;Icon
for uninstall in add/remove programs&lt;br /&gt;;I use
whatever my apps icon is&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;UninstallDisplayIcon&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;={app}\MyApp.exe&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;Version
number of your installer (not your app)&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;VersionInfoVersion&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=1.0.0.0&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;If
IncludeFramework, append _FW to end of compiled setup&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;;&lt;br /&gt;I do
this to make it easy to compile a version with and&lt;br /&gt;;without
the framework included&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;br /&gt;#if
IncludeFramework&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;&amp;nbsp; OutputBaseFilename&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=setup_FW&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;br /&gt;#else&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;&amp;nbsp; OutputBaseFilename&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;=Setup&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;br /&gt;#endif&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;;Directory
where setup.exe will be compiled to&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;OutputDir&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;={#&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;SourceFileDir&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;}\setup&lt;span style="color:red;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So there you have it. The comments should explain what is going on for you. Some of these fields are optional and can be removed if not needed. Likewise there are some others that I do not use. See the INNO help file for a full list of what is available to the &lt;b&gt;[setup]&lt;/b&gt; section.&lt;/p&gt;
&lt;p&gt;The next section is the &lt;b&gt;[files]&lt;/b&gt; section. This section defines what files should be compiled into the setup.exe file. Our example will simply consist of an exe, a readme.txt and the .NET framework redistributable file.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;[files]&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Source&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {#SourceFileDir}\MyApp.exe; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;DestDir&lt;/span&gt;:
{app};&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Flags&lt;/span&gt;:
ignoreversion {#IsExternal}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;source&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {#&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;SourceFileDir&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;}readme.txt; &amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; DestDir&lt;/span&gt;:
{app};&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;Flags&lt;/span&gt;:
ignoreversion &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;{#IsExternal}&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;br /&gt;#if
IncludeFramework&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;&lt;br /&gt;&amp;nbsp; Source&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {#SourceFileDir}\dotnetfx.exe;&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;DestDir&lt;/span&gt;:
{tmp};&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Flags&lt;/span&gt;:
ignoreversion &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;{#IsExternal}&lt;/span&gt;
&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;; &lt;span style="color:#3366ff;"&gt;Check&lt;/span&gt;: NeedsFramework&lt;/span&gt;
&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;#endif&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;So what we have here are 3 lines indicating our source files, where they will go on the target machine, and any flags we need to associate. Again see INNO help for all possible flags and properties here. (I will mention to refer to INNO Help a lot because it is too robust to cover every aspect in one article, however you will end up with a fully working script by the end of this one). Notice that while we install myapp.exe and readme.txt to the {app} directory, we unpack the dotnetfx.exe (framework redist file) to a temp directory. The constant {app} actually translates at install time to whatever directory the user selects for installation. While we always like to assume they will install to c:\program files\ that will never be the case 100% of the time. IgnoreVersion just means we are going to copy the file no matter what, you can put restrictions here to only copy the file if its a newer version, etc. Also notice our {#IsExternal} directive here. I mentioned earlier that its value should be either &amp;quot;&amp;quot; or &amp;quot;external&amp;quot;. That is because these preprocessor directives are compiled into literal strings for use when the setup is compiled. What that means is, when the value of #IsExternal is &amp;quot;&amp;quot; the line looks like this once compiled:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp; &lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Source&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {#SourceFileDir}\MyApp.exe; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;DestDir&lt;/span&gt;:
{app};&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Flags&lt;/span&gt;:
ignoreversion &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;however if the value is &amp;quot;external&amp;quot; then the line compiles like this:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp; &lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;Source&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {#SourceFileDir}\MyApp.exe; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;DestDir&lt;/span&gt;:
{app};&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Flags&lt;/span&gt;:
ignoreversion external&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Which adds the external flag to this file. The external flag tells the setup that the file to install is actually not packed into the installer, but a loose file included along with it. This makes preprocessor directives very powerful to customize your installer when used in this way. The &lt;b&gt;Check: NeedsFramework&lt;/b&gt; line for the .NET redist file will call up a custom function to check and see if the machine even needs the .NET framework or not. We will define that function when we get to the code section of the script.&lt;/p&gt;
&lt;p&gt;Now lets specify the shortcuts we want made.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;[icons]&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;Name&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {group}\MyApp;&lt;span style="color:red;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;Filename&lt;/span&gt;:
{app}\MyApp.exe;&lt;span style="color:red;"&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;WorkingDir&lt;/span&gt;: {app}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;Name&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {group}\&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;Remove &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;MyApp;&lt;span style="color:red;"&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;Filename&lt;/span&gt;: &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;{uninstallexe};&lt;span style="color:red;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;WorkingDir&lt;/span&gt;: {app}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;Name&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {userdesktop}\MyApp;&lt;span style="color:red;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;Filename&lt;/span&gt;: &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;{app}\MyApp.exe&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;span style="color:red;"&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;WorkingDir&lt;/span&gt;: {app}&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;So we are putting a shortcut in the programs section of the start menu, as well as the desktop. We also put an uninstall shortcut in the start menu folder. Everything that is in curly braces { } is a constant that INNO translates at install time into a real string value. Where can you find all these constants? Yup, you guessed it, in the INNO Help file.&lt;/p&gt;
&lt;p&gt;On to the &lt;b&gt;[Run]&lt;/b&gt; section. This section defines what processed should be run as part of the installation. &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;[Run]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;#if
IncludeFramework&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;&amp;nbsp; Filename&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;: {tmp}\dotnetfx.exe;&lt;span&gt; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;Parameters&lt;/span&gt;: &amp;quot;/q:a /c:&amp;quot;&amp;quot;install /l
/q&amp;quot;&amp;quot;&amp;quot;;&lt;span&gt; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;WorkingDir&lt;/span&gt;: {tmp};&lt;span&gt; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;Flags&lt;/span&gt;:
skipifdoesntexist; &lt;span style="color:#3366ff;"&gt;StatusMsg&lt;/span&gt;:
&amp;quot;Installing .NET Framework if needed&amp;quot;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:red;"&gt;&lt;br /&gt;#endif&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;Filename&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;:
{win}\Microsoft.NET\Framework\v2.0.50727\CasPol.exe; &lt;span style="color:#3366ff;"&gt;Parameters&lt;/span&gt;:
&amp;quot;-q -machine -remgroup &amp;quot;&amp;quot;MyApp&amp;quot;&amp;quot;&amp;quot;;&lt;span&gt; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;WorkingDir&lt;/span&gt;: {tmp}; &lt;span style="color:#3366ff;"&gt;Flags&lt;/span&gt;:
skipifdoesntexist runhidden; &lt;span style="color:#3366ff;"&gt;StatusMsg&lt;/span&gt;:
&amp;quot;Setting Program Access Permissions...&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;Filename&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;:
{win}\Microsoft.NET\Framework\v2.0.50727\CasPol.exe; &lt;span style="color:#3366ff;"&gt;Parameters&lt;/span&gt;:
&amp;quot;-q -machine -addgroup 1.2 -url &amp;quot;&amp;quot;file://{app}/*&amp;quot;&amp;quot;
FullTrust -name &amp;quot;&amp;quot;MyApp&amp;quot;&amp;quot;&amp;quot;; &lt;span&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;WorkingDir&lt;/span&gt;:
{tmp}; &lt;span style="color:#3366ff;"&gt;Flags&lt;/span&gt;:
skipifdoesntexist runhidden; &lt;span style="color:#3366ff;"&gt;StatusMsg&lt;/span&gt;:
&amp;quot;Setting Program Access Permissions...&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Lets go over each of these 3 lines here. The first one installs the .NET framework. The Parameters we pass along with this file are simply those to make the installation silent (show no UI while installing). You may or may not want this, it is up to you. For full details on the exact meaning of the command line switch used for the framework installation, visit this &lt;a target="_blank" title="MSDN: .NET Framework Redist Command Line Switches"&gt;MSDN Page&lt;/a&gt; on the subject. The StatusMsg field lets you specify a message that INNO displays while this process is running. I left it off for space saving here, but I often also put &amp;quot;this will take several minutes...&amp;quot; because lets face it, installing the .NET framework on an average computer does take a few minutes. The skipifdcoesntexist flag is important because remember that we only extracted the framework to the temp directory if the system didn&amp;#39;t have the framework installed, so if it doesn&amp;#39;t exist, then chances are the user already had the framework (or is out of disk space!).&lt;/p&gt;
&lt;p&gt;The other 2 lines simply run caspol.exe to set permissions using a little &amp;quot;url&amp;quot; trick. If you are not familiar with CasPol, it is the Code Access Security Policy utility. .NET code has an extra layer of code security hooked into the runtime, and by default your local drives run with full trust, and your network drives run with partial trust. Long story short, if your customer installs your program to a network mapped drive, there is a good chance they will start getting weird security exceptions because you did not design your app to run at partial trust (or your app simply NEEDS full trust to do whatever it is your app does). So we have INNO set permissions to give full trust to wherever the user installed the app. If its the local drive, they already had the permissions, and if its a network drive, this will give them the permissions to the installation folder. Its a win/win scenario. You may wonder why there are 2 entries though, and that is because we first try to remove an existing entry if it is there, to avoid duplicate entries in caspol. If there was no entry to begin with, the method simply completes without doing anything.&lt;/p&gt;
&lt;p&gt;The skipifdoesntexist flag just tells INNO that if the file we are working with doesn&amp;#39;t exist for some reason, don&amp;#39;t try to launch it. The only time it won&amp;#39;t exist is in weird scenarios of framework installation failure, etc.&lt;/p&gt;
&lt;p&gt;Like the &lt;b&gt;[run]&lt;/b&gt; section, there is also an &lt;b&gt;[uninstallrun]&lt;/b&gt; section. This section defines what will run when the program is uninstalled. The only thing I put here, is to remove the caspol entry, just like we did in the run section. It is better to do it here, the entry in the run section is just a backup.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;[UninstallRun]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;Filename&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;:
{win}\Microsoft.NET\Framework\v2.0.50727\CasPol.exe; &lt;span style="color:#3366ff;"&gt;Parameters&lt;/span&gt;:
&amp;quot;-q -machine -remgroup &amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;MyApp&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&amp;quot;&amp;quot;; &lt;span style="color:#3366ff;"&gt;Flags&lt;/span&gt;: skipifdoesntexist runhidden;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So up to this point, we have finished our entire INNO script file, with the exception of the code section. INNO implemented a pascal scripting code section at some point in its life to allow you to extend and customize the installation experience. There is little you can not do, but this flexibility comes at the cost of knowing how to write the code. The Inno Setup IDE is not nearly as advanced as the Visual Studio IDE, so writing code can be a bit difficult at times, however I am going to take you through my standard setup code, and explain what it does.&lt;/p&gt;
&lt;p&gt;The code section starts with, yes you guessed it, a &lt;b&gt;[code]&lt;/b&gt; heading.&lt;/p&gt;
&lt;p&gt;First we are going to define some functions that we will use to aid our setup process.&lt;/p&gt;
&lt;p&gt;I am not going to go over every single line here in detail. The functions are pretty short, and do specifically only what they say. Most of them are just checking the state of the system for a given value, like if the framework exists, if a service pack is installed, etc. Most of them query a registry key, check a file version, or something similar to see what is already on the system.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;[code]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;//
Indicates whether .NET Framework 2.0 is installed.&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;function&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; IsDotNET20Detected(): boolean;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;var&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;success: boolean;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;install: cardinal;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;begin&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;success := RegQueryDWordValue(HKLM,
&amp;#39;SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727&amp;#39;, &amp;#39;Install&amp;#39;, install);&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Result := success &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt;
(install = 1);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;//RETURNS
OPPOSITE OF IsDotNet20Detected FUNCTION&lt;br /&gt;//Remember
this method from the Files section above&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;function&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; NeedsFramework(): Boolean;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;Result := (IsDotNET20Detected = false);&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;//CHECKS
TO SEE IF CLIENT MACHINE IS WINDOWS 95&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;function&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; IsWin95 : boolean;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;Result := (InstallOnThisVersion(&amp;#39;4.0,0&amp;#39;,
&amp;#39;4.1.1998,0&amp;#39;) = irInstall);&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;//CHECKS
TO SEE IF CLIENT MACHINE IS WINDOWS NT4&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;function&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; IsWinNT : boolean;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;Result := (InstallOnThisVersion(&amp;#39;0,4.0.1381&amp;#39;,
&amp;#39;0,4.0.1381&amp;#39;) = irInstall);&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;//GETS
VERSION OF IE INSTALLED ON CLIENT MACHINE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;function&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; GetIEVersion : &lt;span style="color:#3366ff;"&gt;String&lt;/span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;var&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;IE_VER: &lt;span style="color:#3366ff;"&gt;String&lt;/span&gt;;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="color:#339966;"&gt;{First check if Internet
Explorer is installed}&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;&amp;nbsp; if&lt;/span&gt;
RegQueryStringValue(HKLM,&amp;#39;SOFTWARE\Microsoft\Internet
Explorer&amp;#39;,&amp;#39;Version&amp;#39;,IE_VER) &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;Result := IE_VER&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3366ff;"&gt;else&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#339966;"&gt;{No Internet
Explorer at all}&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;result := &amp;#39;&amp;#39;;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;//GETS
THE VERSION OF WINDOWS INSTALLER DLL&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;function&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; GetMSIVersion(): &lt;span style="color:#3366ff;"&gt;String&lt;/span&gt;;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;GetVersionNumbersString(GetSystemDir+&amp;#39;\msi.dll&amp;#39;, Result);&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;//LAUNCH
DEFAULT BROWSER TO WINDOWS UPDATE WEBSITE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;procedure&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; GoToWindowsUpdate;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;var&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;ErrorCode: Integer;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt;
(MsgBox(&amp;#39;Would you like to go to the Windows Update site now?&amp;#39; + chr(13) +
chr(13) + &amp;#39;(Requires Internet Connection)&amp;#39;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;, mbConfirmation, MB_YESNO) =
IDYES) &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ShellExec(&amp;#39;open&amp;#39;,
&amp;#39;http://windowsupdate.microsoft.com&amp;#39;,&amp;#39;&amp;#39;, &amp;#39;&amp;#39;, SW_SHOW, ewNoWait, ErrorCode);&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Those are all of our helper functions. Now lets define a few functions that are built into INNO setup. When I say built in, I mean these are functions that INNO already knows the name of, and will run at a certain point if you define them.&lt;/p&gt;
&lt;p&gt;There are many, but the ones we are going to use are&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;InitializeSetup()&lt;/li&gt;
&lt;li&gt;GetCustomSetupExitCode()&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;InitializeSetup() is the first thing that runs when the installer starts up, so we will add in our custom logic to this routine to make the installer do the checks we want to perform.&lt;/p&gt;
&lt;p&gt;GetCustomSetupExitCode() is something that runs when setup is complete. We use this method to check for the .NET Framework (because at this point it should be installed) and give an error message if we don&amp;#39;t find it. There are any number of reasons why the installation could fail, so all we really do here is check and alert the user if it did fail.&lt;/p&gt;
&lt;p&gt;I will define GetCustomSetupExitCode() first because it is shorter and self explanatory.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;//IF
SETUP FINISHES WITH EXIT CODE OF 0, MEANING ALL WENT WELL&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#339966;"&gt;&lt;br /&gt;//THEN
CHECK FOR THE PRESENCE OF THE REGISTRY FLAG TO INDICATE THE&lt;br /&gt;//.NET
FRAMEWORK WAS INSTALLED CORRECTLY&lt;br /&gt;//IT
CAN FAIL WHEN CUST DOESN&amp;#39;T HAVE CORRECT WINDOWS INSTALLER VERSION&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;function&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;b&gt;GetCustomSetupExitCode&lt;/b&gt;():
Integer;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt;
(IsDotNET20Detected = false) &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MsgBox(&amp;#39;.NET Framework was NOT installed successfully!&amp;#39;,mbError, MB_OK);&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;result := -1&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Now on to the InitializeSetup. This routine is pretty long, because it contains all the checks we want to do before allowing the user to install. Returning False from this routine aborts the setup.&lt;/p&gt;
&lt;p&gt;We perform the following checks&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If Windows 2000, require at least SP3&lt;/li&gt;
&lt;li&gt;If WIndows XP, require at least SP2&lt;/li&gt;
&lt;li&gt;If Windows 95 or NT, don&amp;#39;t install at all&lt;/li&gt;
&lt;li&gt;If NT based (2000, XP, 2003, Vista), require MSI Installer 3 or higher&lt;/li&gt;
&lt;li&gt;If 9x based (98, ME), require MSI Installer 2 or higher&lt;/li&gt;
&lt;li&gt;If IE version is less than version 5.01, don&amp;#39;t install&lt;/li&gt;
&lt;li&gt;If admin is not logged on, don&amp;#39;t install (.NET Framework install requires admin rights)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So lets get to the code shall we:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;function&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;b&gt;InitializeSetup&lt;/b&gt;:
Boolean;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;var&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;Version: TWindowsVersion;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;IE_VER: &lt;span style="color:#3366ff;"&gt;String&lt;/span&gt;;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;MSI_VER: &lt;span style="color:#3366ff;"&gt;String&lt;/span&gt;;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;NL: Char;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;NL2: &lt;span style="color:#3366ff;"&gt;String&lt;/span&gt;;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;begin&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;NL := Chr(13);&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;NL2 := NL + NL;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#339966;"&gt;// Get Version of
Windows from API Call&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;GetWindowsVersionEx(Version); &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#339966;"&gt;// On Windows
2000, check for SP3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt;
Version.NTPlatform &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(Version.Major = 5) &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(Version.Minor = 0) &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(Version.ServicePackMajor &amp;lt; 3) &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SuppressibleMsgBox(&amp;#39;When running on Windows
2000, Service Pack 3 is required.&amp;#39; + NL +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;Visit&amp;#39; + NL2 +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39; ***
http://windowsupdate.microsoft.com ***&amp;#39; + NL2 +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;to get the needed Windows
Updates,&amp;#39; + NL +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;and then reinstall this
program&amp;#39;,&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mbCriticalError, MB_OK,
MB_OK);&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GoToWindowsUpdate;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Result := False;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Exit;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#339966;"&gt;// On Windows XP,
check for SP2&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt;
Version.NTPlatform &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(Version.Major = 5) &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(Version.Minor = 1) &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(Version.ServicePackMajor &amp;lt; 2) &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SuppressibleMsgBox(&amp;#39;When running on Windows
XP, Service Pack 2 is required.&amp;#39; + NL +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;Visit&amp;#39; + NL2 + &amp;#39; ***
http://windowsupdate.microsoft.com ***&amp;#39; + NL2 +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;to get the needed
Windows Updates,&amp;#39; + NL +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;and then reinstall this
program&amp;#39;,&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mbCriticalError, MB_OK,
MB_OK);&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GoToWindowsUpdate;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Result := False;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Exit;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#339966;"&gt;//IF WINDOWS 95
OR NT DON&amp;#39;T INSTALL&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt;
(IsWin95) &lt;span style="color:#3366ff;"&gt;or&lt;/span&gt; (IsWinNT) &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SuppressibleMsgBox(&amp;#39;This program can not
run on Windows 95 or Windows NT.&amp;#39;,&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mbCriticalError, MB_OK, MB_OK);&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Result := False;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Exit;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#339966;"&gt;//CHECK MSI VER,
NEEDS TO BE 3.0 ON ALL SUPPORTED SYSTEM EXCEPT 95/ME, WHICH NEEDS 2.0)&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;MSI_VER := GetMSIVersion&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt;
((Version.NTPlatform) &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt; (MSI_VER &amp;lt;
&amp;#39;3&amp;#39;)) &lt;span style="color:#3366ff;"&gt;or&lt;/span&gt; ((&lt;span style="color:#3366ff;"&gt;Not&lt;/span&gt;
Version.NTPlatform) &lt;span style="color:#3366ff;"&gt;and&lt;/span&gt; (MSI_VER &amp;lt; &amp;#39;2&amp;#39;)) &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;begin&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SuppressibleMsgBox(&amp;#39;You do not have all
the required Windows Updates to install this program.&amp;#39; + NL +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;Visit ***
http://windowsupdate.microsoft.com *** to get the needed Windows Updates,&amp;#39; + NL
+&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;and then reinstall
this program&amp;#39;,&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mbCriticalError,
MB_OK, MB_OK);&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GoToWindowsUpdate;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Result := False;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Exit;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#339966;"&gt;//CHECK THE IE
VERSION (NEEDS TO BE 5.01+)&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;IE_VER := GetIEVersion;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt; IE_VER
&amp;lt; &amp;#39;5.01&amp;#39; &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt;
IE_VER = &amp;#39;&amp;#39; &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MsgBox(&amp;#39;Microsoft Internet Explorer
5.01 or higher is required to run this program.&amp;#39; + NL2 +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;You do not currently have
Microsoft Internet Explorer installed, or it is not working correctly.&amp;#39; + NL +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;Obtain a newer version at
www.microsoft.com and then run setup again.&amp;#39;, mbInformation, MB_OK);&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;else&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MsgBox(&amp;#39;Microsoft Internet Explorer
5.01 or higher is required to run this program.&amp;#39; + NL2 +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;You are using version &amp;#39; +
IE_VER + &amp;#39;.&amp;#39; + NL2 +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;Obtain a newer version at
www.microsoft.com and then run setup again.&amp;#39;, mbInformation, MB_OK);&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GoToWindowsUpdate;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;result := false;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;exit;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#339966;"&gt;//MAKE SURE USER
HAS ADMIN RIGHTS BEFORE INSTALLING&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt;
IsAdminLoggedOn &lt;span style="color:#3366ff;"&gt;then&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;result := true&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;exit;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;else&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;begin&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MsgBox(&amp;#39;You must have admin rights to
perform this installation.&amp;#39; + NL +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;Please log on with an account
that has administrative rights,&amp;#39; + NL +&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#39;and run this installation again.&amp;#39;,
mbInformation, MB_OK);&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;result := false;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#3366ff;"&gt;end&lt;/span&gt;;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#3366ff;"&gt;&lt;br /&gt;end&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;So there you have it. The completed code section of the script. You now have a fully functional INNO setup script that will package the .NET 2.0 framework with your program into a single setup.exe, extract it at install time if needed, and install it silently. The script also checks to make sure the user has admin rights, has the needed service pack levels for certain operating systems, has the needed versions of things like MSI installer and Internet Explorer. There may be other checks you want to do (or even some you want to omit) so I hope my script is a good jumping off point for you to get into customizing your own. My code also offers in several failure spots due to system requirements to launch the windows update page so users can get the updates they need. You would be surprised how many people are not even running SP2 on Windows XP even though it has been out a long time now and we are already up to SP3.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Next time, I plan to show you how to associate a file type with your program at install time. For example, maybe your app is a text editor, and you want to associate *.txt files with your program when it is installed. There are a few registry keys involved, and we will go over them in detail. I will also show you how to install a font file, as well as adding some custom functionality to the UI of the installer, to perform even more custom actions. Then I will go into detail about detecting if the user has the .NET Framework installed from an ASP, PHP, or ASP.NET Page and Internet Explorer (Sorry FireFox users, it doesn&amp;#39;t work for you). This can be useful when you want to offer your user a download with or without the framework (to save the 20+MB) based on if they need it or not.&lt;/p&gt;
&lt;p&gt;You can download the complete script file as it appears in this article from the &lt;a title=".NET INNO Example File" href="http://zerosandtheone.com/media/p/180.aspx"&gt;media download page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://zerosandtheone.com/aggbug.aspx?PostID=167" width="1" height="1"&gt;</description><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Installer/default.aspx">Installer</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/INNO/default.aspx">INNO</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Setup/default.aspx">Setup</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/.NET/default.aspx">.NET</category></item><item><title>VB.NET : Extended Combobox to better visually handle being disabled</title><link>http://zerosandtheone.com/blogs/vb/archive/2008/05/12/vb-net-extended-combobox-to-better-handle-being-disabled.aspx</link><pubDate>Mon, 12 May 2008 21:51:00 GMT</pubDate><guid isPermaLink="false">25aead6d-839f-4a6e-811a-c90be434890b:21</guid><dc:creator>Matthew Kleinwaks</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://zerosandtheone.com/blogs/vb/rsscomments.aspx?PostID=21</wfw:commentRss><comments>http://zerosandtheone.com/blogs/vb/archive/2008/05/12/vb-net-extended-combobox-to-better-handle-being-disabled.aspx#comments</comments><description>&lt;p&gt;If you do any WinForms programming then chances are you have used comboboxes, and perhaps at one point or another, you disabled one of those comboboxes because you did not want the user to be able to make a selection. This works fine, however I actually was getting some complaints from users of some of my software apps saying it was too hard to read the disabled text in a combo. Sometimes just because a feature is disabled, does not mean that the data being displayed in it is of no importance.&lt;/p&gt;
&lt;p&gt;So today lets see how we can change this standard functionality to make things a bit easier on our end users. &lt;br /&gt;We will use Visual Basic .NET to extended the standard WinForms .NET combobox control.&lt;/p&gt;
&lt;p&gt;Lets start by taking a look at the demo. Here we see 2 disabled comboboxes. The top one is a standard WinForm combobox, which has a gray on gray appearance, and can be pretty hard to read. This demo uses larger fonts, so at a smaller font size, it becomes even more difficult. The second one is the extended ComboBox, and you can see that the ForeColor has stayed black, and the BackColor is gray indicating it is disabled. Much easier to read. So lets see what the code looks like to accomplish this.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://zerosandtheone.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vb.images/comboboxex1.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Like all the extended controls you can make from the standard WinForm controls, we need to inherit from the control we want to extend, in this case Combobox.&lt;/p&gt;
&lt;p&gt;The real trick here is that we are never going to actually make the control disabled. We are simply going to keep track of if it SHOULD be disabled, and stop certain actions from happening in that case. Those actions would be the ability to drop down the combo to make a selection, or to type in the textbox portion of the combo. Take those away, and the combobox is essentially disabled. The other thing we need to take into account, is the default context menu, which gives the user access to features like paste.&lt;/p&gt;
&lt;p&gt;In order to do this, we setup a few private fields to keep track of the disabled/enabled state manually.&lt;/p&gt;
&lt;p&gt;Here is the start of our class&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&amp;#39; 2008 - ZerosAndTheOne.com&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&amp;#39; Matthew Kleinwaks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&amp;#39;Extended Combobox Control for better &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&amp;#39;handling of disabled appearance&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Option&lt;/span&gt; &lt;span style="color:blue;"&gt;Strict&lt;/span&gt; &lt;span style="color:blue;"&gt;On&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Option&lt;/span&gt; &lt;span style="color:blue;"&gt;Explicit&lt;/span&gt; &lt;span style="color:blue;"&gt;On&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Imports&lt;/span&gt; System.Windows.Forms&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; ComboboxEx&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; ComboBox&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Private Backing Fields&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; Private backing field for the shadowed enabled property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _Enabled &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; = &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; BackColor of control when it is enabled&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _enabledBackcolor &lt;span style="color:blue;"&gt;As&lt;/span&gt; Color = &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.BackColor&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; BackColor of a control when it is disabled&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _disabledBackColor &lt;span style="color:blue;"&gt;As&lt;/span&gt; Color = Color.LightGray&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Note it is just 3 private fields we will use. One to keep track of the enabled state, and 2 to keep track of the BackColor, depending on the enabled state. The reason we use these 2 BackColor fields, is because we set the controls underlying BackColor property to one of these when the enabled state changes, so we need to keep track of what each color should be when enabled does change.&lt;/p&gt;
&lt;p&gt;Next lets define our public fields that will be exposed to the consumer of this control.&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Public Exposed Fields&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; Gets or Sets the value indicating if this control is enabled&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Boolean&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;True of control is enabled, otherwise false&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;This property shadows the ComboBox base class enabled property&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Shadows&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Enabled() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _Enabled&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _Enabled &amp;lt;&amp;gt; Value &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _Enabled = Value&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; OnEnabledChanged(&lt;span style="color:blue;"&gt;New&lt;/span&gt; EventArgs)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; Gets or Sets the BackColor of the control when it is disabled&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Color Structure&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; DisabledBackColor() &lt;span style="color:blue;"&gt;As&lt;/span&gt; Color&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _disabledBackColor&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; Color)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _disabledBackColor = value&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; _Enabled &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.BackColor = _disabledBackColor&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; Gets or Sets the BackColor of the control when it is enabled&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Color Structure&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Shadows the base class BackColor property&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Shadows&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; BackColor() &lt;span style="color:blue;"&gt;As&lt;/span&gt; Color&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _enabledBackcolor&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; Color)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _enabledBackcolor &amp;lt;&amp;gt; value &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _enabledBackcolor = value&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.BackColor = _enabledBackcolor&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So just like we have 3 backing fields, we have 3 public properties. The biggest thing to note is that 2 of these properties (BackColor and Enabled) are declared shadows. This means they hide and replace the functionality that the base Combobox class provided for these given properties. It is now totally up to us to handle these properties in our new class.&lt;/p&gt;
&lt;p&gt;To do the magic here, we will override a few protected methods from the combobox base class, and add our custom functionality.&lt;/p&gt;
&lt;p&gt;Lets start with OnEnabledChanged. This is the method that is called when Enabled is changed. In the Enabled public property we defined above, we call this method.&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; When the shadowed enabled property changes, this method is called&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; OnEnabledChanged(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.EventArgs)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;COMMON ROUTINE FOR TOGGLING ENABLED STATUS&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ToggleEnabled()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;SEND NOTIFICATION TO BASE CLASS&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.OnEnabledChanged(e)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Pretty simple (we will define the ToggleEnabled method after we define all our overrides).&lt;/p&gt;
&lt;p&gt;Next is the PreProcessMessage override. We use this to look at key presses and decide if we want to throw them out, or let them pass to the control to do whatever the given keypress might do. Basically in this example, if the control is enabled, we don&amp;#39;t do anything at all, so that is the first thing we check. Next we allow through key presses like Tab, Left, and Right. You could customize what you allow based on the needs of your program.&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;OVERRIDE PreProcessMessage TO LOOK FOR KEY PRESSES AND FILTER THEM&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; PreProcessMessage(&lt;span style="color:blue;"&gt;ByRef&lt;/span&gt; msg &lt;span style="color:blue;"&gt;As&lt;/span&gt; Message) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;PREVENT KEYBOARD ENTRY IF CONTROL IS DISABLED&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; _Enabled &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;CHECK IF ITS A KEYDOWN MESSAGE (&amp;amp;H100)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; msg.Msg = &amp;amp;H100 &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;GET THE KEY THAT WAS PRESSED&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; key &lt;span style="color:blue;"&gt;As&lt;/span&gt; Int32 = msg.WParam.ToInt32&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;ALLOW TAB, LEFT, OR RIGHT KEYS&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; key &amp;lt;&amp;gt; Keys.Tab &lt;span style="color:blue;"&gt;OrElse&lt;/span&gt; _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; key &amp;lt;&amp;gt; Keys.Left &lt;span style="color:blue;"&gt;OrElse&lt;/span&gt; _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; key &amp;lt;&amp;gt; Keys.Right &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;CALL BASE METHOD SO DELEGATES RECEIVE EVENT&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.PreProcessMessage(msg)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
Next we override the WndProc method. In here we are looking for 2 possible messages, which have to deal with the drop down of the list in the combobox. We don&amp;#39;t want that to happen when the control is disabled, so we filter out those specific messages, and allow all other messages to go through as normal.&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;OVERRIDE WndProc TO LOOK FOR DROP DOWN MESSAGES AND FILTER THEM&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; WndProc(&lt;span style="color:blue;"&gt;ByRef&lt;/span&gt; m &lt;span style="color:blue;"&gt;As&lt;/span&gt; Message)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;PREVENT DROPDOWN LIST DISPLAYING IF READONLY&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; _Enabled &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; m.Msg = &amp;amp;H201 &lt;span style="color:blue;"&gt;OrElse&lt;/span&gt; m.Msg = &amp;amp;H203 &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;CALL BASE METHOD SO DELEGATES RECEIVE EVENT&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.WndProc(m)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
Finally, the last override we need to do, is the OnParentEnabledChanged method. This is because if the control is in a container, like a groupbox or panel, and you set the container&amp;#39;s enabled property to false, you would expect the combobox to also have it&amp;#39;s enabled property set to false. However, the parent control does not simply loop its child controls and set their enabled properties. It actually calls the OnParentEnabledChanged for each child, and lets the child handle what it want&amp;#39;s to do in that case. If the control is enabled, we pass through the message like normal. If it is disabled, then we call the ToggleEnabled routine, which is our last routine to define.&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;WHEN THE CONTROL IS IN A CONTAINER, AND THE CONTAINER&amp;#39;S ENABLED PROPERTY&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IS SET TO FALSE, THIS CONTROL GETS ITS OnParentEnabledChanged CALLED&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;NOT JUST THE CONTROLS ENABLED PROPERTY SET SO WE OVERRIDE THIS, AND &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;TOGGLE ENABLED STATE ACCORDINGLY&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; OnParentEnabledChanged(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.EventArgs)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _Enabled = &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.Parent.Enabled&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _Enabled &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.OnParentEnabledChanged(e)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ToggleEnabled()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So it is time to define our ToggleEnabled routine. It is actually pretty simple. We set tabstop to false if the control is disabled, and true if it is enabled, so users won&amp;#39;t set focus to it with the tab key. We also set the ContextMenuStrip equal to a New ContextMenuStrip. This actually causes NO menu to appear when the control is right clicked, since the NEW context menu we make has no menu items on it. Setting this property to nothing will bring back the standard cut/copy/paste context menu. Keep this all in mind if you happen to use a custom context menu on this control. We also set the BackColor property to our desired colors were, and also set the SelectionLength to 0. This just deselects any selected text, and is really optional and up to you.&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Support Methods&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;COMMON ROUTINE FOR TOGGLING ENABLED STATE&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; ToggleEnabled()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IF THE CONTROL IS DISABLED, TURN OFF ITS TABSTOP&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.TabStop = _Enabled&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IF THE CONTROL IS DISABLED, SET ITS CONTEXT MENU TO&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;A DUMMY NEW CONTEXT MENU SO WE DON&amp;#39;T GET THE&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;DEFAULT CONTEXT MENU, OTHERWISE SETTING IT TO&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;NOTHING REAPPLIES THE DEFAULT CONTEXT MENU&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;ALSO SET BACK COLOR ACCORDINGLY&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; _Enabled &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.ContextMenuStrip = &lt;span style="color:blue;"&gt;New&lt;/span&gt; ContextMenuStrip&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.BackColor = _disabledBackColor&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.ContextMenuStrip = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.BackColor = _enabledBackcolor&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;DESELECT ANY TEXT FROM COMBOBOX&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.SelectionLength = 0&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p style="margin:0px;"&gt;So that all there is to it. We end up with these results:&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;img src="http://zerosandtheone.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vb.images/comboboxex2.jpg" alt="" /&gt;&lt;img src="http://zerosandtheone.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vb.images/comboboxex3.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;Attached is the source code for this project in Visual Studio 2008 format, targetting .NET 2.0&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;As always, please leave your comments and suggestions.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://zerosandtheone.com/aggbug.aspx?PostID=21" width="1" height="1"&gt;</description><enclosure url="http://zerosandtheone.com/media/p/22.aspx" length="18099" type="text/html; charset=utf-8" /><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/WinForms/default.aspx">WinForms</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Custom+Controls/default.aspx">Custom Controls</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/ComboBox/default.aspx">ComboBox</category></item><item><title>VB.NET : Translucent Controls in Windows Forms (Part Deux)</title><link>http://zerosandtheone.com/blogs/vb/archive/2008/05/06/translucent-controls-in-windows-forms-part-deux.aspx</link><pubDate>Tue, 06 May 2008 12:14:00 GMT</pubDate><guid isPermaLink="false">25aead6d-839f-4a6e-811a-c90be434890b:6</guid><dc:creator>Matthew Kleinwaks</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://zerosandtheone.com/blogs/vb/rsscomments.aspx?PostID=6</wfw:commentRss><comments>http://zerosandtheone.com/blogs/vb/archive/2008/05/06/translucent-controls-in-windows-forms-part-deux.aspx#comments</comments><description>&lt;p&gt;So yesterday &lt;a target="_self" href="http://zerosandtheone.com/blogs/vb/archive/2008/05/06/translucent-controls-in-windows-forms.aspx" title="Translucent Controls in Windows Forms"&gt;I talked about making a translucent button in WinForms&lt;/a&gt; using VB.NET. If you have not read that yet, then you should probably do so before digging into part 2, where we expand part 1 to cover more controls.&lt;/p&gt;
&lt;p&gt;Today lets look at making a translucent TabPage control.&lt;/p&gt;
&lt;p&gt;Here is our end result:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://zerosandtheone.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vb.images/translucent_5F00_button_5F00_demo2.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;So we have a nice cherry sunburst Gibson Les Paul as our form background, with a TabControl overlaying it, with a few buttons on it.&lt;/p&gt;
&lt;p&gt;So what is different about the implementation of the translucent tab control versus the buttons we did last time? Well for starters, the translucent painting of the background needs to be done on the TabPages which are the individual tab objects that the TabControl contains.&lt;/p&gt;
&lt;p&gt;I am not going to redefine all the code used for this control, as much of it is the same as from the button control. The full source of the project is attached to this post, so you can download that for all the code.&lt;/p&gt;
&lt;p&gt;I will go over the specific differences between the button and the TabControl so you can see what we had to do differently.&lt;/p&gt;
&lt;p&gt;The first thing is, we want to make the control translucent regardless of what tab is currently selected. So we need to track controls being added or removed from the TabControl. TabControls can ONLY have TabPages added to their controls collection, otherwise the framework throws an error. So we wire up the OnControlAdded and OnControlRemoved event handlers to add or remove the given TabPage from being custom drawn as translucent.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;OVERRIDES TO HANDLE CHILD TABPAGES&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; OnControlAdded( _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.Windows.Forms.ControlEventArgs)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;AddHandler&lt;/span&gt; &lt;span style="color:blue;"&gt;DirectCast&lt;/span&gt;(e.Control, TabPage).Paint, &lt;span style="color:blue;"&gt;_&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;AddressOf&lt;/span&gt; DrawFormBackgroundOnTabPage&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.OnControlAdded(e)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; OnControlRemoved( _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.Windows.Forms.ControlEventArgs)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;RemoveHandler&lt;/span&gt; &lt;span style="color:blue;"&gt;DirectCast&lt;/span&gt;(e.Control, TabPage).Paint, &lt;span style="color:blue;"&gt;_&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;AddressOf&lt;/span&gt; DrawFormBackgroundOnTabPage&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.OnControlRemoved(e)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Note the DrawFormBackgroundOnTabPage method we are wiring up. We will define that next.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="background:#f9f9f9 none repeat scroll 0%;font-family:Courier New;font-size:11pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;CUSTOM PAINTING ROUTINE&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; DrawFormBackgroundOnTabPage(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt;, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; PaintEventArgs)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;DON&amp;#39;T DO ANY CUSTOM PAINTING IF THE FEATURE IS DISABLED&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; _isTranslucent &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; myTab &lt;span style="color:blue;"&gt;As&lt;/span&gt; TabPage = &lt;span style="color:blue;"&gt;DirectCast&lt;/span&gt;(sender, TabPage)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;GET THE CONTROL THAT THE IMAGE IS ON WE WANT TO USE FOR TRANSLUCENCY&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; parentControl &lt;span style="color:blue;"&gt;As&lt;/span&gt; Control = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _backgroundImageSource = _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ITranslucentControl.eBackgroundImageSource.Form &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;GET FORM&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parentControl = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.FindForm&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;GET PARENT (WILL BE FORM IF NO CONTAINER EXISTS)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parentControl = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Parent&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IF THE PARENT CONTROL WE ARE REFERNCING HAS NO &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:green;"&gt;BACKGROUND IMAGE, DO NOTHING&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;ALSO CHECK TO MAKE SURE STRETCH IS THE LAYOUT TYPE&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; parentControl.BackgroundImage &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; parentControl.BackgroundImageLayout &amp;lt;&amp;gt; _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ImageLayout.Stretch &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;SOURCE RECTANGLE IS THE CLIPPED REGION OF THE &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:green;"&gt;FORMS BACKGROUND IMAGE &lt;/span&gt;&lt;span style="color:green;"&gt;THAT IS BEHIND THE TABPAGE. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:green;"&gt;CLIPPING ALLOWS US TO THEN PASTE THE COVERED PART&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:green;"&gt;OF THE FORM BACKGROUND IMAGE &lt;/span&gt;&lt;span style="color:green;"&gt;ONTO &lt;/span&gt;&lt;span style="color:green;"&gt;THE LISTVIEW &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;BACKGROUND TO MIMIC TRANSPARENCY&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; srcRect &lt;span style="color:blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _backgroundImageSource = _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ITranslucentControl.eBackgroundImageSource.Form &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; srcRect = &lt;span style="color:blue;"&gt;New&lt;/span&gt; Rectangle(GetPointFromForm(myTab), myTab.Size)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; srcRect = &lt;span style="color:blue;"&gt;New&lt;/span&gt; Rectangle( _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; (myTab.Left + &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Left), _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; (myTab.Top + &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Top), _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; myTab.ClientRectangle.Width, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; myTab.ClientRectangle.Height)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IMAGE WITH THE CURRENT CLIENT SIZE OF THE BACKGROUND&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; mySourceImage &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Bitmap(parentControl.BackgroundImage, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parentControl.ClientSize.Width, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parentControl.ClientSize.Height)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IMAGE ATTRIBUTES SO WE CAN SET GAMMA (TO MAKE IMAGE LIGHTER)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; image_attr &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Drawing.Imaging.ImageAttributes&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image_attr.SetGamma(_gamma)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;DRAW THE CROPPED IMAGE ONTO THE TABPAGE&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics.DrawImage(mySourceImage, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; myTab.ClientRectangle, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (srcRect.X + _Offset.X), _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (srcRect.Y + _Offset.Y), _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; srcRect.Width, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; srcRect.Height, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; GraphicsUnit.Pixel, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image_attr)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image_attr.Dispose()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image_attr = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The concept we use is the same as the buttons, however sender is always going to be a TabPage, so we grab that at the start of the routine, and use it as our painting canvas. The key difference is we actually paint the background onto the TabPage, where as the button got its backgroundimage property assigned to the image we wanted to show. There is also a little bit of additional positioning code, to account for the parent of the TabPage, which is the containing TabControl. Since the TabControl has the actual tabs on it, we need to take that into account, otherwise the section of the background we grab to paint on the tabs will be badly offset.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Remember for a full rundown, read part 1: &lt;a target="_self" href="http://zerosandtheone.com/blogs/vb/archive/2008/05/06/translucent-controls-in-windows-forms.aspx" title="Translucent Controls in Windows Forms"&gt;Translucent Button in WinForms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:blue;"&gt;&lt;span style="color:#000000;"&gt;As always, send me your comments or code improvements if you happen to find any.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://zerosandtheone.com/aggbug.aspx?PostID=6" width="1" height="1"&gt;</description><enclosure url="http://zerosandtheone.com/media/p/23.aspx" length="18079" type="text/html; charset=utf-8" /><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/WinForms/default.aspx">WinForms</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Custom+Controls/default.aspx">Custom Controls</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/VB.NET/default.aspx">VB.NET</category></item><item><title>VB.NET : Translucent Controls in Windows Forms</title><link>http://zerosandtheone.com/blogs/vb/archive/2008/05/05/translucent-controls-in-windows-forms.aspx</link><pubDate>Mon, 05 May 2008 17:44:00 GMT</pubDate><guid isPermaLink="false">25aead6d-839f-4a6e-811a-c90be434890b:4</guid><dc:creator>Matthew Kleinwaks</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://zerosandtheone.com/blogs/vb/rsscomments.aspx?PostID=4</wfw:commentRss><comments>http://zerosandtheone.com/blogs/vb/archive/2008/05/05/translucent-controls-in-windows-forms.aspx#comments</comments><description>&lt;p&gt;Windows Forms controls in .NET do a lot more for us than they did in previous versions of VB. One of the best things about getting all the OO features .NET brought us, is the ability to extend controls through inheritance or some other means. Some controls directly support custom drawing of their visuals, while others need to be extended to do so.&lt;/p&gt;
&lt;p&gt;One thing I have seen asked a few times, was how to make a given control translucent, which I like to think of a little differently than transparent.&lt;/p&gt;
&lt;p&gt;So after some investigation, I came up with a method that works decently to do this for most standard WinForm controls you would want to do this with. The biggest issues I came across, were dealing with scrolling and the custom drawing, which I am still looking at for controls that scroll. However some controls do not, like a button, and that is what we are going to take a look at today.&lt;/p&gt;
&lt;p&gt;The idea of translucent controls really revolves around the concept that your WinForm is going to have an image as its background. It also assumes this image is set to stretch so that the image takes up the entire form background. The code in this example can be tweaked if this is not your exact scenario, as this is more or less a proof of concept on doing things this way.&lt;/p&gt;
&lt;p&gt;So first let me explain the concept we are going for by illustrating the end result:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://zerosandtheone.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vb.images/translucent_5F00_button_5F00_demo.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;You can see we have a standard button just to pair against the custom button. Then a custom button that looks the same because its IsTranslucent property (one of the custom properties we add to the button) is set to false. The two bottom buttons have IsTranslucent set to true, and the left button has the default gamma setting of 1.0, while the one on the right has a frosted effect by settings its gamma to 0.15.&lt;/p&gt;
&lt;p&gt;So now lets talk about how we actually do this.&lt;/p&gt;
&lt;p&gt;The first thing I did was identify the common elements to a translucent control. I found that (for now) they are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Background Source - where are we getting the background from to paint onto the button&lt;/li&gt;
&lt;li&gt;Gamma - value to indicate the over/under saturation of the image to give it a frosted or darkened effect&lt;/li&gt;
&lt;li&gt;IsTranslucent - indicates if the control should be translucent at all. When this is false, all the custom code is skipped, and the control behaves like a normal button&lt;/li&gt;
&lt;li&gt;Offset - Since controls often have borders and a 3D look, this property allows an offset of the painted image so it perfectly matches with the background of the form/container. Buttons I found work well with an offset of 5/5, while other controls needed no offset, because they appear flat already.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So because all controls that I want to make translucent will use these features, I created an interface that the controls can implement.&lt;/p&gt;
&lt;p&gt;Lets define that interface now:&lt;/p&gt;
&lt;div style="font-size:11pt;background:#f9f9f9;color:black;font-family:Courier New;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt; ITranslucentControl&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Enum&lt;/span&gt; eBackgroundImageSource&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Form = 0&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Container = 1&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Enum&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Gamma() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Single&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsTranslucent() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Offset() &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.Drawing.Point&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; BackgroundImageSource() &lt;span style="color:blue;"&gt;As&lt;/span&gt; eBackgroundImageSource&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Interface&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Pretty straight forward, it has all the things I described in the bullet points above. If you are not familiar with interfaces, then all you should really know, is that our custom button will implement this interface, which means it will have all these properties in itself, however the actual code in these properties is totally up to the class to implement. Most of these properties simply access backing fields in the class though. There is no real magic going on here, I just made the interface because I know all my custom translucent controls will use these items, but inheritance from a base class&amp;nbsp;was not really an option because we need to inherit from the control we want to extend. So if you are wondering &amp;quot;Couldn&amp;#39;t I do this without the interface?&amp;quot; the answer is yes, I just decided to use one so I wouldn&amp;#39;t forget any of the common properties I want the control to have.&lt;/p&gt;
&lt;p&gt;Ok, so now that we have our interface, we need to make our button class.&lt;/p&gt;
&lt;div style="FONT-SIZE:11pt;BACKGROUND:#f9f9f9;COLOR:black;FONT-FAMILY:Courier New;"&gt;&lt;span style="COLOR:blue;"&gt;
&lt;div style="FONT-SIZE:11pt;BACKGROUND:#f9f9f9;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Imports&lt;/span&gt; System.Windows.Forms&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Imports&lt;/span&gt; System.Drawing&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Class&lt;/span&gt; TranslucentButton&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Inherits&lt;/span&gt; System.Windows.Forms.Button&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Implements&lt;/span&gt; ITranslucentControl&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Class&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So our class name is TranslucentButton, and it inherits from button and implement our ITranslucentControl interface.&lt;/p&gt;
&lt;p&gt;Lets add a constructor which sets double buffering to true. This can reduce flicker where possible, which is a common issue for WinForms and graphics.&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#a31515;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="FONT-SIZE:11pt;BACKGROUND:#f9f9f9;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;Region &lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;CONSTRUCTOR(S)&amp;quot;&lt;/span&gt; &lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;Public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Sub&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;New&lt;/span&gt;()&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;#39;SET DOUBLE BUFFERING TO REDUCE FLICKER WHERE POSSIBLE&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;MyBase&lt;/span&gt;.DoubleBuffered = &lt;span style="COLOR:blue;"&gt;True&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0px;"&gt;&lt;span style="COLOR:blue;"&gt;#End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Region&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You will note I make use of code regions to keep things separated and easy to manage in the code window.&lt;/p&gt;
&lt;p&gt;Next we have all the public properties which came from the ITranslucentControl interface, along with backing private fields to maintain the state of the object. Interfaces can&amp;#39;t define fields, so we need to manually do that in each one.&lt;/p&gt;
&lt;div style="font-size:11pt;background:#f9f9f9;color:black;font-family:Courier New;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;PUBLIC PROPERTIES AND ASSOCIATED PRIVATE FIELDS&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _gamma &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Single&lt;/span&gt; = 1.0&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; Gets or Sets the gamma correction to&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:#000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; use for the translucent image background&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Single&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Value (as single) for the gamma correction&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;None&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Gamma() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Single&lt;/span&gt; _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; ITranslucentControl.Gamma&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _gamma&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Single&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; value &amp;lt; 0.01 &lt;span style="color:blue;"&gt;Then&lt;/span&gt; value = 0.01&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _gamma = value&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _isTranslucent &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; = &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; Indicates if control will be drawn translucent. False by default.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Boolean&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;True if control is translucent, otherwise False.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;None&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; IsTranslucent() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;Implements&lt;/span&gt; ITranslucentControl.IsTranslucent&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _isTranslucent&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; _isTranslucent &lt;span style="color:blue;"&gt;AndAlso&lt;/span&gt; value = &lt;span style="color:blue;"&gt;False&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.BackgroundImage.Dispose()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.BackgroundImage = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _isTranslucent = value&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _Offset &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Point(5, 5)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; Provides an offset value incase the image is&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;&amp;#39;&amp;#39; not correctly aligning in this control.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; This can occur when special using a 3d border,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;&amp;#39;&amp;#39; or something similar that would cause an offset&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Point. Default value is 5, 5 for this control&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;Current offset for this controls background drawing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;None&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Offset() _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;As&lt;/span&gt; Point _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; ITranslucentControl.Offset&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _Offset&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; Point)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _Offset = value&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _backgroundImageSource &lt;span style="color:blue;"&gt;As&lt;/span&gt; _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ITranslucentControl.eBackgroundImageSource = _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ITranslucentControl.eBackgroundImageSource.Form&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; Gets/Sets the source of the background image for this control&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;eBackgroundImageSource enumeration value&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&lt;span style="color:#000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;span style="color:green;"&gt;eBackgroundImageSource.Form when the forms &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:#000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;span style="color:green;"&gt;background should be used, eBackgroundImageSource.Parent&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; when the forms immediate parent should be used&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:green;"&gt;This setting is ignored when&lt;/span&gt;&lt;span style="color:gray;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;IsTranslucent is False&lt;/span&gt;&lt;span style="color:gray;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&amp;#39;&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; BackgroundImageSource() &lt;span style="color:blue;"&gt;As&lt;/span&gt; _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ITranslucentControl.eBackgroundImageSource _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Implements&lt;/span&gt; ITranslucentControl.BackgroundImageSource&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _backgroundImageSource&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; ITranslucentControl.eBackgroundImageSource)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _backgroundImageSource = value&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This looks like a lot of code, but all it is, is each of the implemented properties from our interface, along with a backing field. There is a decent amount of comments too. You could add some validation to the properties if you wanted, lets say, to limit the gamma value.&lt;/p&gt;
&lt;p&gt;We use one private field here that is not part of the interface, and it is also not exposed via a public property. It is called _bypassPainting and it is just a boolean flag we set to skip the paint event of the control from firing twice, which would affect performance.&lt;/p&gt;
&lt;div style="font-size:11pt;background:#f9f9f9;color:black;font-family:Courier New;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;PRIVATE FIELDS&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;FLAG USED TO BYPASS REPAINTING AFTER THE BACKGROUND PICTURE IS SET&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _bypassPainting &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; = &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So that is the entire class, with the exception of the paint event which does all the hard work. Time to dig into that one and see where the &amp;quot;magic&amp;quot; happens.&lt;/p&gt;
&lt;p&gt;So the magic that happens, is actually that the button looks at its parent control, which may be a form, or it may be another container, such as a groupbox or panel. You may want to have a button in a panel, but still have it use the forms background image for its translucency. Or maybe you do actually want the panels background image to be the image we see through the button. This is why we have the BackgroundImageSource property, which if you remember is an enum value of Form or Container. This value does not matter at all if the button is directly on the form to begin with. It only comes into play when the button is in an additional container.&lt;/p&gt;
&lt;p&gt;The button takes the image should be seen through the button, and calculates which part of this image the button is actually covering. It then takes that region of the image, and creates a new image from that, and uses that as the buttons background image. This gives the button its transparent look, but still gives it all the standard features of a button. From there you can set gamma to make the image in the button lighter or darker if needed. I made the default offset of the button 5,5 which takes into account the buttons 3D appearance. This can be customized in the event the images are not matching perfectly between the parent image and the button image.&lt;/p&gt;
&lt;p&gt;I won&amp;#39;t go into too much more detail about the paint event, as it is commented pretty well, and if you follow it along, should be self explanatory.&lt;/p&gt;
&lt;div style="font-size:11pt;background:#f9f9f9;color:black;font-family:Courier New;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;CUSTOM PAINTING ROUTINE&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; OnPaint( _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ByVal&lt;/span&gt; pevent &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.Windows.Forms.PaintEventArgs)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.OnPaint(pevent)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IF BYPASSPAINTING FLAG WAS SET, RESET IT AND DO NOT PAINT&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _bypassPainting &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _bypassPainting = &lt;span style="color:blue;"&gt;False&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;DON&amp;#39;T DO ANY CUSTOM PAINTING IF THE FEATURE IS DISABLED&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; _isTranslucent &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;GET THE CONTROL THAT THE IMAGE &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;IS ON WE WANT TO USE FOR TRANSLUCENCY&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; parentControl &lt;span style="color:blue;"&gt;As&lt;/span&gt; Control = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _backgroundImageSource = _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ITranslucentControl.eBackgroundImageSource.Form &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;GET FORM&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parentControl = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.FindForm&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;GET PARENT (WILL BE FORM IF NO CONTAINER EXISTS)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parentControl = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Parent&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IF THE PARENT CONTROL WE ARE REFERENCING &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:green;"&gt;HAS NO BACKGROUND IMAGE, DO NOTHING&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;ALSO CHECK TO MAKE SURE STRETCH IS THE LAYOUT TYPE&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; parentControl.BackgroundImage &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; parentControl.BackgroundImageLayout &amp;lt;&amp;gt; _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ImageLayout.Stretch &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;span style="color:blue;"&gt;Return&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;SOURCE RECTANGLE IS THE CLIPPED REGION&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;OF THE FORMS BACKGROUND IMAGE&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:#000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;THAT IS BEHIND THE TABPAGE. CLIPPING ALLOWS &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:#000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;US TO THEN PASTE THE COVERED PART&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:#000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;OF THE FORM BACKGROUND IMAGE ONTO&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;THE LISTVIEW BACKGROUND TO MIMIC TRANSPARENCY&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; srcRect &lt;span style="color:blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If&lt;/span&gt; _backgroundImageSource = _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ITranslucentControl.eBackgroundImageSource.Form &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; srcRect = &lt;span style="color:blue;"&gt;New&lt;/span&gt; Rectangle(GetPointFromForm(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;), &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Size)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; srcRect = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Bounds&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IMAGE WITH THE CURRENT CLIENT SIZE OF THE BACKGROUND&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; mySourceImage &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Bitmap(parentControl.BackgroundImage, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parentControl.ClientSize.Width, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parentControl.ClientSize.Height)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;BLANK IMAGE WE WANT TO DRAW THE &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:green;"&gt;&lt;span style="color:#000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;SECTION TO THAT WE WILL DISPLAY IN THE LISTVIEW&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; myButtonImage &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Bitmap(srcRect.Width, srcRect.Height)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;CREATE A GRAPHICS OBJECT FROM THE IMAGE&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; g &lt;span style="color:blue;"&gt;As&lt;/span&gt; Graphics = Graphics.FromImage(myButtonImage)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;IMAGE ATTRIBUTES SO WE CAN SET GAMMA (TO MAKE IMAGE LIGHTER)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; image_attr &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Drawing.Imaging.ImageAttributes&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image_attr.SetGamma(_gamma)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;DRAW CROPPED AND LIGHTENED IMAGE TO &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;THE GRAPHICS OBJECT (WRITES TO myListViewImage OBJECT)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawImage(mySourceImage, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.ClientRectangle, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (srcRect.X + _Offset.X), _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (srcRect.Y + _Offset.Y), _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; srcRect.Width, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; srcRect.Height, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; GraphicsUnit.Pixel, _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image_attr)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image_attr.Dispose()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.Dispose()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image_attr = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;BEFORE WE SET THE BACKGROUND IMAGE, SET THE BYPASS FLAG&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;&amp;#39;SO WE DONT GET STUCK IN A PAINTING LOOP&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _bypassPainting = &lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.BackgroundImageLayout = ImageLayout.None&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.BackgroundImage = myButtonImage&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There is one other method we use for support here, and it gets the location of the button in relation to the form when the button is not directly on the form (it is in a container or multiple containers on the form)&lt;/p&gt;
&lt;div style="font-size:11pt;background:#f9f9f9;color:black;font-family:Courier New;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#Region&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;SUPPORT METHODS&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetPointFromForm(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; C &lt;span style="color:blue;"&gt;As&lt;/span&gt; Control) &lt;span style="color:blue;"&gt;As&lt;/span&gt; Point&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; C.FindForm.PointToClient( _&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C.Parent.PointToScreen(C.Location))&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Point(0, 0)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;#End&lt;/span&gt; &lt;span style="color:blue;"&gt;Region&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="COLOR:blue;"&gt;&lt;span style="color:#000000;"&gt;So that is it. Above is all the code you need to get this working, and you can find the source code attached to this post. It was written in Visual Studio 2008, however for maximum compatibility, it is targeting the .NET 2.0 framework since this doesn&amp;#39;t use any 3.x exclusive features. That also means you could copy/paste this code into Visual Studio 2005 and it would also work.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:blue;"&gt;&lt;span style="color:#000000;"&gt;One last note I want to touch on again, is that this is just a proof of concept, and has not been fully tested on all operating systems and under various different settings and configurations you may have on your WinForm. That being said, most likely you can modify this code to meet your needs.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:blue;"&gt;&lt;span style="color:#000000;"&gt;Next time I will show you how to do this same thing, but with specific container controls, such as the GroupBox, Panel, and TabControl. I also have done this with the label control. The label support transparent backgrounds right out of the box, however adding my method adds the ability for the frosted effect, as well as the ability to target a parent form, instead of just the label container.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:blue;"&gt;&lt;span style="color:#000000;"&gt;As always, send me your comments or code improvements if you happen to find any.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://zerosandtheone.com/aggbug.aspx?PostID=4" width="1" height="1"&gt;</description><enclosure url="http://zerosandtheone.com/media/p/24.aspx" length="18033" type="text/html; charset=utf-8" /><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/WinForms/default.aspx">WinForms</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/Custom+Controls/default.aspx">Custom Controls</category><category domain="http://zerosandtheone.com/blogs/vb/archive/tags/VB.NET/default.aspx">VB.NET</category></item></channel></rss>