Wygaszacz ekranu
Gdy zaczynałem swoją przygodę z komputerem i gdy zobaczyłem pierwszy wygaszacz ekranu marzyło mi się utworzenie własnego wygaszacza, takiego w którym mógłbym umieścić co tylko zechcę. Stworzenie własnego wygaszacza ekranu w C++ jest bardzo proste i ogranicza się właściwie do sporządzenia szablonu aplikacji, a dopiero potem programuje się to co chcemy, żeby nasz wygaszacz wyświetlał na ekranie, a to jest już zależne od wiedzy, umiejętności i wyobraźni programisty.
Jak zapewne wszystkim wiadomo wszystkie wygaszacze mają mają rozszerzenie *.scr, ale zapewne nie wszyscy wiedzą, że każdy wygaszacz jest właściwie samowykonywalnym plikiem czyli po prostu aplikacją, lub jak ktoś woli - programem. Można to łatwo sprawdzić zmieniając rozszerzenie dowolnego
wygaszacza z *.scr na *.exe.
Nie oznacza to bynajmniej, że każdy program może być wygaszaczem ekranu. żeby program mógł stać się wygaszaczem ekranu muszą zostać spełnione pewne warunki i to jest właśnie tematem tego kursu.
krok 1. - tworzymy nowy projekt
Uruchamiamy program BCB i zapisujemy nowo utworzony projekt w nowym katalogu. Nazwa pod jaką zapiszemy projekt jest dowolna, ja użyłem nazwy TestScreen.
Teraz następuje ważny krok, otóż należy zmienić nazwę formularza - Form1 na frmSaver. Ta nazwa jest istotna dla prawidłowego działania programu i nie może być inna.
Następnie wybieramy w menu Project | Options i w oknie dialogowym które się pokaże, na zakładce Application w sekcji Output settings zmieniamy wartość Target file extension: z exe na scr:
krok 2. - tworzymy zdarzenie wyłączające wygaszacz ekranu po wykryciu ruchu wskaźnika myszki.
Ważną cechą wygaszacza ekranu jest to, że po poruszeniu myszką wygaszacz się wyłącza, dlatego teraz dołączymy obsługę zdarzenia OMouseMove dla formularza frmSaver. W tym celu na zakładce Events klikamy dwukrotnie w zdarzeniu OnMouseMove i w dołączonym w ten sposób do pliku źródłowego Unit1.cpp zdarzeniu umieszczamy następujący kod:
// Plik źródłowy Unit1.cpp //-------------------------------- void __fastcall TfrmSaver::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { static mouseMove = 0; mouseMove++; if(mouseMove == 10) { WindowState = wsNormal; Close(); } } //-------------------------------- |
Trzeba również zmienić niektóre właściwości formularza frmSaver, a robi się to na zakładce Properties. Więc ustawiamy właściwość BorderStyle na bsNone. następnie właściwość Color na clBlack oraz właściwość WindowState na wsMaximized.
krok 2. - kompilujemy projekt.
To dopiero początek, ale już teraz kompilujemy projekt i uruchamiamy program. Łatwo da się zauważyć, że nasz program zachowuje się jak wygaszacz ekranu, ale to jeszcze nie jest to. Przejdźmy teraz do katalogu w którym umieściliśmy nasz projekt. Powinien się tam znajdować plik o nazwie TestScreen.scr i to jest właśnie nasz wygaszacz ekranu. Jeżeli klikniemy na tym pliku i wywołamy menu kontekstowe to zobaczymy spis takich opcji jak: TestScreen.scr, Konfiguruj i Zainstaluj. Opcja konfiguruj jeszcze nie działa ponieważ należy dołączyć do projektu nową formę będącą właśnie oknem dialogowym zawierającym opcje pracy wygaszacza.
krok 3. - dołączamy okno dialogowe opcji wygaszacza.
Wybieramy w menu File | New Form zostanie utworzony nowy formularz - Form2. Zmieniamy jego nazwę na frmSetup i podobnie jak poprzednim razem ta nazwa jest istotna dla prawidłowego działania wygaszacza. Następnie zapisujemy wszystko.
krok 4. - ustawiamy parametry uruchamiania wygaszacza i wywoływania okna opcji.
Dodanie okna dialogowego ustawiającego opcje wygaszacza nie powoduje jeszcze wyświetlenie tego okna po wybraniu w menu kontekstowym opcji Konfiguruj. Żeby to zmienić wybieramy menu Project | View Source (lub View | Project Source - w zależności od wersji BCB) zostanie wyświetlony plik TestScreen.cpp zawierający parametry uruchamiania programu:
// Plik źródłowy TestScreen.cpp //-------------------------------- #include <vcl.h> #pragma hdrstop //-------------------------------- USEFORM("Unit1.cpp", frmSaver); USEFORM("Unit2.cpp", frmSetup); //-------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TfrmSaver), &frmSaver); Application->CreateForm(__classid(TForm2), &frmSetup); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //-------------------------------- |
Zawartość tego pliku należy zmienić w podany niżej sposób:
// Plik źródłowy TestScreen.cpp //-------------------------------- #include <vcl.h> #pragma hdrstop #define APPTITLE "TestScreen" //-------------------------------- USEFORM("Unit1.cpp", frmSaver); USEFORM("Unit2.cpp", frmSetup); //-------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { HANDLE hInstanceMutex = ::CreateMutex(NULL, TRUE, APPTITLE); if(GetLastError() == ERROR_ALREADY_EXISTS) { if(hInstanceMutex) CloseHandle(hInstanceMutex); return 0; } try { AnsiString param = ParamStr(1).LowerCase().Trim().SubString(0,2); if(param=="/s") { Application->Initialize(); Application->CreateForm(__classid(TfrmSaver), &frmSaver); Application->Run(); } else if (param=="/c" || ParamCount()==0) { Application->Initialize(); Application->CreateForm(__classid(TfrmSetup), &frmSetup); Application->Run(); } else if (param=="/a"); else if (param=="/p"); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; } //-------------------------------- |
Jeżeli teraz skompilujemy projekt to zamiast samego wygaszacza uruchomi się okno dialogowe z opcjami. Przejdźmy więc do katalogu z projektem wygaszacza i wywołując na pliku menu kontekstowe wybierzmy opcję TestScreen.scr - uruchomi się wygaszacz. następnie wybierzmy z menu kontekstowego opcję Konfiguruj - uruchomi się okno dialogowe opcji. Szablon wygaszacza jest już gotowy do użycia. Teraz pozostało już tylko zrobienie samego wygaszacza.
krok 5. - wykańczanie wygaszacza ekranu.
Moim pomysłem na wygaszacz ekranu jest wyświetlanie plików w formacie *.avi lub *.mpeg. W tym celu należy umieścić na formularzu frmSaver komponent MediaPlayer1, a następnie w zdarzeniu OnShow formularza frmSaver trzeba dodać następujący kod:
// Plik źródłowy Unit1.cpp |
Następnie w zdarzeniu OnNotify obiektu MediaPlayer1 dodajemy następujący kod:
// Plik źródłowy Unit1.cpp //-------------------------------- void __fastcall TfrmSaver::MediaPlayer1Notify(TObject *Sender) { MediaPlayer1->Play(); } //-------------------------------- |
Następnie przechodzimy do pliku nagłówkowego i w sekcji include importujemy plik inifiles.hpp:
// Plik nagłówkowy Unit1.h. //-------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <MPlayer.hpp> #include <inifiles.hpp> //-------------------------------- |
Należy jeszcze ustawić właściwość Visible obiektu MediaPlayer1 na false.
Następnym krokiem jest umieszczenie na formularzu frmSetup komponentów: Edit1, Button1, Button2 i OpenDialog1. Tworzymy zdarzenie OnShow dla formularza frmSetup i umieszczamy w nim następujący kod:
// Plik źródłowy Unit2.cpp //-------------------------------- void __fastcall TfrmSetup::FormShow(TObject *Sender) { TIniFile *PlikIni = new TIniFile("C:\\Windows\\Win.ini"); Edit1->Text = PlikIni->ReadString("Windows", "ScreenSave", ""); } //-------------------------------- |
Następnie w zdarzeniu OnClick obiektu Button1 umieszczamy kod:
// Plik źródłowy Unit2.cpp //-------------------------------- void __fastcall TfrmSetup::Button1Click(TObject *Sender) { if(OpenDialog1->Execute()) { Edit1->Text = OpenDialog1->FileName; TIniFile *PlikIni = new TIniFile("C:\\Windows\\Win.ini"); PlikIni->WriteString("Windows", "ScreenSave", Edit1->Text); } } //-------------------------------- |
Następnie w zdarzeniu OnClick obiektu Button2 dodajemy funkcję zamykającą okno dialogowe:
// Plik źródłowy Unit2.cpp //-------------------------------- void __fastcall TfrmSetup::Button2Click(TObject *Sender) { Close(); } //-------------------------------- |
Trzeba jeszcze dołączyć do pliku nagłówkowego Unit2.h wpis do sekcji include importujący plik inifiles.hpp podobnie jak to miało miejsce w przypadku pliku nagłówkowego Unit1.h.
Można jeszcze w zdarzeniu OnCreate formularza frmSaver ukrywający kursor myszki:
// Plik źródłowy Unit1.cpp //-------------------------------- void __fastcall TfrmSaver::FormCreate(TObject *Sender) { ShowCursor(0); } //-------------------------------- |
Jeżeli teraz po kliknięciu na pliku TestScreen.scr wywołamy menu kontekstowe i wybierzemy opcję Konfiguruj to zostanie wyświetlone okno opcji naszego wygaszacza ekranu. W oknie tym po kliknięciu na przycisku Button1 zostanie wywołane okno dialogowe OpenDialog1 umożliwiające wybranie pliku video, który będzie wyświetlany w naszym wygaszaczu ekranu. Opcja Zainstaluj spowoduje instalacje wygaszacza i dodanie go do właściwości pulpitu.
Pytania proszę kierować na skrzynkę pocztową cyfrowy.baron@wp.pl. Nie biorę żadnej odpowiedzialności za błędy i szkody jakie może spowodować korzystanie z kursu, plików i programów w nim zamieszczonych.
Przygotował: Cyfrowy Baron.
...wygaszacz: TestScreen.scr
...pliki żródłowe (BCB6)