Font 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

Font ComboBox

delphi_fontcombo

28. května 2001, 00.00 | V dnešním článku si opět povíme něco víc o vlastním kreslení komponenty ComboBox, tentokrát pro výběr písma - FontComboBoxu.



Jelikož byl minulý článek o tvorbě vlastního ComboBoxu celkem úspěšný, ukážeme si dnes další věci, které můžeme právě s komponentou ComboBox dělat. Nejprve si musíme vysvětlit několik funkcí, na které v minulém článku nezbylo místo.

DrawText

Začneme tedy windowsovskou funkcí DrawText. Jak jste jistě všichni poznali, použijeme ji k vypisování textu. Proč ale nezůstaneme u TextOut ? Důvod je prostý - DrawText nám umožňuje kreslení formátovaného textu, s nastavením zarovnání, tabulátorů, zalomení řádků atd., čímž nám velice zlehčuje práci, a my máme čas na lepší věci. Parametry jsou následující -
  • hDC - určuje Handle povrchu, na který chceme kreslit
  • lpString - text, který chceme kreslit (přesněji pointer na text, tudíž nemůžeme zadat text 'nejaky text', ale pouze proměnnou, ve které máme string uložen)
  • nCount - kolik znaků chceme kreslit, pokud zadáme -1, bude se nCount odkazovat na nulový prvek stringu, ve kterém je uložena jeho délka, tudíž se bude kreslit celý
  • lpRect - ukazuje na oblast, do které chceme krelit. Pokud text přesahuje tuto oblast, není nakreslen.
  • uFormat - typ formátování vůstupu, podrobně popsaný v nápovědě delphi, já zde zmíním pouze pár nejpoužívanějších typů:
    • DT_SINGLELINE - jednořádkový text
    • DT_BOTTOM - text zarovnaný dolů (pouze u DT_SINGLELINE)
    • DT_VCENTER - text zarovnaný na střed svisle (pouze u DT_SINGLELINE)
    • DT_TOP - text zarovnaný nahoru (pouze u DT_SINGLELINE)
    • DT_LEFT - text zarovnaný doleva
    • DT_CENTER - text zarovnaný na střed
    • DT_RIGHT - text zarovnaný doprava
    • DT_NOPREFIX - normálně je znak za & podrthnut a pokud chceme napsat tento znak, musíme použít &&. Při nastaveném DT_NOPREFIX jsou však tyto znaky normálně vypsány.


To by snad s funkci stačilo, pokud jste něco nepochopili, nezoufejte, určitě to pochopíte z nadcházejícího textu a zdrojového kódu.

DrawFocusRect

Tuto funkci v dnešním programu sice nevyužívám, ale přesto je dobré ji znát. Nakreslí totiž focus kolem obdélníku, jenž je také jejím jediným parametrem. Windows toto kreslí automaticky kolem vybrané komponenty, ale pokud ji překreslíme, musíme použít právě toto. Funkce kreslí operací XOR, tudíž pokud ji zavoláme znovu na stejný obdélník, focus zmizí.

Font ComboBox

V minulém díle to byl color ComboBox, dnes je to Font ComboBox. ComboBox pro výběr písma. Ovšem ne ledajaký, u každého písma uvidíte i vzorek, což výběr velice urychluje. Vzpomeňme třeba na MSOffice 2000:


Právě v Microsoft Office se to různými ComboBoxy přímo hemží, vpomeňte třeba na výber tloušťky a tvaru čáry atd. Tento pro výběr písma má u každé položky ještě ikonku, zde-li se jedná o písmo True Type, nebo jiné a také tři naposledy použitá písma úplně nahoře. To zde nepopisuje, jelikož si sem jist, že to každý zvládne. Ale zpět k našemu. Vytvoříme si nový projekt a na formulář přidáme ComboBox. ItemHeight nastavíme například na 25, Style na csOwnerDrawFixed. Nyní si vytoříme proceduru Form1.OnCreate a do ní přidáme následující kód, který zajistí, aby se to Items přidaly všechny nainstalované fonty.


procedure TForm1.FormCreate(Sender: TObject);
begin
 // nahrajeme do comboBoxu písma
 ComboBox1.Items.Clear;
 ComboBox1.Items:=Screen.Fonts;
end;


Program můžete spustit a jak vydíte, v ComboBoxu máte opravdu všechna nainstalovaná písma. Jak ale určitě všichni potvrdíte, vybírat písmo pouze podle jména, když nevíte jak vypadá není zrovna pohodlné. Proto si vytvoříme proceduru ComboBox1.OnDrawItem. V ní nejprve otestujeme zda je položka vybraná. To poznáme podle vlastnosti State, která může nabývat hned několika hodnot:

  • odSelected - Položka je vybraná
  • odGrayed - Položka je zašedlá
  • odDisabled - Položka je vypnutá
  • odChecked - Položka je zaškrtnutá
  • odFocused - Položka má focus
  • odDefault - Položka je nastavena jako defaultní
  • odComboBoxEdit - Kreslí se edit v ComboBoxu
Nás bude zajímat pouze to, jestli je položka vybraná. Pokud ano, vyplníme pozadí modrou barvou a vlevo nakreslíme oranžový čtvereček, pokud ne, vyplníme jej buď tmavě, nebo světle šedou. To podle toho, jestli je číslo položk dělitelné dvěma. Tím dosáhneme efetku, že každá druhá položka je tmavší. Dále následuje kreslení názvu fontu, zarovnané na střed svisle a vodorovně doprava. Následně nakreslíme čáru, oddělující název od ukázky. Nakonec nakreslíme samotnou ukázku, zarovnanou doleva. Výsledný kód je zde:


procedure TForm1.ComboBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin

 with Control as TComboBox,Canvas do
  begin

   if odSelected in State then  // je položka vybraná, nebo ne ???
    begin
     Brush.Style:=bsSolid;
     Brush.Color:=$00996B2D;
     FillRect(Rect);              // vymažeme pozadí modrou
     Brush.Color:=$0047BEF8;
     Rectangle(10,Rect.Top+8,20,Rect.Top+18); // malý čtvereček

     Font.Color:=$0047BEF8;
     Font.Style:=[fsBold];
     Brush.Style:=bsClear;
    end
   else
    begin
     Brush.Style:=bsSolid;
     if Index mod 2 = 0 then Brush.Color:=$00D7E8E8
     else Brush.Color:=$00BFDBDB;
     FillRect(Rect);  // vymažeme pozadí šedou
     Font.Color:=clBlack;
     Font.Style:=[];
     Brush.Style:=bsClear;
    end;

   Rect.Top:=Rect.Top+2;
   Rect.Left:=5;
   Rect.Right:=150;

   // nakrelsíme název fontu
   Font.Name:='Tahoma';
   DrawText(ComboBox1.Canvas.Handle,
   PChar(Screen.Fonts.Strings[Index]),-1,
   Rect,DT_RIGHT or DT_SINGLELINE or DT_VCENTER);

   // prostřední čáru
   MoveTo(155,Rect.Top-2);
   LineTo(155,Rect.Top+ItemHeight+2);

   // a potom taky malou ukázku
   Font.Name:=ComboBox1.Items[Index];
   Font.Size:=12;
   Rect.Left:=Rect.Left+160;
   Rect.Right:=500;
   DrawText(ComboBox1.Canvas.Handle,
   PChar(Screen.Fonts.Strings[Index]),-1,
   Rect,DT_SINGLELINE or DT_VCENTER);

 end;
end;


Program můžete spustit a pokud je vše v pořádku, měl by vypadat podobně jako obrázek úplně nahoře.

Je dobré taky nastavit u ComboBoxu vlastnost DropDownCount, která určuje, kolik se zobrazí najednou položek na nějaké větší číslo. Já mám nastaveno 5 jen proto, abych neměl velký obrázek, vhodná volba je někde kolem 10-20 (zase záleží na výšce položky). Na jiné vylepšení již musíte přijít sami, nebo počkat do dalšího článku, kde se opět dozvíte více. Pro dnešek je to vše.

Download
ZDE si můžete stáhnout dnes vytvořený program a jeho zdrojáky (221 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: