Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Delphi
Color ComboBox
delphi_colorcombobox
15. května 2001, 00.00 | Chcete použít pro výběr barvy něco jiného než ColorDialog, třeba ComboBox ? V dnešním článku si ukážeme, jak na to.
Jistě jste se již setkali s problémem, jak na výběr barvy. Jedním řešením je dát na formulář komponentu ColorDialog, a podle její hodnoty měnit vlastnost Color jiné komponenty. Tato metoda nás však omezuje pouze na všechny barvy, pokud chceme vybírat z určitého rozsahu, máme smůlu. Proto si dnes ukážeme způsob druhý - a to výběr barvy pomocí komponenty ComboBox, nebo ListBox (při troše šikovnosti si potom můžete vytvořit komponentu vlastní, např. ColorComboBox, nebo ColorListBox). Tak se do toho dáme.
Nejprve si vytvoříme nový projekt a na formulář dáme již zmiňovanou komponentu ComboBox. Ta však standartně vykresluje jen položky textové, tedy typu string, které jsou uloženy ve vlastnosti Items. Převezmeme vykreslování do svých rukou tak, že nastavíme Style na csOwnerDrawVariable nebo csOwnerDrawFixed (podle toho, jestli budou mít všechny items stejnou výšku) a ItemHeight (výšku položky) na 30. Tím zajistíme, že windows nám kreslit položky nebude, a bude pouze na nás, co s tím uděláme. Proto si ihned vytvoříme proceduru OnDrawItem.
Teď ještě na chvíli odskočím, abych se zmínil něco málo o barvách TColor a RGB. V položkách ListBoxu budeme mít totiž definované barvy typu TColor, které mohou být vyjádřeny bud číslem, nebo tvarem clBlack, clWhite, atd. Pokud jsou zapsány právě prvním způsobem, budeme těžko hádat, o jakou barvu se jedná. Proto bychom chtěli získat z dané barvy složky červené (Red), zelené (Green) a modré (Blue). Tyto tři složky jsou v každé barvě zastoupeny číslem od 0 do 255, a zpětně je na TColor převedeme funkcí RGB. Např RGB(0,0,0) je černá, nebo RGB(255,255,255) je bílá. Pro opačný převod si vytvoříme funkci vlastní. Nejprve definujeme konstanty masek:
|
Tyto masky poté sloučíme s barvou a provedeme patřičný bitový posun. Výsledek bude vypadat nějak takto:
|
Tím již známe vše potřebné, a vrhneme se na vykreslování, tady zpět k proceduře OnDrawItem. V ní si definujeme proměnnou Rec typu TRect, která ponese informace o tom, kam se zrovna má kreslit a tři proměnné R,G a B typu string. V proceduře vymažeme povrch, dále zmenšíme Rec na každé straně o jeden pixel funkcí InflateRect. Následuje zvětšení hodnoty Rec.Left o sto, jelikož chceme, aby se výsledná barva zobrazila pouze v pravé polovině a v levé aby byla hodnota složek barvy. To také zajistí následující řádky funkce. Celý výpis je zde:
|
Nakonec ještě musíme ComboBox naplnit nějakými hodnoty - to provedem v proceduře Form1.OnCreate, kterou si vytvoříme. Zde je:
|
Čísla jsem zvolil celkem náhodně, výsledkem jsou v tomto případě pastelové barvy (viz obrázek nahoře). Pokud si s procedurou pohrajete, můžete dosáhnout i jiných zajímavých palet. Pozor pouze na to, že maximální hodnoty R,G a B jsou 255. Zde je jedna z dalších možností:
To je pro dnešek vše. V příštím článku zužitkujeme dnešní znalosti, a vytvoříme si jednoduchý Color Picker, program pro výběr barvy s mnoha funkcemi.
Download
ZDE si můžete stáhnout dnes vytvořený program a jeho zdrojáky (167 kB)
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007