Minutnik w C++

Borland C++ Builder można traktować jako Delphi dla programujących w C++. Tworzenie aplikacji do Windows jest w tym środowisku równie proste.

Borland C++ Builder można traktować jako Delphi dla programujących w C++. Tworzenie aplikacji do Windows jest w tym środowisku równie proste.

Nie jest to program najnowszy. W porównaniu chociażby z C# Builderem tej samej firmy widać różnice i usprawnienia, jakie wprowadzono w nowej generacji środowisk programistycznych. Borland C++ Builder 6 wciąż jednak pozostaje świetnym narzędziem do tworzenia aplikacji do Windows w języku C++, tym bardziej, że nowe propozycje, takie jak np. C++ Builder X, nie wszystkim będą odpowiadać (obecna wersja C++ Builder X nie zawiera narzędzi do wizualnego projektowania interfejsu użytkownika). Aby nie być gołosłownym, pokażemy na przykładzie prostego programu - minutnika przypominającego o różnych zadaniach - jak proste jest budowanie aplikacji w C++ Builderze 6.

Pracę nad projektem rozpoczynamy od wstępnego przygotowania głównego okna aplikacji. Utwórz nowy projekt (File|New|Application) i zmień właściwości głównego okna: ustaw parametr Position na wartość poDesktopCenter, możesz także zmienić krój czcionki (Font) i nazwę aplikacji na pasku tytułu (Caption). Okno aplikacji składać się będzie z pola opisu zadania, suwaka służącego do ustawiania czasu alarmu, dwóch przycisków oraz pola z graficzną wizualizacją upływającego czasu. Główne okno programu może być dość małe, a użytkownik nie powinien go zmieniać - ustaw parametr BorderStyle we właściwościach głównego okna programu na bsSingle. Dodaj do okna programu komponenty TMemo, BitBtn, TrackBar i TPie (ten ostatni znajdziesz na karcie Samples). Możesz dodać także komponent Label, który czas pozostający do alarmu wyświetlać będzie w postaci liczbowej. Do aplikacji dodaj również komponent Timer, ustawiając jego właściwość Interval na 60000 (co odpowiada 1 minucie) i właściwość Enabled na False. Okno aplikacji jest już praktycznie gotowe.

We właściwościach komponentu TPie można ustawić kolor wypełnienia wykresu kołowego.

We właściwościach komponentu TPie można ustawić kolor wypełnienia wykresu kołowego.

Najpierw zaprogramujemy sterowanie czasem alarmu. Użytkownik będzie mógł go ustawić w zakresie od 1 do 60 minut. Ustaw właściwość Min komponentu TrackBar na 1, a Max na 60. Przesuwanie suwaka powinno zmieniać wygląd wykresu kołowego Pie i wartość wyświetlaną za pomocą komponentu Label. Załóżmy, że komponent typu Pie ma nazwę Wykres, TrackBar - Suwak, a Label - Informacja. Dwa przyciski BitBtn nazwij odpowiednio Start i Stop. Nazwy komponentów zmienisz we właściwości Name. Nie należy mylić nazwy komponentu, jego rodzaju i typu. Rodzaj komponentu to np. wykres kołowy w C++ Builder, nazywany Pie. Typ tego komponentu, widoczny w kodzie źródłowym programu, to TPie. Nazwę komponentu możesz zmieniać samodzielnie.

W praktyce warto trzymać się pewnej konwencji nazywania komponentów, co zwiększa przejrzystość kodu. Gdy nad programem pracuje kilka osób, przyjęcie jednolitego standardu nazewnictwa jest właściwie niezbędne.

W naszym warsztacie używane będą proste nazwy w języku polskim - wyłącznie dla przejrzystości prezentowanych dalej krótkich fragmentów kodu.

Kliknij dwukrotnie komponent Suwak, a C++ Builder wygeneruje szkielet metody obsługującej zdarzenie OnChange dla tej kontrolki. Przy każdej zmianie położenia suwaka należy uaktualnić wykres kołowy i opis czasu alarmu. Szczegółowy kod metody jest następujący:

void __fastcall TForm1::SuwakChange(TObject *Sender)

{

// ustaw opis liczbowy

if( Suwak->Position>1 )

{

if( Suwak->Position%10>4 | |

Suwak->Position%10==0)

Informacja->Caption =

IntToStr(Suwak->Position)+" minut";

else

Informacja->Caption =

IntToStr(Suwak->Position)+" minuty";

}

else

Informacja->Caption = "1 minuta";

// ustaw wykres kołowy

Wykres->Angles->StartAngle =

90-Suwak->Position*6;

}

Komponent TrayIcon ukrywający aplikację w zasobniku systemowym wymaga ikony, przechowywanej w komponencie ImageList.

Komponent TrayIcon ukrywający aplikację w zasobniku systemowym wymaga ikony, przechowywanej w komponencie ImageList.

Aby wykres kołowy rysowany był poprawny, ustaw właściwość Angles | EndAngle komponentu Suwak na 90. Możesz teraz skompilować i uruchomić program za pomocą opcji Run | Run lub skrótu [F9].

Teraz zajmiemy się oprogramowaniem komponentu odpowiedzialnego za odmierzanie czasu. Przyjmijmy, że komponent Timer będzie miał nazwę Zegar. Dwukrotnie kliknij ten komponent w oknie projektowania interfejsu. Do kodu programu zostanie dodana metoda obsługująca zdarzenie OnTimer. Metoda ta wywoływana będzie w równych odstępach czasu, określonych (w milisekundach) parametrem Interval - w naszym przypadku jest to 1 minuta. Po każdym "tyknięciu" zegara suwak powinien zostać przesunięty o jedną pozycję w kierunku zera. W chwili, gdy dotrze do zera, program powinien wyświetlić alarm.

void __fastcall TForm1::ZegarTimer(TObject *Sender)

{

if( Suwak->Position>1 )

{

// przesuń o 1 pozycję w kierunku zera

Suwak->Position- -;

}

else

{

// wyświetl alarm

Zegar->Enabled = false;

MessageBeep( MB_ICONEXCLAMATION );

if( Opis->Text.Length()>0 )

MessageBox(NULL,Opis->Text.c_str()

"Alarm!",MB_OK | MB_TOPMOST);

else

MessageBox(NULL," >>> Alarm! <<< "

"Alarm!",MB_OK | MB_TOPMOST);

}

}

Zwróć uwagę na sposób wyświetlania komunikatu. Z reguły używana jest raczej funkcja ShowMessage, której wywołanie jest znacznie prostsze. Funkcja MessageBox, zaliczana do funkcji systemowych Windows, ma jednak tę zaletę, że pozwala wyświetlić okno wiadomości niepowiązane z oknem aplikacji (jako uchwyt okna podaliśmy wartość NULL). W dodatku można spowodować, żeby okno komunikatu pojawiało się zawsze na wierzchu innych otwartych okien (parametr MB_TOPMOST). Dzięki temu komunikat będzie widoczny nawet wtedy, gdy okno programu jest ukryte w zasobniku systemowym, a pulpit zapełnia wiele okien innych aplikacji. Przydatną funkcją - nie tylko w przypadku tego programu - okazuje się MessageBeep. Za jej pomocą można odtworzyć jeden ze standardowych sygnałów dźwiękowych Windows.

Zanim przetestujemy działanie programu, należy jeszcze zaprogramować działanie przycisków Start i Stop. Metody obsługujące ich kliknięcie dodajemy podobnie jak poprzednio, dwukrotnie klikając dany przycisk w oknie projektowania interfejsu. Metody obsługujące przyciski są naprawdę proste.

void __fastcall TForm1::StartClick(TObject *Sender)

{

Zegar->Enabled = true;

}

void __fastcall TForm1::StopClick(TObject *Sender)

{

Zegar->Enabled = false;

}

Teraz można już skompilować i uruchomić program, ale wcześniej warto tymczasowo zmienić właściwość Interval komponentu Zegar, z 60000 np. na 200. Zdecydowanie ułatwi to testowanie aplikacji. Oczywiście przed "prawdziwym" użyciem programu należy przywrócić wartość 60000.

Efekt końcowy: działający program.

Efekt końcowy: działający program.

Program spełnia już swoje podstawowe zadanie, ale można wzbogacić go o kilka dodatkowych elementów, dzięki którym będzie wygodniejszy w użyciu. Borland C++ Builder 6 w wersji Personal wyposażony został w mocno okrojoną paletę komponentów, ale można znaleźć wśród nich interesującą pozycję - TrayIcon. Za jego pomocą program można ukryć w postaci ikony w zasobniku systemowym. Najpierw należy przygotować ikonę, np. o rozmiarach 20x30 pikseli. Do tego celu z powodzeniem posłuży zintegrowany z C++ Builder 6 edytor plików graficznych, dostępny jako Tools | Image Editor. Przygotowaną ikonę należy zapisać w formacie BMP. Następny etap to dodanie do aplikacji komponentu ImageList. Po jego dwukrotnym kliknięciu wyświetlone zostanie okno edycji listy obrazów. Kliknij przycisk Add i wskaż przygotowany wcześniej plik BMP z ikoną programu. Dodanej w ten sposób grafice przyporządkowano liczbę 0. Zamknij okno edycji listy obrazów i dodaj do aplikacji komponent TrayIcon, nazywając go np. Zasobnik. Ustaw właściwość Icons na ImageList1, Hide na True i Visible na True. Ustaw także właściwość RestoreOn na wartość imDoubleClick.

Do okna aplikacji dodaj nowy przycisk, np. o nazwie Ukryj, który będzie minimalizować okno programu do postaci ikony w zasobniku systemowym. Dodaj metodę obsługującą kliknięcie tego przycisku. Ma ona tylko jeden wiersz kodu:

void _fastcall TForm1::UkryjClick(TObject *Sender)

{

Zasobnik->Minimize();

}


Zobacz również