A megoldás kulcsa a ComboBox kontrol DrawItem eseményének kezelésében rejlik. A DrawItem esemény akkor keletkezik, amikor a ComboBox kontrol elemei kirajzolásra kerülnek. A képek megjelenítését ebbe a kódba ágyazzuk.
this.comboBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBox1_DrawItem);
A képeket egy ImageList kollekcióban helyezzük el. A képek fizikailag a projekt mappájának Icons alkönyvtárában találhatóak. A ComboBox kontrol elemeihez 4 darab képet tárolunk.
A DrawItem esemény kezelőmetódusában a második paraméter tartalmaz minden, az egyes elemek megjelenítéséhez szükséges információt. Tartalmazza az egyes elemek indexét, a befoglaló téglalap méreteit, stb.
A kezelőmetódusban a megjelenítendő kép számára létrehozunk egy Bitmap objektumot, az említett paraméter property-jeinek felhasználásával.
Bitmap bmp = new Bitmap(e.Bounds.Width,e.Bounds.Height,e.Graphics);
A rajzolást végző Graphics objektumot a kép alapján hozzuk létre.
Graphics g = Graphics.FromImage(bmp);
A Graphics objektum FillRectangle metódusának segítségével kitöltjük a kontrol tulajdonságlapján megadott – alapértelmezett esetben fehér - színnel az egyes elemek hátterét.
g.FillRectangle(new SolidBrush(e.BackColor), new Rectangle(0,0,bmp.Width,bmp.Height));
A ComboBox kontrol elemeit megadtuk a Tulajdonság-lap Items kollekciójában. A megjelenítendő elemeket a Graphics objektum DrawString metódusával írjuk a befoglaló téglalapba úgy, hogy a kontrol Items listájából a paraméter Index property-je segítségével megállapítjuk, hogy éppen melyik elem kirajzolása van folyamatban.
g.DrawString(comboBox1.Items[e.Index].ToString(),e.Font ,new SolidBrush(e.ForeColor), new Point(28,(bmp.Height-e.Font.Height)/2));
A többi beállítás a megadott adatokat veszi alapul. A következő lépésben az ImageList gyűjtemény adott indexű elemét jelenítjük meg a téglalap bal sarkában.
g.DrawImage(imageList1.Images[e.Index], new Rectangle(new Point(6,0),new Size(16,16)));
A sikeres rajzolás érdekében a paraméter objektum Graphics tagobjektumának DrawImage metódusát is meg kell hívni a függvény elején deklarált képobjektummal.
e.Graphics.DrawImage(bmp,e.Bounds.X,e.Bounds.Y);
Mindezekhez a kontrol bizonyos property-jeinek értékeit meg kell változtatni. Az ItemHeight tulajdonság értékét 16 pixel értékre kell változtatni, ha – mint jelen esetben is – egy 16 pixeles képet szeretnénk megjeleníteni.
A DrawMode property értékével adhatjuk meg, hogy milyen módszerrel történjen a ComboxBox kontrol elemeinek kirajzolása. Normal érték esetén egyes elemek rajzolása az operációs rendszer segítségével történik, és minden elem mérete azonos. OwnerDrawFixed érték esetén a rajzolás manuálisan történik, az elemek mérete azonos. Mi most ezt választjuk. Az OwnerDrawVariable érték esetén a manuálisan kirajzolt elemek mérete változó is lehet.
A DropDownStyle property értékét pedig DropDownList értékre kell állítanunk, hogy a felhasználó manuálisan ne szerkeszthesse a megjelenítendő szöveget, csak a nyílra kattintva listázhassa azokat.