Moduł Graph - Wprowadzenie
Jeśli nie znamy się na trybach ekranowych dostępnych z asemblera nie ma się czym przejmować. Poza tym, trzeba to powiedzieć sobie szczerze - programowanie w asemblerze jest znacznie żmudniejsze i trudniejsze.
Każda szanująca się firma produkująca kompilatory Pascala dołącza do niego potężny zestaw gotowych już funkcji i procedur graficznych dostępnych w module Graph. Na pewno go masz! Jeśli nie - możesz znaleźć go na wielu stronach i serwisach poświęconych programowaniu.
W pierwszym programiku wykorzystującym moduł Graph uruchomimy autotest a później zainicjujemy tryb graficzny odpowiadający naszej karcie graficznej.
Opiszę najważniejsze fragmenty programu:
Poniższa procedura wykrywa naszą kartę oraz tryb graficzny, który obsługuje.
DetectGraph(Karta,Tryb); { u mnie karta 9 - VSA, tryb 2 - VGAHi }
Po detekcji jest inicjalizacja. Poniższa procedura stawia już tylko przysłowiową kropkę nad i. Trzecim parametrem jest katalog, w którym znajdują się sterowniki graficzne i czcionki.
InitGraph(Karta,Tryb,'c:\bp\bgi');
Spójrzmy na prostą detekcję naszej karty graficznej i jej parametrów.
program detekcja;
uses graph;
var i,x,y : integer;
Karta, Tryb : Integer;
begin
DetectGraph(Karta,Tryb);
InitGraph(Karta,Tryb,'c:\bp\bgi');
{ jestesmy teraz 'wewnatrz' trybu graficznego }
x:= getmaxx;
y:= getmaxy;
CloseGraph;
writeln('Sterownik graficzny numer: ',Karta);
writeln('Tryb : ',Tryb);
writeln('Rozdzielczosc: ',x,' X ',y);
Readln;
end.
W kolejnym programie zaprezentuję procedurę PutPixel(z modułu Graph), jej parametrami są: pozycja X, pozycja Y, kolor zapisany jako łańcuch lub jako wartość liczbowa.
Program rysuje koło z wykorzystaniem funkcji sinus i cosinus.
Oczywiście w module Graph są gotowe funkcje rysujące koła etc.(o czym później), ale chciałem pokazać na jakiej zasadzie są one tworzone - wszystkie bowiem figury są opisywane przez równania matematyczne.
program kolo_sin_cos_biegunowo;
uses
graph,crt;
var i,x,y : integer;
Karta, Tryb : Integer;
begin
DetectGraph(Karta,Tryb); { u mnie karta 9 - VSA, tryb 2 - VGAHi }
InitGraph(Karta,Tryb,'c:\bp\bgi');
for i:=1 to 360 do
PutPixel(GetMaxX div 2+Round(SIN(i)*50), GetMaxY div 2+Round(COS(i)*50),Yellow);
Readln;
CloseGraph;
end.
Inicjalizacja trybu graficznego
InitGraph (Sterownik: Integer, Tryb: Integer, Ścieżka: String);
sterownik - identyfikator karty sterownika graficznego;
tryb - tryb graficzny (rozdzielczość, ilość kolorów);
ścieżka - katalog, w którym znajduje się sterownik *.bgi
inicjalizuje tryb graficzny
Detect/0;
wykrywa kartę graficzną
GraphResult: Integer;
wynik zainicjowania trybu graficznego
(jeśli jest grOk, to w porządku)
Operacje trybu graficznego
Arc (X,Y; Integer; StAngle, EndAngle, Radius; Word);
łuk, wycinek okręgu
Bar (x1, y1, x2, y2: Integer);
prostokąt, „słupek” - np. dla wykresów słupkowych
Bar3D (x1, y1, x2, y2: Integer; Depth: Word; Top: Boolean);
słupek „trójwymiarowy”
Circle (X,Y: Integer; Radius: Word);
rysuje okrąg
ClearDevice (X,Y: Integer; Radius: Word);
czyszczenie ekranu graficznego
ClearViewPort;
czyszczenie okna (część ekranu), w trybie graficznym
DetectGraph;
sprawdza jaką kartę graficzną mamy do dyspozycji i w którym trybie graficznym właśnie pracujemy
DrawPoly (NumPoints: Word; var PolyPoints);
rysuje wielokąt
Ellipse(X, Y: Integer; StAngle, EndAngle: Word; XRadius, YRadius: Word);
rysuje elipsę
FillEllipse (X, Y: Integer; XRadius, YRadius: Word);
rysuje elipsę wypełnioną wewnątrz
FillPoly (NumPoints: Word; var PolyPoints);
rysuje wielokąt wypełniony wewnątrz
FloodFill (X, Y: Integer; Border: Word);
wypełnia zamknięty (ograniczony liniami o innym kolorze) region ekranu
wcześniej trzeba wypełnić kolor i wzór „wypełniacza”
GetArcCoords (var ArcCoords: _ArcCoordsType_);
podaje współrzędne ostatnio rysowanego łuku
GetAspectRatio (var Xasp, Yasp: Word);
zwraca współczynniki „skali rysunku” (aspect ratio); ponieważ proporcje rozdzielczości (w pikselach) po poziomej osi X i po pionowej osi Y są różne dla różnych kart graficznych, pozwala na skalowanie rysunku
GetBkColor: Word;
podaje bieżący kolor tła
GetColor: Word;
podaje bieżący kolor rysowania
GetDefaultPalette (var Palette: PaletteType);
ustawia domyślną paletę kolorów
GetDriverName: String;
podaje nazwę sterownika graficznego (karty)
GetFillPattern (var FillPattern: FillPatternType);
podaje bieżący wzorek „wypełniacza”
GetFillSettings (var FillInfo: FillSettingsType);
podaje bieżący kolor i wzorek „wypełniacza”
GetGraphMode: Integer;
podaje bieżący tryb graficzny
GetImage (x1, y1, x2, y2: Integer; var BitMap);
zapamiętuje rysunek
GetLineSettings (var LineInfo: LineSettingsType);
podaje bieżący styl linii (ciągła, przerywana, grubość itp.)
GetMaxColor: Word;
podaje najwyższy dostępny numer koloru
GetMaxMode: Integer;
podaje najwyższy dostępny tryb graficzny
GetMaxX: Integer;
podaje maksymalną wartość współrzędnej X na ekranie
GetMaxY: Integer;
podaje maksymalną wartość współrzędnej Y na ekranie
GetModeName (ModeNumber: Integer): string;
podaje nazwę trybu graficznego
GetModeRange (GraphDriver:Integer; var LoMode, HiMode:Integer);
podaje zakres dostępnych trybów graficznych
GetPalette (var Palette: PaletteType);
podaje bieżącą paletę kolorów
GetPaletteSize: Integer;
podaje wielkość palety kolorów
GetPixel (X,Y: Integer): Word;
podaje stan wskazanego punktu na ekranie (jaki ma kolor?)
GetTextSettings (var TextInfo: TextSettingsType);
podaje bieżące ustawienia do wprowadzania tekstu (współrzędne, kolor, czcionka itp.)
GetViewSettings (var ViewPort: ViewPortType);
podaje parametry bieżącego okna graficznego (View Port Settings)
GetX: Integer;
podaje bieżącą współrzędną X kursora graficznego (niewidocznego)
GetY: Integer;
podaje bieżącą współrzędną Y kursora graficznego (niewidocznego)
GraphDefaults;
wraca do domyślnych ustawień trybu graficznego, ustawia kursor graficzny w punkcie (0,0)
GraphErrorMsg (ErrorCode: Integer): string;
podaje komunikat o błędzie grafiki z zadanym numerem
ImageSize (x1, y1, x2, y2: Integer): Word;
wielkość rysunku
InstallUserDriver (Name: string; AutoDetectPtr: pointer): integer;
instaluje sterownik graficzny użytkownika
InstallUserFont (FontFileName: string ): Integer;
instaluje czcionki graficzne użytkownika
Line (x1, y1, x2, y2: Integer);
rysuje linię prostą
LineRel (Dx, Dy: Integer);
rysuje linię prostą relatywnie do bieżącej pozycji kursora graficznego
LineTo (X, Y: Integer);
rysuje linię od bieżącego położenia kursora do wskazanego punktu
MoveRel (Dx, Dy: Integer);
przesuwa kursor graficzny relatywnie (w stosunku do pozycji początkowej)
MoveTo (X, Y: Integer);
przesuwa kursor graficzny do wskazanego punktu
OutText (TextString: string);
wyprowadza tekst
OutTextXY (X,Y: Integer; TextString: string);
wyprowadza tekst począwszy od punktu o zadanych współrzędnych X i Y
PieSlice (X, Y: Integer; StAngle, EndAngle, Radius: Word);
rysuje wycinek wykresu kołowego
PutImage (X, Y: Integer; var BitMap; BitBlt: Word);
wstawia na ekran rysunek
PutPixel (X, Y: Integer; Pixel: Word);
zapala punkt na ekranie
Rectangle (x1, y1, x2, y2: Integer);
rysuje prostokąt
RegisterBGIDriver (driver: pointer): Integer;
rejestruje sterownik graficzny BGI
RegisterBGIFont (Font: pointer): Integer;
rejestruje czcionki dla środowiska DOS
RestoreCrtMode;
wraca do trybu tekstowego (zwykle na chwilę)
Sector (x, y: Integer; StAngle,EndAngle, XRadius, YRadius: Word);
rysuje wypełniony wycinek elipsy/okręgu
SetActivePage (Page: Word);
wybiera aktywną stronę (czyli taką, na której odbywa się rysowanie); wszystkie operacje mogą odbywać się wyłącznie w pamięci; Visual/Visible Page - strona na bieżąco odwzorowywana na ekranie
SetAllPalette (var Palette);
zmienia wszystkie kolory palety na podane
SetAspectRatio (Xasp, Yasp: Word): Word;
ustawia skalę rysunku
SetBkColor (ColorNum: Word);
ustawia kolor tła
SetColor (Color: Word);
ustawia kolor rysunku
SetFillPattern (Pattern: FillPatternType; Color: Word);
ustawia wzór “wypełniacza” wnętrza figur i regionów
SetFillStyle (Pattern: Word; Color: Word);
ustawia rodzaj „wypełniacza”
SetGraphBufSize (BufSize: Word);
ustawia wielkość bufora pamięci dla grafiki
SetGraphMode (Mode: Integer);
włącza tryb graficzny
SetLineStyle (LineStyle: Word; Pattern: Word; Thickness: Word);
ustawia rodzaj linii (ciągła, przerywana, gruba itp.)
SetPalette (ColorNum: Word; Color: Shortint);
ustawia stosowaną paletę barw
SetRGBPalette (ColorNum, RedValue, GreenValue, BlueValue: Integer);
ustawia paletę trójskładnikową (R=Red, G=Green, B=Blue)
SetTextJustify (Horiz, Vert: Word);
ustawia sposób wyrównywania tekstu
SetTextStyle (Font, Direction: Word; CharSize: Word);
ustawia styl tekstu
SetUserCharSize (MultX, DivX, MultY, DivY: Word);
ustawia wielkość czcionek użytkownika
SetViewPort (x1, y1, x2, y2: Integer; Clip: Boolean);
ustawia okno graficzne na ekranie
SetVisualPage (Page: Word);
wybiera stronicę pamięci karty widoczną na ekranie
SetWriteMode (WriteMode: Integer);
ustawia tryb „nadrysowywania” na poprzedni rysunek
TextHight (TextString: string): Word;
ustawia wysokość tekstu
TextWidth (TextString: string): Word;
ustawia szerokość tekstu
Zamknięcie trybu graficznego
CloseGraph;zamyka tryb graficzny (powrót do trybu tekstowego)