Kreslený StatusBar (C++ Builder) - 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:



C/C++

Kreslený StatusBar (C++ Builder)

24. července 2001, 00.00 | Nedílnou součástí každého správného editoru je stavový řádek neboli statusbar, který informuje o nejrůznějších stavech v programu. Dnes si ukážeme jak jej oživit grafickým prvkem..

Kreslený StatusBar (C++ Builder)

Nedílnou součástí každého správného editoru je stavový řádek neboli statusbar, který informuje o nejrůznějších stavech v programu. Například u textových editorů počet stránek, aktuální stránka nebo indikátory módů psaní jako je vkládání nebo přepisování. Statusbar nabízí také možnost vložení obrázku do libovolného oddílu (panelu). Grafické znázornění je přece jen estetičtější a názornější než strohý text.

A mimo to jsem se inspiroval programem Dreamweaver, kde statusbar slouží navíc jako panel nástrojů.

Tak se podívejme stavovému řádku pěkně na zoubek.

Nejprve by bylo vhodné si vlastně uvědomit, co budeme ve statusbaru ukazovat. Takže já bych si představoval, že by mohl celý program vypadat nějak takhle:

Velmi jednoduchý editor textu, který otvírá a ukládá textové soubory. Aplikace obsahuje Memo, statusbar a panel nástrojů. Statusbar má za úkol signalizovat probíhající události v programu. Například při psaní do mema zobrazí ikonku kláves atd ....

Obstaráme si ikonky a obrázky zobrazující jednotlivé stavy programu. Ty uložíme jako zdroj (resource) do souboru *.res, odkud je budeme načítat.

Nastavíme počet panelů a jejich velikosti

for (i = 0; i < 4; i++)
StatusBar->Panels->Add();

Použijeme 4 panely, 3 pro text a jedem pro grafiku. Nastavíme velikosti:

for (i = 0; i < 3; i++) {
StatusBar->Panels->Items[i]->Alignment = taCenter;
StatusBar->Panels->Items[i]->Style = psText;
StatusBar->Panels->Items[i]->Width = ClientWidth/4;
}

StatusBar->Panels->Items[3]->Width = ClientWidth/4;
StatusBar->Panels->Items[3]->Style = psOwnerDraw;

Poslední panel nastavíme na psOwnerDraw (vlastní), to znamená, že se sami postaráme o jeho překreslení.

O kreslení do statusbaru se stará událost OnDrawPanel, která má parametry TStatusBar *StatusBar, TStatusPanel *Panel, const TRect &Rect. První je ukazatel na StatusBar. Pokud bychom chtěli mít víc kreslených panelů, potřebovali bychom rozlišit, který panel se zrovna překresluje, k tomu by pomohlo třeba Panel->Index. My máme ale pouze jeden panel, a proto se o rozlišování nemusíme vůbec starat.

StatusBar->Canvas->CopyMode = cmSrcAnd;

if (stav == StText)
StatusBar->Canvas->CopyRect(TRect(Rect.Left+30, Rect.Top+1, Rect.Left+Normal->Width, Rect.Bottom-1), Normal->Canvas, Normal->Canvas->ClipRect);
if (stav == StSave)
StatusBar->Canvas->CopyRect(TRect(Rect.Left+30, Rect.Top+1, Rect.Left+Save->Width, Rect.Bottom-1), Save->Canvas, Save->Canvas->ClipRect);
if (stav == StKey)
StatusBar->Canvas->CopyRect(TRect(Rect.Left+30, Rect.Top+1, Rect.Left+Key->Width, Rect.Bottom-1), Key->Canvas, Key->Canvas->ClipRect);

Jednotlivé stavy jsem navolil jako typ enum pro identifikaci jednotlivých stavů programu (StKey, StSave .....). Například při události OnKeyDown na komponentě memo nastavím stav = StKey; Pak už jenom zadám aby se statusbar překreslil.

StatusBar->Refresh();

Výsledek najdete zde.

Statusbar jako panel nástrojů

Statusbar poslouží dobře jako i panel nástrojů pro funkce programu, které potřebujeme méně často, ale jsou důležité a je dobré je mít po ruce.

Vyjdeme z minulého příkladu. Rozdíl bude takový, že přidáme další panel do statusbaru, který opět nastavíme na psOwnerDraw. Do tohoto panelu vykreslíme tři ikony: soubor nový, otevřít soubor, uložit soubor. Musíme zajistit, aby při přejezdu myši přes některou volbu se obrázek nepatrně změnil a po stisknutí myšítka byla provedená potřebná akce.

Při vykreslování statusbaru událostí OnDrawPanel rozlišíme vykreslování jednotlivých panelů porovnáním např. Panel->Index == 3. Pak nakreslíme jednotlivé obrázky. Trochu problematické bude pro nás určení, nad kterou volbou se právě nachází kurzor myši. Obávám se, že to je potřeba zadat ručně:

if (X > 345 && Y > 4 && X < 361 && Y < 20)
ikona = ikNew;
if (X > 365 && Y > 4 && X < 381 && Y < 20)
ikona = ikOpen;
if (X > 385 && Y > 4 && X < 401 && Y < 20)
ikona = ikSave;

No a nakonec stačí jen obsloužit stisknutí tlačítka myši na statusbaru a zajistit, aby se provedla správná operace.

if (ikona == 1)
SpeedButton1Click(Sender);
if (ikona == 2)
SpeedButton2Click(Sender);
if (ikona == 3)
SpeedButton3Click(Sender);

Celý program je k vidění zde.
Malou vadou na kráse u programu je vynucení překreslení statusbaru metodou refresh.

Doufám, že se vám to někdy bude hodit.

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

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

 

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

Uživatelské jméno:

Heslo: