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.

Minutnik w C++

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;

}

Minutnik w C++

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.

Minutnik w C++

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();

}