ROZDZIAŁ 11





W tym rozdziale zajmiemy się grafiką. Przy programowaniu grafiki wykorzystywać będziemy klasę TCanvas. Jeżeli chcesz np., aby na formularzu wyświetlił się tekst - robisz coś takiego:
Canvas.TextOut(50,50,'Napis nr 1');
Dwa pierwsze parametry to (jak nietrudno się domyśleć) współrzędne X i Y napisu. W apostrofie umieszczony jest tekst który będzie wyświetlany na formularzu. Powyższy kod podstaw do procedury OnPaint głównego formularza. Jeżeli teraz uruchomisz program zauważysz, że rzeczywiście tekst jest, ale na białym tle. Przyznasz, ze nie wygląda to zachęcająco. Aby temu zapowiedz należy ustawić tło na przeźroczyste. Zrób więc coś takiego:
Canvas.Brush.Style:=bsClear;
Canvas.TextOut(50,50,'Napis nr 2');
Zanim ruszymy dalej poznaj funkcję klasy TCanvas.
Brush Kolor stosowany do wypełniania figur lub kolor pędzla.
Pen Określa styl i kolor linii.
PenPos Zawiera pozycje rysowania wyrażoną za pomocą X i Y
BrushCopy Wyświetla bitmapę z przeźroczy tym tłem.
Elipse Rysuje elipse
LineTo Rysuje linie od punktu X do punktu Y
MoveTo Wyznacza pozycję punktu rysowania.
Rectangle Rysuje prostokąt.
RoundRect Rysuje prostokąt z zaokrąglonymi narożnikami.
TextOut Wpisuje tekst na płótnie.
Oczywiście to tylko podstawowe funkcje. W procedurze np. OnPaint napisz słowo 'Canvas' i postaw kropkę. Poczekaj chwilę, powinna ukazać się lista z dostępnymi funkcjami.
Poeksperymentuj trochę z komponentem Shape (na palecie Additional). Możesz tam spokojnie dobierać kolory, style itp.
Oczywiście możesz także wyświetlić bitmapę i na niej umieścić jakiś tekst.
var
MojStyl : TBrushStyle;
Bitmap: : TBitmap;
begin
Bitmap:=TBitmap.Create;
Bitmap.LoadFromFile('C:\Image.bmp');
Bitmap.Draw(10,10,Bitmap);
MojStyle:=Canvas.Brush.Style;
Canvas.Brush.Style:=bsClear;
Canvas.TextOut(20,20,'Obrazek z wakacji :)');
Canvas.Brush.Style:=MojStyl;
Bitmap.Free;
end;


Objaśnienie: Na początku deklarujemy dwie zmienne: MojStyl i Bitmap. Pierwsza linia po begin oznacza stworzenie bitmapy. Kolejna ma za zadanie załadować bitmapę z określonej lokalizacji. Kolejna umieszcza ją na formularzu (współrzędne w tym wypadku wynoszą 10 i 10). Poźniej zmiennej MojStyl zostaje przypisany dotychczasowy styl. Robi się to po to, aby później nie trzeba było przywracać domyślnych ustawień, gdy chcesz stworzyć napis o innym stylu. W przedostanie i przedprzedostaniej następuje przywrócenie starego stylu i zwolnienie pamięci.

Funkcja DrawText
To jest trochę trudniejsza funkcja, której nie posiada klasa TCanvas. Pozwala ona na wpisanie tekstu w prostokąt i wyśrodkowanie ją w pionie i w poziomie. Najpierw zerknij na poniższy kod, a później wytłumaczę o co tu chodzi. procedure TForm1.FormPaint(Sender: TObject);
var
R:TRect;
begin
Canvas.Brush.Color:=clBlue;
Canvas.Font.Color:=clWhite;
R:=Rect(20,20,300,80);
Canvas.Rectangle(20,20,300,80);
DrawText(Canvas.Handle,
'Funkcja DrawText',
-1,R,DT_SINGLELINE or DT_VCENTER or DT_CENTER);
end;

Prawda, że bardziej skomplikowane? Zmienna typu Rect zawiera współrzędne prostokąta. Dwie pierwsze liczby określają współrzędne lewego górnego rogu, a dwie ostatnie prawego dolnego. Te współrzędne są wymagane, aby okreslić punkty w jakich wyświetlany będzie test. Następny parametr rysuje prostokąt na ekranie według powyższych wartości koloru wypełniania i czcionki. Następnie następuje narysowanie tekstu przy pomocy funkcji DrawText. Słowo Handle oznacza uchwyt urządzenia biblioteki Windows API. Omówienie tego w innych rozdziałach. Cyfra -1 oznacza liczbę znaków które zostaną wyświetlone. Wartość -1 oznacza wszystkie znaki. Kolejna wartość 'R' to wspomniany wcześniej prostokąt w którym narysowany będzie tekst. Ostatnie 3 parametry oznaczają wyświetlenie tekstu pośrodku w pionie i w poziomie oraz w jednej linii. To by było na tyle na dzień dzisiejszy. Dokończenie tego tematu kolejnym razem. Teraz zapraszam do następnego rozdziału w którym to zrobimy przeglądarke.

ROZDZIAŁ 12


Napiszmy prostą przeglądarkę graficzną. Co Wy na to?
1. Uruchom Delphi; zmień wartość Caption formularza na 'Przeglądarka plików graficznych'; ustaw właściwość Forms Style na fsMdiForm.
2. Wybierz z menu plik 'New Form'. Zmień właściwość FormStyle nowego okna na fsMDIChild. We właściwości Name wpisz np. 'New'; umieść komponent Image - zmień jego wartość Stretch na True oraz wartość Aligin na alClient. Zapisz formularz pod nazwą 'NewWindow';
3. Zapisz wszytko; na głównym formularzu umieść komponent MainMenu. Kliknij na niego podwójnie - otworzy się nowe okno. W Inspektorze Obiektów w polu Caption wpisz 'Plik'. Naciśnij podwójnie na ten napis - powinno rozwinąć się menu.
4. W rozwiniętym menu w polu Caption wpisz np. 'Otwórz' i 'Zapisz jako'. Zamknij to okno.
5. Umieść na formularzu głównym komponent OpenPictureDialog i SavePictureDialog. Będą one odpowiedzialne jak zapewne się domyślasz za zapisywanie i otwieranie plików.
6. W formularzy głównym wybierz menu Plik -> Otwórz i uzupełnij je następującym kodem:
procedure TMainFrom.Open1Click(Sender: TObject);
var
NewWindows : TNewWindow; //W moim przypadku tak nazywa się nowe okno, które zrobiłem.
begin
if OpenPictureDialog1.Execute then begin //Metoda Eecute wywołuje okno - w tym wypadku OpenPictureDialog1
NewWindow:= TNewWindow.Create(Self); //utworzenie nowego okna - musi być przypisany wskaźnik Self
with NewWindow.Image1.Picture do begin
LoadFromFile(OpenPictureDialog1.FileName); //Załadowanie nowego pliku ze ścieżki jaką używa
//komponent OpenPictureDialog
NewWindow.ClientWidth:=Width; //dopasowanie rozmiarów okna do rozmiarów obrazka
NewWindow.ClientHeight:=Height; //j/w
end;
NewWindow.Caption:=ExtractFileName(OpenPictureDialog1.FileName); //patrz niżej w objasnieniach
NewWindow.Show; //pokazanie nowego okna
end;
end;

OBJAŚNIENIE: Polecenie ExtractFileName oddziela ścieżkę dostępu do pliku od nazwy samego pliku. W tym wypadku na pasku stanu nowego okna będzie widniała nazwa pliku. Istnieją jeszcze inne podobne funkcje:
ExtractFileDir - wyświetla pełną ścieżkę dostępu do pliku.
ExtractFileExt - wyświetla rozszerzenie pliku
ExtractFileDrive - wyświetla literę dysku
Wydaje mi się, że pozostałe polecenia nie wymagają objaśnień.
Nadszedł czas, aby stworzyć polecenie dla menu: Plik -> Zapisz jako. Przyjrzyj się poniższemu kodowi, a później to objaśnie:
if SavePictureDialog1.Execute then
with ActiveMDIChild as TNewWindow do
Image.Picture.SaveToFile(SavePictureDialog1.FileName);

OBJAŚNIENIE: Funkcja ActiveMDIChild oznacza aktywne okno. Nie bez powodu w formularzu głównym ustawialiśmy właściwość FormStyle na fsMDIFrm. Dzięki temu właśnie zachodzi możliwość otwierania kilku okien naraz. W powyższej procedurze użyty został operator as. Jest to operator wiążący. Spróbuj napisać ten kod bez tego operatora - program się nie skompiluje gdyż kompilator nie wie czym jest Image. Trzeba połączyć to z TNewWindow, aby mieć dostęp do komponentu Image. Dalej następuje zapisanie obrazka do pliku, który wskazuje w oknie SavePictureDialog.
Teraz możesz już uruchomić program. Uwaga! Jeżeli program Ci się nie uruchomił a kompilator wskazuje błąd (nie wie co to jest TNewWindow) przejdź kursorem przed listę implementation i za nią dodaj taką linie:
uses TNewWindow;
Zostały jeszcze tylko drobne poprawki. Zauważ, że zaraz po uruchomieniu programu uruchamia się także nowe okno MDI. Nie chcemy żeby tak się działo więc z menu Project wybierz Options i kliknij na zakładkę 'Forms'. Kliknij na drugim formularzu MDI i naciśnij przycisk >
Zauważ również, że po otwarciu nowego okna i naciśnięciu krzyżyka okno się nie zamyka tylko minimalizuje. Przejdź do drugiego okna MDI i z Inspektora Obiektów wybierz zakładkę Events. Odszukaj polę OnClose i kliknij podwójnie. W edytorze kodu wpisz następująco linie:
Action := caFree;
Dzięki temu takie okno będzie się zamykało.