October 2014

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  










« A simple taxonomy of programming languages | Main | Initialization code in your F# AutoCAD application »

March 20, 2008

Implementing your own AutoCAD color combobox control using .NET

A big thanks to Scott McFarlane, from Geotropix, Inc., for sharing the code in this post. Here's an email I received from Scott:

I was reading this blog entry on “Through the Interface” and some folks were asking about how to implement .NET combo box versions of the color and linetype ActiveX controls that are available. I just wanted to share a simple .NET implementation of a color combo box. The color combo is quite easy, really. The linetype one would be more difficult.

Attached is the source code. This is just a generic color combo, that loads up with the 255 ACI colors. It has no dependency on AutoCAD – I was actually using this in an external program. It would be easy, however, to modify this to provide a list item to launch the built-in AutoCAD color dialog if used inside AutoCAD.

Here is the C# code Scott provided (which was in a source file named AcColorComboBox.cs):

using System;

using System.Collections;

using System.Drawing;

using System.Windows.Forms;


public class AcColorComboBox : ComboBox

{

  public class ColorItem

  {

    private short _colorIndex;

    private Color _color;


    public ColorItem(short colorIndex, Color color)

    {

      _colorIndex = colorIndex;

      _color = color;

    }


    public short ColorIndex

    {

      get { return _colorIndex; }

    }


    public Color Color

    {

      get { return _color; }

    }


    public override string ToString()

    {

      return AcColorComboBox.ColorNameOf(_colorIndex);

    }


  }


  public class ColorItemSorter : IComparer

  {

    public int Compare(object x, object y)

    {

      return ((ColorItem)x).ColorIndex - ((ColorItem)y).ColorIndex;

    }

  }


  private short _colorIndex;


  #region " Windows Form Designer generated code "


  public AcColorComboBox()

    : base()

  {

    // This call is required by the Windows Form Designer.

    InitializeComponent();


    // Add any initialization after the InitializeComponent() call

    DrawMode = DrawMode.OwnerDrawFixed;

    DropDownStyle = ComboBoxStyle.DropDownList;

  }


  // Override dispose to clean up the component list.

  protected override void Dispose(bool disposing)

  {

    if (disposing)

    {

      if ((components != null))

      {

        components.Dispose();

      }

    }

    base.Dispose(disposing);

  }


  // Required by the Windows Form Designer

  private System.ComponentModel.IContainer components;


  // NOTE: The following procedure is required by the Windows Form Designer

  // It can be modified using the Windows Form Designer.

  // Do not modify it using the code editor.

  [System.Diagnostics.DebuggerStepThrough()]

  private void InitializeComponent()

  {

    components = new System.ComponentModel.Container();

  }


  #endregion


  protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)

  {

    if (e.Index >= 0)

    {

      e.DrawBackground();

      e.DrawFocusRectangle();

      Rectangle r = e.Bounds;

      r.Inflate(-1, -1);

      r.Width = 20;

      r.Offset(1, 0);

      ColorItem objColor = (ColorItem)Items[e.Index];

      e.Graphics.FillRectangle(new System.Drawing.SolidBrush(objColor.Color), r);

      e.Graphics.DrawRectangle(new System.Drawing.Pen(Color.Black), r);

      e.Graphics.DrawString(objColor.ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds.X + r.Width + 4, e.Bounds.Y);

    }

  }


  protected override void OnCreateControl()

  {

    Items.Clear();

    for (short i = 1; i < 256; i++)

      Items.Add(new ColorItem(i, ColorOf(i)));


    base.OnCreateControl();

  }


  // ColorValue represents colorId

  public short ColorIndex

  {

    get { return _colorIndex; }

    set

    {

      _colorIndex = value;

      foreach (ColorItem objColor in Items)

      {

        if (objColor.ColorIndex == value)

        {

          SelectedItem = objColor;

          break;

        }

      }

    }

  }


  protected override void OnSelectedIndexChanged(System.EventArgs e)

  {

    _colorIndex = ((ColorItem)Items[SelectedIndex]).ColorIndex;

    base.OnSelectedIndexChanged(e);

  }


  public static string ColorNameOf(short colorIndex)

  {

    switch (colorIndex)

    {

      case 1:

        return "1 - Red";

      case 2:

        return "2 - Yellow";

      case 3:

        return "3 - Green";

      case 4:

        return "4 - Cyan";

      case 5:

        return "5 - Blue";

      case 6:

        return "6 - Magenta";

      case 7:

        return "7 - White";

      case 8:

        return "8 - Grey";

      default:

        return colorIndex.ToString();

    }

  }


  public static Color ColorOf(short colorIndex)

  {

    switch (colorIndex)

    {

      case 1:

        return Color.FromArgb(255, 0, 0);

      case 2:

        return Color.FromArgb(255, 255, 0);

      case 3:

        return Color.FromArgb(0, 255, 0);

      case 4:

        return Color.FromArgb(0, 255, 255);

      case 5:

        return Color.FromArgb(0, 0, 255);

      case 6:

        return Color.FromArgb(255, 0, 255);

      case 7:

        return Color.FromArgb(255, 255, 255);

      case 8:

        return Color.FromArgb(128, 128, 128);

      case 9:

        return Color.FromArgb(192, 192, 192);

      case 10:

        return Color.FromArgb(255, 0, 0);

      case 11:

        return Color.FromArgb(255, 127, 127);

      case 12:

        return Color.FromArgb(204, 0, 0);

      case 13:

        return Color.FromArgb(204, 102, 102);

      case 14:

        return Color.FromArgb(153, 0, 0);

      case 15:

        return Color.FromArgb(153, 76, 76);

      case 16:

        return Color.FromArgb(127, 0, 0);

      case 17:

        return Color.FromArgb(127, 63, 63);

      case 18:

        return Color.FromArgb(76, 0, 0);

      case 19:

        return Color.FromArgb(76, 38, 38);

      case 20:

        return Color.FromArgb(255, 63, 0);

      case 21:

        return Color.FromArgb(255, 159, 127);

      case 22:

        return Color.FromArgb(204, 51, 0);

      case 23:

        return Color.FromArgb(204, 127, 102);

      case 24:

        return Color.FromArgb(153, 38, 0);

      case 25:

        return Color.FromArgb(153, 95, 76);

      case 26:

        return Color.FromArgb(127, 31, 0);

      case 27:

        return Color.FromArgb(127, 79, 63);

      case 28:

        return Color.FromArgb(76, 19, 0);

      case 29:

        return Color.FromArgb(76, 47, 38);

      case 30:

        return Color.FromArgb(255, 127, 0);

      case 31:

        return Color.FromArgb(255, 191, 127);

      case 32:

        return Color.FromArgb(204, 102, 0);

      case 33:

        return Color.FromArgb(204, 153, 102);

      case 34:

        return Color.FromArgb(153, 76, 0);

      case 35:

        return Color.FromArgb(153, 114, 76);

      case 36:

        return Color.FromArgb(127, 63, 0);

      case 37:

        return Color.FromArgb(127, 95, 63);

      case 38:

        return Color.FromArgb(76, 38, 0);

      case 39:

        return Color.FromArgb(76, 57, 38);

      case 40:

        return Color.FromArgb(255, 191, 0);

      case 41:

        return Color.FromArgb(255, 223, 127);

      case 42:

        return Color.FromArgb(204, 153, 0);

      case 43:

        return Color.FromArgb(204, 178, 102);

      case 44:

        return Color.FromArgb(153, 114, 0);

      case 45:

        return Color.FromArgb(153, 133, 76);

      case 46:

        return Color.FromArgb(127, 95, 0);

      case 47:

        return Color.FromArgb(127, 111, 63);

      case 48:

        return Color.FromArgb(76, 57, 0);

      case 49:

        return Color.FromArgb(76, 66, 38);

      case 50:

        return Color.FromArgb(255, 255, 0);

      case 51:

        return Color.FromArgb(255, 255, 127);

      case 52:

        return Color.FromArgb(204, 204, 0);

      case 53:

        return Color.FromArgb(204, 204, 102);

      case 54:

        return Color.FromArgb(153, 153, 0);

      case 55:

        return Color.FromArgb(153, 153, 76);

      case 56:

        return Color.FromArgb(127, 127, 0);

      case 57:

        return Color.FromArgb(127, 127, 63);

      case 58:

        return Color.FromArgb(76, 76, 0);

      case 59:

        return Color.FromArgb(76, 76, 38);

      case 60:

        return Color.FromArgb(191, 255, 0);

      case 61:

        return Color.FromArgb(223, 255, 127);

      case 62:

        return Color.FromArgb(153, 204, 0);

      case 63:

        return Color.FromArgb(178, 204, 102);

      case 64:

        return Color.FromArgb(114, 153, 0);

      case 65:

        return Color.FromArgb(133, 153, 76);

      case 66:

        return Color.FromArgb(95, 127, 0);

      case 67:

        return Color.FromArgb(111, 127, 63);

      case 68:

        return Color.FromArgb(57, 76, 0);

      case 69:

        return Color.FromArgb(66, 76, 38);

      case 70:

        return Color.FromArgb(127, 255, 0);

      case 71:

        return Color.FromArgb(191, 255, 127);

      case 72:

        return Color.FromArgb(102, 204, 0);

      case 73:

        return Color.FromArgb(153, 204, 102);

      case 74:

        return Color.FromArgb(76, 153, 0);

      case 75:

        return Color.FromArgb(114, 153, 76);

      case 76:

        return Color.FromArgb(63, 127, 0);

      case 77:

        return Color.FromArgb(95, 127, 63);

      case 78:

        return Color.FromArgb(38, 76, 0);

      case 79:

        return Color.FromArgb(57, 76, 38);

      case 80:

        return Color.FromArgb(63, 255, 0);

      case 81:

        return Color.FromArgb(159, 255, 127);

      case 82:

        return Color.FromArgb(51, 204, 0);

      case 83:

        return Color.FromArgb(127, 204, 102);

      case 84:

        return Color.FromArgb(38, 153, 0);

      case 85:

        return Color.FromArgb(95, 153, 76);

      case 86:

        return Color.FromArgb(31, 127, 0);

      case 87:

        return Color.FromArgb(79, 127, 63);

      case 88:

        return Color.FromArgb(19, 76, 0);

      case 89:

        return Color.FromArgb(47, 76, 38);

      case 90:

        return Color.FromArgb(0, 255, 0);

      case 91:

        return Color.FromArgb(127, 255, 127);

      case 92:

        return Color.FromArgb(0, 204, 0);

      case 93:

        return Color.FromArgb(102, 204, 102);

      case 94:

        return Color.FromArgb(0, 153, 0);

      case 95:

        return Color.FromArgb(76, 153, 76);

      case 96:

        return Color.FromArgb(0, 127, 0);

      case 97:

        return Color.FromArgb(63, 127, 63);

      case 98:

        return Color.FromArgb(0, 76, 0);

      case 99:

        return Color.FromArgb(38, 76, 38);

      case 100:

        return Color.FromArgb(0, 255, 63);

      case 101:

        return Color.FromArgb(127, 255, 159);

      case 102:

        return Color.FromArgb(0, 204, 51);

      case 103:

        return Color.FromArgb(102, 204, 127);

      case 104:

        return Color.FromArgb(0, 153, 38);

      case 105:

        return Color.FromArgb(76, 153, 95);

      case 106:

        return Color.FromArgb(0, 127, 31);

      case 107:

        return Color.FromArgb(63, 127, 79);

      case 108:

        return Color.FromArgb(0, 76, 19);

      case 109:

        return Color.FromArgb(38, 76, 47);

      case 110:

        return Color.FromArgb(0, 255, 127);

      case 111:

        return Color.FromArgb(127, 255, 191);

      case 112:

        return Color.FromArgb(0, 204, 102);

      case 113:

        return Color.FromArgb(102, 204, 153);

      case 114:

        return Color.FromArgb(0, 153, 76);

      case 115:

        return Color.FromArgb(76, 153, 114);

      case 116:

        return Color.FromArgb(0, 127, 63);

      case 117:

        return Color.FromArgb(63, 127, 95);

      case 118:

        return Color.FromArgb(0, 76, 38);

      case 119:

        return Color.FromArgb(38, 76, 57);

      case 120:

        return Color.FromArgb(0, 255, 191);

      case 121:

        return Color.FromArgb(127, 255, 223);

      case 122:

        return Color.FromArgb(0, 204, 153);

      case 123:

        return Color.FromArgb(102, 204, 178);

      case 124:

        return Color.FromArgb(0, 153, 114);

      case 125:

        return Color.FromArgb(76, 153, 133);

      case 126:

        return Color.FromArgb(0, 127, 95);

      case 127:

        return Color.FromArgb(63, 127, 111);

      case 128:

        return Color.FromArgb(0, 76, 57);

      case 129:

        return Color.FromArgb(38, 76, 66);

      case 130:

        return Color.FromArgb(0, 255, 255);

      case 131:

        return Color.FromArgb(127, 255, 255);

      case 132:

        return Color.FromArgb(0, 204, 204);

      case 133:

        return Color.FromArgb(102, 204, 204);

      case 134:

        return Color.FromArgb(0, 153, 153);

      case 135:

        return Color.FromArgb(76, 153, 153);

      case 136:

        return Color.FromArgb(0, 127, 127);

      case 137:

        return Color.FromArgb(63, 127, 127);

      case 138:

        return Color.FromArgb(0, 76, 76);

      case 139:

        return Color.FromArgb(38, 76, 76);

      case 140:

        return Color.FromArgb(0, 191, 255);

      case 141:

        return Color.FromArgb(127, 223, 255);

      case 142:

        return Color.FromArgb(0, 153, 204);

      case 143:

        return Color.FromArgb(102, 178, 204);

      case 144:

        return Color.FromArgb(0, 114, 153);

      case 145:

        return Color.FromArgb(76, 133, 153);

      case 146:

        return Color.FromArgb(0, 95, 127);

      case 147:

        return Color.FromArgb(63, 111, 127);

      case 148:

        return Color.FromArgb(0, 57, 76);

      case 149:

        return Color.FromArgb(38, 66, 76);

      case 150:

        return Color.FromArgb(0, 127, 255);

      case 151:

        return Color.FromArgb(127, 191, 255);

      case 152:

        return Color.FromArgb(0, 102, 204);

      case 153:

        return Color.FromArgb(102, 153, 204);

      case 154:

        return Color.FromArgb(0, 76, 153);

      case 155:

        return Color.FromArgb(76, 114, 153);

      case 156:

        return Color.FromArgb(0, 63, 127);

      case 157:

        return Color.FromArgb(63, 95, 127);

      case 158:

        return Color.FromArgb(0, 38, 76);

      case 159:

        return Color.FromArgb(38, 57, 76);

      case 160:

        return Color.FromArgb(0, 63, 255);

      case 161:

        return Color.FromArgb(127, 159, 255);

      case 162:

        return Color.FromArgb(0, 51, 204);

      case 163:

        return Color.FromArgb(102, 127, 204);

      case 164:

        return Color.FromArgb(0, 38, 153);

      case 165:

        return Color.FromArgb(76, 95, 153);

      case 166:

        return Color.FromArgb(0, 31, 127);

      case 167:

        return Color.FromArgb(63, 79, 127);

      case 168:

        return Color.FromArgb(0, 19, 76);

      case 169:

        return Color.FromArgb(38, 47, 76);

      case 170:

        return Color.FromArgb(0, 0, 255);

      case 171:

        return Color.FromArgb(127, 127, 255);

      case 172:

        return Color.FromArgb(0, 0, 204);

      case 173:

        return Color.FromArgb(102, 102, 204);

      case 174:

        return Color.FromArgb(0, 0, 153);

      case 175:

        return Color.FromArgb(76, 76, 153);

      case 176:

        return Color.FromArgb(0, 0, 127);

      case 177:

        return Color.FromArgb(63, 63, 127);

      case 178:

        return Color.FromArgb(0, 0, 76);

      case 179:

        return Color.FromArgb(38, 38, 76);

      case 180:

        return Color.FromArgb(63, 0, 255);

      case 181:

        return Color.FromArgb(159, 127, 255);

      case 182:

        return Color.FromArgb(51, 0, 204);

      case 183:

        return Color.FromArgb(127, 102, 204);

      case 184:

        return Color.FromArgb(38, 0, 153);

      case 185:

        return Color.FromArgb(95, 76, 153);

      case 186:

        return Color.FromArgb(31, 0, 127);

      case 187:

        return Color.FromArgb(79, 63, 127);

      case 188:

        return Color.FromArgb(19, 0, 76);

      case 189:

        return Color.FromArgb(47, 38, 76);

      case 190:

        return Color.FromArgb(127, 0, 255);

      case 191:

        return Color.FromArgb(191, 127, 255);

      case 192:

        return Color.FromArgb(102, 0, 204);

      case 193:

        return Color.FromArgb(153, 102, 204);

      case 194:

        return Color.FromArgb(76, 0, 153);

      case 195:

        return Color.FromArgb(114, 76, 153);

      case 196:

        return Color.FromArgb(63, 0, 127);

      case 197:

        return Color.FromArgb(95, 63, 127);

      case 198:

        return Color.FromArgb(38, 0, 76);

      case 199:

        return Color.FromArgb(57, 38, 76);

      case 200:

        return Color.FromArgb(191, 0, 255);

      case 201:

        return Color.FromArgb(223, 127, 255);

      case 202:

        return Color.FromArgb(153, 0, 204);

      case 203:

        return Color.FromArgb(178, 102, 204);

      case 204:

        return Color.FromArgb(114, 0, 153);

      case 205:

        return Color.FromArgb(133, 76, 153);

      case 206:

        return Color.FromArgb(95, 0, 127);

      case 207:

        return Color.FromArgb(111, 63, 127);

      case 208:

        return Color.FromArgb(57, 0, 76);

      case 209:

        return Color.FromArgb(66, 38, 76);

      case 210:

        return Color.FromArgb(255, 0, 255);

      case 211:

        return Color.FromArgb(255, 127, 255);

      case 212:

        return Color.FromArgb(204, 0, 204);

      case 213:

        return Color.FromArgb(204, 102, 204);

      case 214:

        return Color.FromArgb(153, 0, 153);

      case 215:

        return Color.FromArgb(153, 76, 153);

      case 216:

        return Color.FromArgb(127, 0, 127);

      case 217:

        return Color.FromArgb(127, 63, 127);

      case 218:

        return Color.FromArgb(76, 0, 76);

      case 219:

        return Color.FromArgb(76, 38, 76);

      case 220:

        return Color.FromArgb(255, 0, 191);

      case 221:

        return Color.FromArgb(255, 127, 223);

      case 222:

        return Color.FromArgb(204, 0, 153);

      case 223:

        return Color.FromArgb(204, 102, 178);

      case 224:

        return Color.FromArgb(153, 0, 114);

      case 225:

        return Color.FromArgb(153, 76, 133);

      case 226:

        return Color.FromArgb(127, 0, 95);

      case 227:

        return Color.FromArgb(127, 63, 111);

      case 228:

        return Color.FromArgb(76, 0, 57);

      case 229:

        return Color.FromArgb(76, 38, 66);

      case 230:

        return Color.FromArgb(255, 0, 127);

      case 231:

        return Color.FromArgb(255, 127, 191);

      case 232:

        return Color.FromArgb(204, 0, 102);

      case 233:

        return Color.FromArgb(204, 102, 153);

      case 234:

        return Color.FromArgb(153, 0, 76);

      case 235:

        return Color.FromArgb(153, 76, 114);

      case 236:

        return Color.FromArgb(127, 0, 63);

      case 237:

        return Color.FromArgb(127, 63, 95);

      case 238:

        return Color.FromArgb(76, 0, 38);

      case 239:

        return Color.FromArgb(76, 38, 57);

      case 240:

        return Color.FromArgb(255, 0, 63);

      case 241:

        return Color.FromArgb(255, 127, 159);

      case 242:

        return Color.FromArgb(204, 0, 51);

      case 243:

        return Color.FromArgb(204, 102, 127);

      case 244:

        return Color.FromArgb(153, 0, 38);

      case 245:

        return Color.FromArgb(153, 76, 95);

      case 246:

        return Color.FromArgb(127, 0, 31);

      case 247:

        return Color.FromArgb(127, 63, 79);

      case 248:

        return Color.FromArgb(76, 0, 19);

      case 249:

        return Color.FromArgb(76, 38, 47);

      case 250:

        return Color.FromArgb(51, 51, 51);

      case 251:

        return Color.FromArgb(91, 91, 91);

      case 252:

        return Color.FromArgb(132, 132, 132);

      case 253:

        return Color.FromArgb(173, 173, 173);

      case 254:

        return Color.FromArgb(214, 214, 214);

      case 255:

        return Color.FromArgb(255, 255, 255);

      default:

        throw new ArgumentOutOfRangeException();

    }

  }

}

Thanks again, Scott. I'll be back with a post of my own after the long Easter weekend here in Switzerland.

TrackBack

TrackBack URL for this entry:
http://www.typepad.com/services/trackback/6a00d83452464869e200e5513c3be38833

Listed below are links to weblogs that reference Implementing your own AutoCAD color combobox control using .NET:

blog comments powered by Disqus

Feed/Share

10 Random Posts