Click here to Skip to main content
15,887,683 members
Articles / Programming Languages / C#

The Razor Framework :: Part 1 :: Plugins/Extensibility

Rate me:
Please Sign up or sign in to vote.
4.93/5 (127 votes)
11 Mar 2005CPOL36 min read 351K   1.4K   446  
An extensible dependency based plugin framework for .NET Applications.
<?xml version="1.0" encoding="utf-8"?>
<root>
  <!-- 
    Microsoft ResX Schema 
    
    Version 1.3
    
    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types.
    
    Example:
    
    ... ado.net/XML headers & schema ...
    <resheader name="resmimetype">text/microsoft-resx</resheader>
    <resheader name="version">1.3</resheader>
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    <data name="Name1">this is my long string</data>
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
        [base64 mime encoded serialized .NET Framework object]
    </data>
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
        [base64 mime encoded string representing a byte array form of the .NET Framework object]
    </data>
                
    There are any number of "resheader" rows that contain simple 
    name/value pairs.
    
    Each data row contains a name, and value. The row also contains a 
    type or mimetype. Type corresponds to a .NET class that support 
    text/value conversion through the TypeConverter architecture. 
    Classes that don't support this are serialized and stored with the 
    mimetype set.
    
    The mimetype is used forserialized objects, and tells the 
    ResXResourceReader how to depersist the object. This is currently not 
    extensible. For a given mimetype the value must be set accordingly:
    
    Note - application/x-microsoft.net.object.binary.base64 is the format 
    that the ResXResourceWriter will generate, however the reader can 
    read any of the formats listed below.
    
    mimetype: application/x-microsoft.net.object.binary.base64
    value   : The object must be serialized with 
            : System.Serialization.Formatters.Binary.BinaryFormatter
            : and then encoded with base64 encoding.
    
    mimetype: application/x-microsoft.net.object.soap.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.bytearray.base64
    value   : The object must be serialized into a byte array 
            : using a System.ComponentModel.TypeConverter
            : and then encoded with base64 encoding.
    -->
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>1.3</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="_buttonCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </data>
  <data name="_buttonCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_buttonCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_buttonOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </data>
  <data name="_buttonOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_buttonOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_treeView.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_treeView.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_treeView.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </data>
  <data name="_labelInstructions.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </data>
  <data name="_labelInstructions.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_labelInstructions.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_imageList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_imageList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
  <data name="_imageList.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>17, 17</value>
  </data>
  <data name="_imageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuNTAw
        MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT
        eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA
        AADMDwAAAk1TRnQBSQFMAgEBAwEAAQUBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgD
        AAFAAwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8APgABjwFNAUMB
        /wGPAU0BQwH/AY8BTQFDAf8BjwFNAUMB/wGPAU0BQwH/AY8BTQFDAf8UAAGEAoAB/wGEAoAB/wGEAoAB
        /wGEAoAB/xQAAYQCgAH/AYQCgAH/AYQCgAH/AYQCgAH/HAABcwFJAVoB/wFzAUkBWgH/AXMBSQFaAf8B
        cwFJAVoB/wFzAUkBWgH/AXMBSQFaAf9oAAGPAU0BQwH/AZ8BgAGFAf8BygK3Af8ByQKzAf8BxwKsAf8B
        vQKWAf8BlAFoAW4B/wFcASgBNwH/DAABhAKAAf8BtgKlAf8BtgKlAf8BdwJiAf8DcAH/AYQCgAH/DAAB
        hAKAAf8BtgKlAf8BtgKlAf8BdwJiAf8DcAH/AYQCgAH/FAABnAF1AXMB/wHGAa4BrQH/Ac4BsgG1Af8B
        xgGuAa0B/wG9AZ4BnAH/AZwBbQFrAf8BcwFJAVoB/wFzAUkBWgH/YAABwwGBAWcB/wHcAtkB/wPjAf8B
        3wLeAf8B2wLVAf8B1gLBAf8B3ALXAf8BwAKnAf8BwwKYAf8BdQFBAUwB/wQAAYQCgAH/AdIBtwG2Af8B
        wQGjAaEB/wHBAaMBoQH/AboBmQGYAf8BggJuAf8BhAKAAf8IAAGEAoAB/wHSAbcBtgH/AcEBowGhAf8B
        wQGjAaEB/wG6AZkBmAH/AYICbgH/AYQCgAH/EAABzgGiAZwB/wPnAf8B5wHbAd4B/wHeAdcB1gH/AdYB
        vgG9Af8BvQGmAaUB/wGlAW0BawH/Ab0BjgGMAf8BcwFJAVoB/2AAAcsBrgGrAf8D7QH/A/IB/wPrAf8B
        3gLcAf8B2ALCAf8B0wK0Af8BzAKoAf8BwQKWAf8BoQFwAXUB/wQAAYQCgAH/A+wB/wHrAuEB/wHQAr0B
        /wHEApgB/wGpAocB/wwAAYQCgAH/A+wB/wHrAuEB/wHQAr0B/wHEApgB/wGpAocB/xQAAdYBngGcAf8B
        9wHzAfcB/wPvAf8B3gHfAd4B/wHWAcMBxgH/Ab0BjgGMAf8BlAFZAVIB/wG1AYIBhAH/AXMBSQFaAf9g
        AAHPAZkBhQH/A/EB/wHsAtkB/wPuAf8B3gLaAf8B1QKyAf8BzQKOAf8BzAKMAf8BwQKPAf8BowFqAWgB
        /wgAAYQCgAH/AdMBqwGpAf8BzQKUAf8BuAF5AXQB/wFZAlMB/xAAAdIBowGZAf8B0wGrAakB/wHNApQB
        /wG4AXkBdAH/AV0CXAH/GAAB1gGiAZQB/wH3AfMB9wH/AecB4wHnAf8B1gG2AbUB/wGlAWUBYwH/AbUB
        TQFKAf8BtQGCAYQB/wFzAUkBWgH/YAABqQFRATIB/wHDAY0BgAH/AdYBpAGbAf8B2wKzAf8B0QKnAf8B
        zwKSAf8BzAJwAf8BzAJwAf8BhAFNAVUB/wGpAVEBMgH/BAAB0gG3AbYB/wHdAZsBdAH/Ae4BoQFFAf8B
        5wGwAW0B/wHdAZsBdAH/AZYBZwFmAf8BXQJcAf8BXQJcAf8BXQJcAf8BXQJcAf8B3QGbAXQB/wHuAaEB
        RQH/AecBsAFtAf8B3QGbAXQB/wGDAlkB/wN8Af8UAAHOAY4BjAH/Ad4BtgG1Af8B1gGiAaUB/wHOAY4B
        jAH/AYwBUQFKAf8BhAFFAUIB/wFzAUkBWgH/XAABbQEnARUB/wFbARoBEwH/AVcBFgETAf8BfwFJAU8B
        /wHsAaEBSQH/Af4BsQE4Af8B9QHFAYsB/wHeAaoBmgH/AckCdwH/Ab0CWgH/AVIBHQEtAf8IAAHOAqQB
        /wHZAb0BkgL/Ab4BTAL/AcgBXQL/AcgBXQH/AdMBgQFnAf8DJgH/AS4BdQG0Af8BLgF1AbQB/wMmAf8B
        2QG9AZIC/wG+AUwC/wHIAV0C/wHIAV0B/wHTAYEBZwH/A3AB/xQAAd4BpgFzAv8BsgEpAf8B7wHDAXsB
        /wHeAaoBrQH/AcYBbQFrAf8BtQFNAUoB/wFzAUkBWgH/AXMBSQFaAf9QAAG6AV0BKQH/AbcBVwEiAf8B
        rAFdATwB/wGwAVkBOAH/AcABWgE7Af8BywGRAYYB/wHxAacBPgL/AbMBNQL/AbYBOgL/AbYBPAH/AfYB
        uwFnAf8B4gGoAYEB/wGyAXABdAH/AY8BTQFDAf8EAAHOAqQB/wHYAb0BpAL/AdsBggL/AeIBkwL/Ad0B
        iAH/Ad0BmwF0Af8DjwH/AUUBsQHoAf8BRQGxAegB/wGEAoAB/wHYAb0BpAL/AdsBggL/AeIBkwL/Ad0B
        iAH/Ad0BmwF0Af8DcAH/EAABxgGiAYQB/wHvAa4BUgL/Aa4BOQL/AbYBOQL/AbYBOQH/AfcBwwFrAf8B
        1gGiAZQB/wGtAW0BawH/AXMBSQFaAf8BcwFJAVoB/0gAAdYBdQE0Af8BqgFIAQ4B/wGkAT4BAwH/AYgB
        SwEFAf8BQgFcAQ0B/wGkAT4BAQH/AcoBowGgAv8BuwFEAv8BvwFNAv8BwgFTAv8BwwFUAv8BwgFSAv8B
        vgFMAf8B/AG4AUgB/wGPAU0BQwH/BAABzgKkAf8B2AG9AaQB/wHzAd8BoAL/Ae8BqwL/AewBpAH/AecB
        sAFtAf8EAAHNAsIB/wMmAf8BzgKkAf8B2AG9AaQB/wHzAd8BoAL/Ae8BqwL/AewBpAH/AecBsAFtAf8D
        lAH/EAABzgGWAZQB/wHvAa4BUgL/Ab4BSgL/AcMBUgL/AcMBUgL/AcMBUgL/Ab4BSgL/AbYBSgH/Ad4B
        lgFaAf8BcwFJAVoB/0gAAcgBbQEmAf8BsQFLAQAB/wG/AVkBAAH/AXsBagEAAf8BAAF3AQAB/wFoAWoB
        EQH/AeIBvgGiAv8BxgFaAv8BywFkAv8BzgFrAv8BzwFsAv8BzgFqAv8BygFiAv8BxAFXAf8BjwFNAUMB
        /wQAAc4CpAH/Ac4CpAH/Ac4CpAH/Ac4CpAH/Ac4CpAH/AdYBogGDAf8EAAHJAbwBuAH/AyYB/wHOAqQB
        /wHOAqQB/wHOAqQB/wHOAqQB/wHOAqQB/wHWAaIBgwH/FAABzgGqAa0C/wHDAVIC/wHLAWMC/wHPAWsC
        /wHPAWsC/wHPAWsC/wHLAWMC/wHDAUoB/wHeAZYBWgH/AXMBSQFaAf9IAAHJAXMBIAH/AcsBZQEAAf8B
        zgF4AQAB/wFGAYwBAgH/AR8BjgEBAf8BrgGTAUQB/wHnAcMBlgL/AdABbgL/AdYBewL/AdoBgwL/AdsB
        hQL/AdoBggL/AdUBeQL/Ac8BbAH/AY8BTQFDAf8cAANwAf8BvAG7AbgB/wMmAf8BTwJMAf8DcAH/A3AB
        /xwAAcYBqgGcAf8B3gG+Ab0C/wHTAWsC/wHXAXMC/wHbAYQC/wHbAYQC/wHbAYQC/wHXAXsC/wHPAWsB
        /wHOAX0BawH/AXMBSQFaAf9IAAHXAYUBKAH/AakBggEGAf8BHgGnASAB/wEkAa4BKwH/AeABpQEaAf8B
        5gG5AYQB/wHrAcgBjAL/AdkBgQL/AeEBkQL/AeYBmwL/AegBnwL/AeYBmgL/AeABjgL/AdcBfQH/Aa0B
        bwFcAf8YAAHSAbcBtgH/Ad0BmwF0Af8B7gGhAUUB/wHnAbABbQH/Ad0BmwF0Af8BgwJZAf8DfAH/HAAB
        zgGiAZwB/wH3AcsBnAL/AdcBewL/Ad8BjAL/AecBnAL/AecBnAL/AecBnAL/AeMBjAL/AdcBewH/Aa0B
        ZQFjAf8BcwFJAVoB/0gAAeEBkgEyAf8BaAGhASMB/wEtAcQBVgH/AT0BzQFpAf8BngHRAXAB/wHiAdQB
        xQH/Ae0BygGAAv8B4QGQAv8B6gGjAv8B8gGyAv8B9QG3Av8B8QGwAv8B6QGgAv8B3wGMAf8BggFEAU4B
        /xgAAc4CpAH/AdkBvQGSAv8BvgFMAv8ByAFdAv8ByAFdAf8B0wGBAWcB/wNwAf8cAAHGAaoBnAH/AfcB
        1wGcAv8B3wGMAv8B6wGcAv8B8wGtAv8B8wG1Av8B8wGtAv8B6wGlAv8B3wGMAf8BjAFRAUoB/wFzAUkB
        WgH/SAAByAGiAVgB/wEmAb8BTAH/AV4B2wGDAf8BlAHrAaQB/wGpAeMBqgH/Ad8C3AH/AbYBpQGPAf8B
        ygG2AZUB/wHdAcwBpAH/Ae4B5gG6Av8B/gHLAv8B+gHCAv8B7wGtAf8B+gHdAZQB/wF5AT8BSgH/GAAB
        zgKkAf8B2AG9AaQC/wHbAYIC/wHiAZMC/wHdAYgB/wHdAZsBdAH/A3AB/xwAAc4BogGcAf8BtQGaAYwB
        /wHeAcsBnAH/AecBxwGcAv8B9wG9A/8BzgL/AfsBxgL/AfMBrQL/AecBlAH/AYQBRQFCAf8BcwFJAVoB
        /0wAAYEBuwFiAf8BcAHhAY8B/wGuAfUBuAH/AZUB6gGhAf8BfQHPAZUB/wG+AcsBowH/AeABxwGvAf8B
        ywK9Af8BxgKyAf8BvwGlAaIB/wHAAaUBlwH/AdYBuwGaAf8B2AGzAY0B/wFmAS4BOgH/GAABzgKkAf8B
        2AG9AaQB/wHzAd8BoAL/Ae8BqwL/AewBpAH/AecBsAFtAf8DlAH/HAAB1gGeAZwB/wHWAZ4BnAH/Ac4B
        ogGcAf8B1gGiAZQB/wHGAbIBtQH/AcYBqgGcAf8BzgGyAZQB/wHeAcsBnAH/Ac4BsgGUAf8BhAFFAUIB
        /wFzAUkBWgH/UAABxQG2AXQB/wGcAd8BlgH/AZIB2wGDAf8BXwHIAV4B/wGmAZsBMgH/AdcBdgEwAf8B
        zAFmATMB/wHGAXYBTwH/Ac8BiAFoAf8B1AGaAYQB/wHNAZ0BkAH/AcEBlgGTAf8BxwFrAUIB/xgAAc4C
        pAH/Ac4CpAH/Ac4CpAH/Ac4CpAH/Ac4CpAH/AdYBogGDAf8wAAHWAZ4BnAH/AdYBngGcAf8B1gGeAZwB
        /wHWAZ4BnAH/AcYBngGcAf8BxgGeAZwB/0wAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgAB
        ARYAA/+BAAH+AQcBwwHhAfwBDwIAAfwBAwGBAcAB+AEHAgAB+AIBAYAB8AEHAgAB+AEBAQMBgQHwAQcC
        AAH4AQEBgwHBAfgBBwIAAfgBAQIAAfgBDwIAAeABAwIAAfgBBwIAAYABAQIAAfABAwMAAQEBAgEAAfAB
        AwMAAQEBAgEBAfABAwMAAQEB/AEPAeABAwMAAQEB+AEPAeABAwMAAQEB+AEPAeABAwMAAQEB+AEPAeAB
        AwIAAYABAQH4AQ8B4AEDAgABwAEBAfgBHwH+AQcCAAs=
</value>
  </data>
  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </data>
  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>(Default)</value>
  </data>
  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </data>
  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </data>
  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>5, 5</value>
  </data>
  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>True</value>
  </data>
  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>80</value>
  </data>
  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>True</value>
  </data>
  <data name="$this.Name">
    <value>AddressBookDirectoryBrowseWindow</value>
  </data>
  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>Private</value>
  </data>
</root>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
Senior Application Developer specializing in Windows desktop and network development.

Professional Experience
- B.S. of Computer Science (Graduated 2001 - PSU)
- Senior Application Developer (8+ yrs)
- Microsoft Certified Professional

Primary Interests
- C#, C++, HTML, Javascript
- XML, ASP.NET, Web Services, SOAP, UDDI
- Socket programming and anything network related
- Reflection, Serialization, and Plugin Frameworks
- Owner-drawn controls and GDI+ goodness

Comments and Discussions