ROZDZIAŁ 13
Pamiętasz jak w Rozdziale 11 pisałem o funkcji DrawText? Nie wspomniałem wówczas o tym, że funkcja ta posiada jeszcze jedną fajną rzecz:
var
R : TRect;
begin
R := Rect(100,100,120,120);
DrawText(Canvas.Handle,
'To jest długi tekst, który może się nie zmieścić.',
-1, R, DT_END_ELLIPSIS);
Tekst zostanie wówczas "obcięty", a na końcu pojawi się symbol trzykropka. To jest długi tekst,...
Istnieje jeszcze jeden znacznik, mianowicie DT_CALCRECT. Powoduje on dopasowanie tekstu do szerokości i wysokości prostokąta:
var
R : TRect;
S : String;
begin
R := Rect(10,10,100,100); //Wymiary prostokąta
S := 'Barrrrrrrrrrrrdzzzooooooooooooo długiiiiiiii tekst, któryyyyy może się nie zmieścić w jednej i '+
' dlatego zostanie umieszcony w kilku liniach'; //Tekst
DrawText(Canvas.Handle, PChar(S), -1, R, DT_CALCRECT or DT_WORDBREAK);
Canvas.Recttangle(R.Left, R.Top, R.Right, R.Bottom); //Narysowanie prostokąta o wymiarach podanych w zmiennej //Rect
DrawText(Canvas.Handl, PChar(S), -1, DT_WORDBREAK);
end;
OBJAŚNIENIE: Omówię tutaj tylko te znaczniki których nie omawiałem w poprzednim rozdziale. Na początek zwróć uwagę na typ PChar. Funkcja DrawText wymaga rzutowania tekstu w postaci zmiennej PChar, a nie String. Zauważ także to, że dwa razy napisałem DrawText. Wymaż przedostanią linie, uruchom program i zobacz co się stało. Owszem jest prostokąt, tekst jest dopasowany, ale prostokąt jest za duży. Gdy napisz to jeszcze raz bez użycia DT_CALCRECT obszar prostokąta zostanie dopasowany do ilości linijek tekstu.
Bitmapy
Rysowanie bitmap nie jest trudne - spójrz na poniższy przykład:
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('C:\obrazek1.bmp');
Bitmap.Draw(0,0,Bitmap);
Bitmap.Free;
end;
Na początku następuje stworzenie bitmapy, następnie załadowanie jej z określonej lokalizacji. Później następuje narysowanie bitmapy w lewym, górnym rogu. Na końcu następuje zwolnienie pamięci.
To jest dobry zposób jeżeli chcesz zachować domyślne rozmiary obrazka. Jeżeli chcesz mieć większą kontrole nad jego rozmiarem powinieneś zrobić raczej coś takiego:
var
Bitmap : TBitmap;
R : TRect;
begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('C:\obrazek1.bmp');
R := Rect(0,0,50,50);
Canvas.StretchDraw(R,Bitmap);
end;
W tym wypadku funkcja StretchDraw Rysuje bitmapę o określonych rozmiarach.
ROZDZIAŁ 14
Pamiętasz - w poprzednim rozdziale pisałeś przeglądarkę plików graficznych? Teraz napiszemy inną przeglądarkę - zapraszam.
1. Umieść na formularzu komponent Panel - wymaż jego właściwość Caption.
2. Umieść na formularzu komponent ToolBar.
2. Przejdź do zakładki 'Win 3.1'. Na Panelu umieść następujące komponenty:
- DirectoryListBox
- FileListBox
- DriveComboBox
- FilterComboBox
3. Umieść je na Panelu w kolejności podanej powyżej
4 We właściwości DirectoryListBox1 zmień właściwość FileList na FileListBox1.
5. We właściwości DriveComboBox1 zmień właściwość DirList na DirectoryListBox1.
6. We właściwości FilterComboBox1 zmień właściwość FileList na FileListBox1
6 Właściwość Align Panelu zmień na alLeft.
7. Umieść na formularzu komponent Image, zmień jego właściwość Align na alClient.
8. Kliknij pojedynczo na FilterComboBox1 i kliknij na właściwość Filter. Następnie naciśnij na symbol trzykropka - uruchomi się edytor filtrów. Po lewej stronie wpisuje się nazwę filtrów, a po prawej sam filtr. Wymaż filtry, które są tam napisane. Po lewej stronie wpisz np. "Pliki JPG", a po prawej: "*.jpg". Zrób tak jeszcze z rozszerzeniem *.ico, *.wmf itp.
9. Kliknij pojedynczo na komponent FileListBox1. W Inspektorze Obiektów kliknij na zakładkę 'Events' i odnajdź pole OnClick. Kliknij dwukrotnie na obszar obok tego pola - kod zdarzenia uzupełnij następująco:
procedure TForm1.FileListBox1Click(Sender: TObject);
begin
try
Image1.Picture.LoadFromFile(FileListBox1.FileName);
except
ShowMessage('To nie jest prawidłowy format plików.');
end;
Myślę, że objaśnienia są tu zbędne. Po prostu wyświetlony zostaje obrazek na który postawiony został kursor. Jeszcze jedna sprawa - do listy uses dodaj słówko: jpeg - pozwoli to na wyświetlanie obrazków w formaie *.jpg. (Funkcja ta niestety nie działa w Delphi 2).
Pozostało jedynie dodanie przycisków na Pasku ToolBar. Kliknij więc w jego obrębie prawym przyciskiem myszy i z menu wybierz NewButton. Stwórz w ten sposób jeszcze dwa przyciski.
1. Zmień właściwość Name pierwszego z nich na Save, a drugiego na Edit.
2. Umieść na formularzu komponent SavePictureDialog.
3. Treść procedury OnClick pierwszego uzupełnij tak:
if SavePictureDialog1.Execute then begin
Image1.Picture.SaveToFile(SavePictureDialog1.FileName);
end;
4. Treść procedury 2 przycisku uzupełnij następująco:
ShellExecute(Handle,'open',PChar(FileListBox1.FileName),nil,nil,SW_SHOWMAXIMIZED);
Metoda ShellExecute otwiera dany program - w tym wypadku domyślny program graficzny jaki przypisany jest danemu rozszerzeniu. Pierwszy parametr jest uchwytem okna gdyż jest to funkcja API. Następnie następuje rzutowanie nazwy pliku FileListBox1 na PCHar. Dwa kolejne parametry to wskaźniki (będziemy mówić o nich później). Ostatni parametr otwoera okno w postaci zmaksymilizowanej. Dostępne są też SW_HIDE, SW_SHOW, SW_SHOWNORMAL, SW_SHOWMINIMALIZE.
Dodaj jeszcze do listy uses słówko SHELLAPI Program możesz już odpalić. Pozostały jeszcze tylko kosmetyczne poprawki.
Fajnie by było gdyby na przyciskach widniały jakiś ikony, nie? Na palecie Win 32 znajduje się komponent ImageList - umieść go na komponencie. Naciśnij dwukrotnie na niego - otworzy się edytor w którym Importujemy ikony. Naciśnij na przycisku 'Add' i wybierz ikonę.Gdy wybierzesz dwie naciśnij na OK. Zaznacz komponent ToolBar1, w Inspektorze Obiektów z menu Images wybierz ImageList1. Ikony zostaną przypisane - program gotowy!