Color ComboBox - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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:


const
  redMask = $000000FF;
  greenmask = $0000FF00;
  bluemask = $00FF0000;


Tyto masky poté sloučíme s barvou a provedeme patřičný bitový posun. Výsledek bude vypadat nějak takto:


      Red:=Barva and redMask;
      Green:=(Barva and greenmask) shr 8;
      Blue:=(Barva and bluemask) shr 16);


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:


procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: 
Integer; Rect: TRect; State: TOwnerDrawState);
var
  Rec : TRect;
  R,G,B:string;
begin
  Rec := Rect;
  with Control as TComboBox,Canvas do
    begin
      FillRect(Rec);
      InflateRect(Rec,-1,-1);
      Rec.Left:=Rec.Left+100;
      Brush.Color := StrToInt(Items[Index]);
      FillRect(Rec);

      // převedeme barvu na složky R,G a B
      R:=IntToStr(StrToInt(Items[Index]) and redMask);
      G:=IntToStr((StrToInt(Items[Index]) and greenmask) shr 8);
      B:=IntToStr((StrToInt(Items[Index]) and bluemask) shr 16);
      Brush.Style:=bsClear;
      // a napíšeme to...
      TextOut(Rec.Left-98,Rec.Top+6,'RGB: '+R+','+G+','+B);
    end;

end;


Nakonec ještě musíme ComboBox naplnit nějakými hodnoty - to provedem v proceduře Form1.OnCreate, kterou si vytvoříme. Zde je:

procedure TForm1.FormCreate(Sender: TObject);
var ar,ag,ab:integer;
begin

  ComboBox1.Items.Clear;

  // dáme do ComboBoxu nějaké barvy
  for ar:=4 to 5 do
   begin
    for ag:=4 to 5 do
     begin
      for ab:=4 to 5 do
       begin
        ComboBox1.Items.Add(IntToStr(RGB(ar*50,ag*50,ab*50)));
       end;
     end;
   end;

end;


Čí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)

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: