
Pro výběr barev nám platforma .NEt nabízí dialog příhodně nazvaný ColorDialog. Někdy však nechcete spuštět celý dialog, ale stačila by vám nějaká menší komponenta čistě pro výběr barvy. Předkládám nástřel řešení, jak si vytvořit ComboBox, ve kterém budeme zobrazovat barvy. Jedná se čistě o ilustrační kód, proto jej neberte jako finální, a upravujte jej podle libosti. Budu rád, když mi sem hodíte Vaše vylepšené řešení.
using System;
using System.Drawing;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace HlavniKnihovna
{
public class cComboBoxBarvy : ComboBox
{
#region Promenne
private ArrayList vsechnyBarvy;
#endregion Promenne
#region Vlastnosti
private ArrayList VsechnyBarvy
{
get
{
if (this.vsechnyBarvy == null)
{
this.vsechnyBarvy = new ArrayList();
}
return vsechnyBarvy;
}
set { vsechnyBarvy = value; }
}
#endregion Vlastnosti
#region Konstruktory
public cComboBoxBarvy()
{
this.DrawItem += new DrawItemEventHandler(cComboBoxBarvy_DrawItem);
this.Items.Clear();
}
#endregion Konstruktory
#region Hlavni metody
private void cComboBoxBarvy_DrawItem(object sender, DrawItemEventArgs e)
{
Graphics g = e.Graphics;
// hranice obdelniku prave vykreslovane polozky
Rectangle r = e.Bounds;
if (e.Index >= 0)
{
// Vratime si stetec podle vykreslovane polozky
// (kazdy stetec ma jinou barvu)
SolidBrush b = (SolidBrush)VsechnyBarvy[e.Index];
// Vykreslime cerny obdelnik
e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black), 2), r);
// vyplnime prislusnou barvou podle stetce
e.Graphics.FillRectangle((SolidBrush)VsechnyBarvy[e.Index], r);
e.DrawFocusRectangle();
}
}
#endregion Hlavni metody
#region Pomocne metody
public void NactiBarvy()
{
// vratime si vsechny zname barvy
Array pole = System.Enum.GetValues(typeof(KnownColor));
foreach (object polozka in pole)
{
// KnownColor prevedeme na Color
Color barva = Color.FromKnownColor((KnownColor)polozka);
if (barva.IsNamedColor)
{
// pokud se jedna o pojmenovanou barvu
// (Dostaneme se na ni pres Color.NazevBarvy)
// pridame ji do privatniho seznamu barev
this.VsechnyBarvy.Add(
new SolidBrush(Color.FromKnownColor((KnownColor)polozka)));
this.Items.Add(Color.FromKnownColor((KnownColor)polozka).Name);
}
}
}
#endregion Pomocne metody
}
}
Doporučuji metodu NactiBarvy() volat z místa, kde je definovám comboBox. Chtěl jsem ji umístit do konstruktoru a nechat ji public, ale designer mi do metody InitializeComponents vždycky načítal barvy ještě jednou, takže při listování barvami došlo k ArgumentOutOfRangeException. Nevím proč se designer takto chová a nebyl čas to řešit, proto jsem metodu NactiBarvy volal zvenčí.Nezapomeňte property comboBoxu DrawMode nastavit na OwnerDrawFixed.
Žádné komentáře:
Okomentovat