Delphi __ Kompendium __ Roz9.pdf

(1636 KB) Pobierz
Delphi :: Kompendium :: Roz...
Delphi :: Kompendium :: Rozdział 9 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_9
Logowanie | Rejestracja | Forum | Pomoc | Reklama | Szukaj
Strona główna :: Delphi :: Kompendium
Rozdział 9
Edytuj
Historia
Delphi
Artykuły
Kompendium
Gotowce
FAQ
.NET
Turbo Pascal
FAQ
PHP
FAQ
Java
FAQ
C/C++
Artykuły
FAQ
C#
Wprowadzenie
Assembler
FAQ
(X)HTML
CSS
JavaScript
Z pogranicza
Algorytmy
WIĘCEJ »
Multimedia
Na samym początku wypadałoby wyjaśnić, co kryje się pod pojęciem multimedia. Najprościej rzecz ujmując,
jest to nazwa określająca techniki komputerowe służące do przekazywania informacji, w tym różne środki
przekazu. Mam na myśli dźwięk, obraz, film, animację itp.
Spis treści
1 Z czego będziemy korzystać?
1.1 OpenGL
1.2 DirectX
2 Tworzenie bitmap
2.1 Korzystanie z komponentu TImage
3 Klasa TBitmap
3.1 Odczytywanie obrazka ze schowka
3.1.1 Odczyt danych
3.1.2 Zapisywanie danych
4 Pliki JPEG
4.1 Klasa TJPEGImage
4.2 Wyświetlanie obrazków w komponencie TImage
4.3 Przykład działania ? kompresja plików
5 Pliki GIF
6 Zasoby
6.1 Tworzenie zasobów
6.1.1 Dołączanie bitmapy
6.1.2 Pozostałe zasoby
6.2 Wykorzystanie zasobów
6.2.1 Ładowanie bitmapy
6.2.2 Ładowanie ikony
6.2.3 Ładowanie kursora
6.3 Ręczne tworzenie zasobów
6.3.1 Dodawanie plików JPEG
6.3.2 Ładowanie pliku JPG
6.4 Doklejanie plików EXE
7 Klasa TCanvas
8 Pióra i pędzle
8.1 Klasa TPen
8.1.1 Właściwość Mode
8.1.2 Właściwość Style
8.2 Klasa TBrush
8.2.1 Właściwość Style
9 Czcionki
9.1 Właściwości klasy TFont
10 Metody klasy TCanvas
10.1 Draw
10.2 FillRect
10.3 StretchDraw
10.4 TextOut
10.5 TextRect
10.6 TextWidth, TextHeight
10.7 TextExtent
10.8 MoveTo
10.9 LineTo
10.10 Inne funkcje służące do rysowania kształtów
10.11 Przykładowy program
11 Proste animacje tekstowe
11.1 Tekst trójwymiarowy (3D)
11.2 Efekt maszyny do pisania
11.3 Animacja na belce tytułowej
11.4 Inne płynne animacje
12 Odtwarzanie dźwięków
12.1 Funkcja PlaySound
12.2 Użycie komponentu TMediaPlayer
13 Odtwarzanie filmów
13.1 Odtwarzanie filmu
13.2 Pozycja odtwarzanego filmu
13.3 Ustawianie głośności
14 Kontrolka Flash
14.1 Instalacja kontrolki
14.2 Wykorzystanie komponentu
15 Podsumowanie
Delphi
C/C++
Turbo Pascal
Assembler
PHP
Programy
Dokumentacja
Kursy
Komponenty
WIĘCEJ »
Rozdział 9. będzie właśnie poświęcony tworzeniu grafiki, odtwarzaniu dźwięków, wyświetlaniu filmów oraz
tworzeniu animacji. Nie oczekuj, że od razu będziesz projektował świetne animacje ? do stworzenia takiej
grafiki, jaką możemy zobaczyć w grach, potrzebna jest znajomość programowania OpenGL lub DirectX, a to
wykracza poza ramy tej książki.
W tym rozdziale:
dowiesz się, na czym polega malowanie w Delphi;
napiszemy program umożliwiający odtwarzanie dźwięków;
pokażę, w jaki sposób za pomocą komponentu TMediaPlayer można wyświetlić film;
1 z 30
2009-03-14 15:38
77981183.012.png 77981183.013.png 77981183.014.png 77981183.015.png 77981183.001.png 77981183.002.png
Delphi :: Kompendium :: Rozdział 9 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_9
8nauczysz się tworzyć proste animacje.
RSS | Forum | Pastebin |
Regulamin | Pomoc | Usuń
cookies | Prawa autorskie |
Kontakt | Reklama
Z czego będziemy korzystać?
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 2.8607 sek. (zapytań SQL:
12)
W Delphi nie mamy zbyt dużego wyboru narzędzi, jakimi moglibyśmy się posługiwać. Malowanie po formularzu
ogólnie polega na zastosowaniu różnych funkcji WinAPI, lecz zostało ono nieco uproszczone dzięki klasie
TCanvas (płótno). Moim skromnym zdaniem Delphi nie nadaje się do tworzenia zaawansowanej grafiki, mimo
że posiada wspomaganie narzędzi typu OpenGL czy DirectX. Jednak jest to tylko moje zdanie; wiele osób
uważa, że jest wręcz przeciwnie ? w Delphi można tworzyć wspaniałe programy z grafiką.
OpenGL
OpenGL, czyli Open Graphics Library , to biblioteka służąca do tworzenia aplikacji graficznych. W rzeczywistości
jest to mały plik DLL, który ułatwia tworzenie różnych aplikacji wykorzystujących skomplikowane efekty
graficzne (3D, 2D, obroty, światła itp.). Według niektórych obsługa tej biblioteki jest ?czarną magią?, a dla
innych z kolei jest bardzo prosta. Jedno jest pewne: aby programować przy użyciu OpenGL, potrzebna jest
dobra znajomość matematyki oraz fizyki. Listing 9.1 przedstawia bardzo prosty program napisany przy użyciu
biblioteki OpenGL, wyświetlający prosty trójkąt.
Listing 9.1. Prosty program napisany przy użyciu OpenGL
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OpenGL;
type
TMainForm = class ( TForm )
procedure FormCreate ( Sender: TObject ) ;
procedure FormDestroy ( Sender: TObject ) ;
procedure FormResize ( Sender: TObject ) ;
private
RC : HGLRC; // rendering
DC : HDC; // moduł
procedure glDraw;
procedure Idle ( Sender: TObject ; var Done: Boolean ) ;
end ;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
procedure TMainForm. glDraw () ;
begin
glClear ( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT ) ; // czyszczenie
glLoadIdentity () ; // także czyszczenie
// procedura tworząca wierzchołki w przestrzeni (tutaj trójkąty)
glTranslate ( 0 , - 1 , - 2 ) ; // nasza pozycja lub raczej przesunięcie o wektor wierzchołków
// przypominam, że w OpenGL występuje system x,y,z
glRotatef ( 10 , 20 , - 10 , 0 ) ; // obrócenie widoku o dany kąt
// procedura rysująca trójkąt
glBegin ( GL_TRIANGLES ) ;
glVertex3f ( 0 , 0 , 0 ) ;
glVertex3f ( 0 . 5 , 0 . 5 , 0 ) ;
glVertex3f ( 1 , 0 , 0 ) ;
glEnd () ;
// procedura rysująca zwroty x,y,z, gdzie:
// x - czerwony,
// y - zielony,
// z - niebieski.
glColor3f ( 1 , 0 , 0 ) ;
glBegin ( GL_LINES ) ;
glVertex3f ( 0 , 0 , 0 ) ;
glVertex3f ( 2 , 0 , 0 ) ;
glColor3f ( 0 , 1 , 0 ) ;
glVertex3f ( 0 , 0 , 0 ) ;
glVertex3f ( 0 , 2 , 0 ) ;
glColor3f ( 0 , 0 , 1 ) ;
glVertex3f ( 0 , 0 , 0 ) ;
glVertex3f ( 0 , 0 , 2 ) ;
glEnd () ;
glColor3f ( 1 , 1 , 1 ) ;
end ;
procedure glInit () ;
begin
glClearColor ( 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ; // kolor wypełnienia: r - czerwony, g -
zielony, b - niebieski, a - przezroczystość
glShadeModel ( GL_SMOOTH ) ;
glClearDepth ( 1 . 0 ) ;
glEnable ( GL_DEPTH_TEST ) ;
glDepthFunc ( GL_LESS ) ;
glHint ( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
end ;
procedure TMainForm. FormCreate ( Sender: TObject ) ;
var
pFd : TPIXELFORMATDESCRIPTOR;
pF : Integer ;
begin
DC := GetDC ( Handle ) ; // uchwyt modułu OpenGL
pFd. nSize := SizeOf ( pFd ) ;
pFd. nVersion := 1 ;
pFd. dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER or 0 ;
pFd. iPixelType := PFD_TYPE_RGBA;
pFd. cColorBits := 32 ;
pF := ChoosePixelFormat ( DC, @pFd ) ;
SetPixelFormat ( DC, pF, @pFd ) ;
2 z 30
2009-03-14 15:38
77981183.003.png 77981183.004.png 77981183.005.png 77981183.006.png
Delphi :: Kompendium :: Rozdział 9 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_9
RC := wglCreateContext ( DC ) ; // nasza scenka
wglMakeCurrent ( DC, RC ) ;
Resize;
Application. OnIdle := Idle; //ustalenie wartości ciągłego renderowania
glInit;
end ;
procedure TMainForm. FormDestroy ( Sender: TObject ) ;
begin
{ Usuniecie uchwytów z pamięci }
wglMakeCurrent ( 0 , 0 ) ;
wglDeleteContext ( rc ) ;
end ;
procedure TMainForm. Idle ( Sender: TObject ; var Done: Boolean ) ;
begin
glDraw () ; // renderowanie sceny
SwapBuffers ( DC ) ; // przeniesienie z bufora na ekran
end ;
procedure TMainForm. FormResize ( Sender: TObject ) ;
begin
glViewport ( 0 , 0 , Width, Height ) ; // okienko (rozmiary)
glMatrixMode ( GL_PROJECTION ) ;
glLoadIdentity () ;
gluPerspective ( 110 . 0 , Width / Height, 0 . 01 , 100 . 0 ) ;
{
pierwsza wartość (110.0) to kąt widzenia, domyślnie 90,
druga to kalkulacja perspektywy - zawsze szerokość/wysokość,
trzecia - z jakiej najbliższej odległości nie rysować sceny,
czwarta - z jakiej najdalszej odległości nie rysować sceny;
}
glMatrixMode ( GL_MODELVIEW ) ;
end ;
end .
Jak mówiłem, z OpenGL wiąże się sporo działań matematycznych, lecz przed ich użyciem należy zainicjować
bibliotekę. Delphi zawiera moduł OpenGL.pas, który importuje wszystkie potrzebne procedury z pliku
OpenGL.dll i ułatwia korzystanie z dobrodziejstw oferowanych nam przez ową bibliotekę.
Więcej na temat biblioteki OpenGL możesz dowiedzieć się z książek Wydawnictwa Helion:
OpenGL. Księga eksperta oraz Programowanie gier w OpenGL. Informacje na temat tej
biblioteki możesz znaleźć także pod adresami:
http://www.opengl.org ? strona poświęcona OpenGL;
http://www.eecs.tulane.edu/www/Terry/OpenGL/Introduction.html ? kurs OpenGL.
DirectX
Odpowiedzią Microsoftu na powstanie biblioteki OpenGL była biblioteka DirectX. DirectX obejmuje większy
zakres multimediów, jak np. obsługę dźwięku lub urządzeń typu dżojstik. Wadą DirectX jest to, że obsługuje go
jedynie system Windows ? w odróżnieniu od OpenGL, który dostępny jest praktycznie dla każdej platformy.
Jeśli chcemy napisać program w oparciu o DirectX, sprawa jest nieco prostsza, a to dzięki komponentom z serii
DelphiX. Należy je pobrać z Internetu i zainstalować (instalacją komponentów zajmiemy się w III części
książki) ? wówczas na palecie komponentów znajdzie się kilka kontrolek, dzięki którym tworzenie aplikacji w
oparciu o DirectX stanie się o wiele łatwiejsze.
Tworzenie bitmap
Na początek zajmiemy się rzeczą najprostszą ? ładowaniem, wyświetlaniem i zapisywaniem plików typu *.bmp,
czyli inaczej mówiąc ? bitmap. VCL jak zawsze o wiele bardziej ułatwia sprawę ? dzięki tej bibliotece
wyświetlenie obrazka staje się bardzo proste. Możemy wykorzystać chociażby komponent TImage .
Korzystanie z komponentu TImage
Komponent TImage jest bardzo przydatny, jeśli chodzi o wyświetlanie obrazków, a jednocześnie bardzo prosty
w użyciu. Aby załadować obrazek do komponentu jeszcze w trakcie projektowania programu, wystarczy
skorzystać z właściwości Picture (rysunek 9.1).
Rysunek 9.1. Zaznaczona właściwość Picture
Kliknięcie przycisku wielokropka spowoduje wyświetlenie edytora obrazków (Picture Editor) ? patrz rysunek 9.2.
3 z 30
2009-03-14 15:38
77981183.007.png 77981183.008.png
Delphi :: Kompendium :: Rozdział 9 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_9
Rysunek 9.2. Okno Picture Editor
Naciśnięcie przycisku Load spowoduje wyświetlenie okna służącego do wyboru pliku graficznego. Następnie taki
plik graficzny zostanie umiejscowiony w komponencie TImage i skompilowany wraz z programem (włączony do
wynikowego pliku EXE).
Usunięcie owego pliku nastąpi po naciśnięciu przycisku Clear .
Ładowanie obrazków w trakcie działania programu
Umieść na formularzu komponent TImage
2.
Właściwości Align komponentu TImage nadaj wartość alClient .
3.
Zmień właściwość Stretch komponentu TImage na True .
4.
Wygeneruj zdarzenie OnCreate formularza i umieść w nim taki kod:
procedure TMainForm. FormCreate ( Sender: TObject ) ;
begin
Image. Picture . Bitmap . LoadFromFile ( 'helion.bmp' ) ;
end ;
Na samym początku po umieszczeniu komponentu na formularzu i rozciągnięciu go na całą szerokość nadałeś
właściwości Stretch wartość True . Spowoduje to, że każdy obrazek załadowany do komponentu zostanie
rozciągnięty lub zwężony tak, aby dostosować się do rozmiarów komponentu (rysunek 9.3).
Rysunek 9.3. Program w trakcie działania
Powróćmy do kodu, który powoduje załadowanie bitmapy. Teraz właśnie masz okazję docenić zalety biblioteki
VCL ? wystarczy jeden wiersz kodu! Najpierw za pomocą operatora kropki (.) odwołujemy się do obiektu
TPicture , a następnie do obiektu TBitmap . Klasa TBitmap zawiera natomiast procedurę LoadFromFile, która
umożliwia załadowanie obrazka z pliku.
Podczas ładowania obrazka należy zwrócić uwagę, czy jest on rzeczywiście zapisany w
formacie BMP. W przeciwnym wypadku wykonany zostanie wyjątek EInvalidType .
Klasa TBitmap
Do operowania na samych plikach *.bmp służy klasa TBitmap . Dzięki niej możliwe jest dokonywanie operacji
pamięciowych, tzn. operacji na bitmapie odbywających się w pamięci komputera i nie dających rezultatów dla
użytkownika.
Przed wykorzystaniem metod klasy TBitmap należy ją utworzyć:
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap. Create ;
try
{ operacje na bitmapie }
finally
Bitmap. Free ; // zwolnienie klasy
end ;
end ;
Tworzenie oraz niszczenie obiektu odbywa się identycznie jak w przypadku innych klas VCL. W tabelach 9.1
oraz 9.2 przedstawiam najważniejsze właściwości oraz metody klasy TBitmap .
Tabela 9.1. Najważniejsze właściwości klasy TBitmap
Właściwość Opis
Canvas
Wskazanie na klasę TCanvas ? zajmiemy się tym nieco później
4 z 30
2009-03-14 15:38
1.
77981183.009.png 77981183.010.png
Delphi :: Kompendium :: Rozdział 9 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_9
Empty
Właściwość przybiera wartość True, jeśli bitmapa nie jest załadowana
Height
Wysokość bitmapy (w pikselach)
IgnorePalette
Możesz przydzielić tej właściwości wartość True, jeśli szybkość ładowania jest priorytetowa
? wówczas wyświetlana bitmapa będzie posiadała jedynie 255 kolorów
PixelFormat
Określa format pikseli: pf1bit (1 bit na piksel ? bitmapa czarno-biała), pf4bit, pf8bit,
pf15bit, pf16bit, pf24bit, pf32bit, pfCustom (nieokreślone).
TransparentColor
Zwraca kolor pierwszego piksela w bitmapie (jeżeli TransparentMode jest ustawione na
tmAuto)
TransparentMode
Określa rodzaj przezroczystości. Jeżeli właściwość ma ustawioną wartość tmAuto, to kolor
przezroczystości jest określany na podstawie lewego dolnego piksela. Jeżeli właściwość
ma ustawioną wartość tmFixed, oznacza to, że kolor przezroczystości ma być odczytany z
obiektu
Transparent
Właściwość określa sposób malowania bitmapy. Po ustawieniu wartości True bitmapa
będzie przezroczysta
Width
Określa szerokość bitmapy w pikselach
Modified
Właściwość określa, czy bitmapa została zmodyfikowana
Tabela 9.2. Najważniejsze metody klasy TBitmap
Metoda Opis
LoadFromClipboardFormat Procedura powoduje załadowanie obrazka, który znajduje się obecnie w schowku
LoadFromResourceID Ładuje bitmapę z zasobów (o tym w dalszej części rozdziału) na podstawie ID
LoadFromResourceName Ładuję bitmapę z zasobów na podstawie nazwy zasobu
LoadFromStream Ładuje bitmapę, która jest zapisana w strumieniu (TStream)
LoadFromFile Ładuje bitmapę z pliku
SaveToFile Zapisuje bitmapę do pliku
SaveToStream Zapisuje bitmapę do strumienia (TStream)
SaveToClipboardFormat Kopiuję bitmapę do schowka
FreeImage
Zwalnia obrazek i jednocześnie także pamięć
Odczytywanie obrazka ze schowka
Może zboczymy w tym momencie trochę z tematu grafiki, albowiem zamierzam opisać sposoby wykorzystania
schowka w operowaniu grafiką, a dokładnie zapisywanie do schowka oraz odczytywanie.
Schowek jest specjalnym mechanizmem systemu Windows, umożliwiającym zapisywanie i
przechowywanie dowolnych informacji (tekst, grafika) na potrzeby jednego lub kilku
programów.
Zapis oraz odczyt danych ze schowka umożliwiają dwie funkcje klasy TBitmap : LoadFromClipboardFormat oraz
SaveToClipboardFormat .
procedure SaveToClipboardFormat ( var AFormat: Word ; var AData: THandle; var APalette: HPALETTE ) ;
override ;
procedure LoadFromClipboardFormat ( AFormat: Word ; AData: THandle; APalette: HPALETTE ) ; override ;
Ogólnie do wykorzystania schowka służy moduł Clipbrd , więc na samym początku będziesz musiał dodać go do
listy uses. Operowanie klasą TClipBoard (znajduje się ona w module Clipbrd ) jest całkiem proste.
Zapisywanie i odczytywanie danych może odbywać się za pomocą procedur GetAsHandle oraz SetAsHandle .
Ogólnie w schowku może być kilka rodzajów danych (patrz tabela 9.3), lecz my chcemy odczytać jedynie dane
w postaci bitmapy ( CF_BITMAP ).
Tabela 9.3. Rodzaje danych mogących znaleźć się w schowku
Flaga Rodzaj danych
CF_TEXT Tekst
CF_BITMAP Grafika w postaci bitmapy
CF_METAFILEPICT Plik metafile
CF_PICTURE Zdjęcie (obiekt typu TPicture)
CF_COMPONENT Dowolny inny obiekt
Odczyt danych
Image. Picture . Bitmap . LoadFromClipboardFormat ( CF_BITMAP, ClipBoard. GetAsHandle ( CF_BITMAP ) , 0 ) ;
W pierwszym parametrze podajemy rodzaj danych do odczytania; drugi parametr to już wywołanie funkcji
GetAsHandle z klasy TClipBoard . Funkcja ta ma za zadanie odczytać dane i zwraca do nich uchwyt ( THandle ).
Wcześniej wypadałoby sprawdzić, czy w schowku rzeczywiście znajdują się dane w postaci bitmapy ? inaczej
Delphi wywoła wyjątek:
if ClipBoard. HasFormat ( CF_BITMAP ) then { tutaj kod }
5 z 30
2009-03-14 15:38
77981183.011.png
Zgłoś jeśli naruszono regulamin