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);
{ 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;
for i:=1 to 360 do
PutPixel(GetMaxX div 2+Round(SIN(i)*50), GetMaxY div 2+Round(COS(i)*50),Yellow);
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 *.bgiinicjalizuje tryb graficznyDetect/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ęguBar (x1, y1, x2, y2: Integer);prostokąt, „słupek” – np. dla wykresów słupkowychBar3D (x1, y1, x2, y2: Integer; Depth: Word; Top: Boolean);słupek „trójwymiarowy”Circle (X,Y: Integer; Radius: Word);rysuje okrągClearDevice (X,Y: Integer; Radius: Word);czyszczenie ekranu graficznegoClearViewPort;czyszczenie okna (część ekranu), w trybie graficznymDetectGraph;sprawdza jaką kartę graficzną mamy do dyspozycji i w którym trybie graficznym właśnie pracujemyDrawPoly (NumPoints: Word; var PolyPoints);rysuje wielokątEllipse(X, Y: Integer; StAngle, EndAngle: Word; XRadius, YRadius: Word);rysuje elipsęFillEllipse (X, Y: Integer; XRadius, YRadius: Word);rysuje elipsę wypełnioną wewnątrzFillPoly (NumPoints: Word; var PolyPoints);rysuje wielokąt wypełniony wewnątrzFloodFill (X, Y: Integer; Border: Word);wypełnia zamknięty (ograniczony liniami o innym kolorze) region ekranuwcześniej trzeba wypełnić kolor i wzór „wypełniacza”GetArcCoords (var ArcCoords: _ArcCoordsType_);podaje współrzędne ostatnio rysowanego łukuGetAspectRatio (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 rysunkuGetBkColor: Word;podaje bieżący kolor tłaGetColor: Word;podaje bieżący kolor rysowaniaGetDefaultPalette (var Palette: PaletteType);ustawia domyślną paletę kolorówGetDriverName: 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 graficznyGetImage (x1, y1, x2, y2: Integer; var BitMap);zapamiętuje rysunekGetLineSettings (var LineInfo: LineSettingsType);podaje bieżący styl linii (ciągła, przerywana, grubość itp.)GetMaxColor: Word;podaje najwyższy dostępny numer koloruGetMaxMode: Integer;podaje najwyższy dostępny tryb graficznyGetMaxX: Integer;podaje maksymalną wartość współrzędnej X na ekranieGetMaxY: Integer;podaje maksymalną wartość współrzędnej Y na ekranieGetModeName (ModeNumber: Integer): string;podaje nazwę trybu graficznegoGetModeRange (GraphDriver:Integer; var LoMode, HiMode:Integer);podaje zakres dostępnych trybów graficznychGetPalette (var Palette: PaletteType);podaje bieżącą paletę kolorówGetPaletteSize: Integer;podaje wielkość palety kolorówGetPixel (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 numeremImageSize (x1, y1, x2, y2: Integer): Word;wielkość rysunku InstallUserDriver (Name: string; AutoDetectPtr: pointer): integer;instaluje sterownik graficzny użytkownikaInstallUserFont (FontFileName: string ): Integer;instaluje czcionki graficzne użytkownikaLine (x1, y1, x2, y2: Integer);rysuje linię prostąLineRel (Dx, Dy: Integer);rysuje linię prostą relatywnie do bieżącej pozycji kursora graficznegoLineTo (X, Y: Integer);rysuje linię od bieżącego położenia kursora do wskazanego punktuMoveRel (Dx, Dy: Integer);przesuwa kursor graficzny relatywnie (w stosunku do pozycji początkowej)MoveTo (X, Y: Integer);przesuwa kursor graficzny do wskazanego punktuOutText (TextString: string);wyprowadza tekstOutTextXY (X,Y: Integer; TextString: string);wyprowadza tekst począwszy od punktu o zadanych współrzędnych X i YPieSlice (X, Y: Integer; StAngle, EndAngle, Radius: Word);rysuje wycinek wykresu kołowegoPutImage (X, Y: Integer; var BitMap; BitBlt: Word);wstawia na ekran rysunekPutPixel (X, Y: Integer; Pixel: Word);zapala punkt na ekranieRectangle (x1, y1, x2, y2: Integer);rysuje prostokątRegisterBGIDriver (driver: pointer): Integer;rejestruje sterownik graficzny BGIRegisterBGIFont (Font: pointer): Integer;rejestruje czcionki dla środowiska DOSRestoreCrtMode;wraca do trybu tekstowego (zwykle na chwilę)Sector (x, y: Integer; StAngle,EndAngle, XRadius, YRadius: Word);rysuje wypełniony wycinek elipsy/okręguSetActivePage (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 ekranieSetAllPalette (var Palette);zmienia wszystkie kolory palety na podaneSetAspectRatio (Xasp, Yasp: Word): Word;ustawia skalę rysunkuSetBkColor (ColorNum: Word);ustawia kolor tłaSetColor (Color: Word);ustawia kolor rysunkuSetFillPattern (Pattern: FillPatternType; Color: Word);ustawia wzór “wypełniacza” wnętrza figur i regionówSetFillStyle (Pattern: Word; Color: Word);ustawia rodzaj „wypełniacza”SetGraphBufSize (BufSize: Word);ustawia wielkość bufora pamięci dla grafikiSetGraphMode (Mode: Integer);włącza tryb graficznySetLineStyle (LineStyle: Word; Pattern: Word; Thickness: Word);ustawia rodzaj linii (ciągła, przerywana, gruba itp.)SetPalette (ColorNum: Word; Color: Shortint);ustawia stosowaną paletę barwSetRGBPalette (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 tekstuSetTextStyle (Font, Direction: Word; CharSize: Word);ustawia styl tekstuSetUserCharSize (MultX, DivX, MultY, DivY: Word);ustawia wielkość czcionek użytkownikaSetViewPort (x1, y1, x2, y2: Integer; Clip: Boolean);ustawia okno graficzne na ekranieSetVisualPage (Page: Word);wybiera stronicę pamięci karty widoczną na ekranieSetWriteMode (WriteMode: Integer);ustawia tryb „nadrysowywania” na poprzedni rysunekTextHight (TextString: string): Word;ustawia wysokość tekstuTextWidth (TextString: string): Word;ustawia szerokość tekstu
Zamknięcie trybu graficznego
Closegraph
Procedura Circle
Składnia: Circle ( X,Y:integer; R:word ); biblioteka: GRAPH
Procedura rysuje koło o środku umieszczonym o współrzędnych X,Y, promieniu R i kolorze określonym przez procedurę SetColor.
Uses GRAPH,CRT;
Var
ster,tryb:integer;
Begin
ster:=VGA; tryb:=VGAHi;
InitGraph(ster, tryb, 'C:\BP\BGI' );
Circle(320,240,40); {1}
Repeat Until Keypressed; {2}
End.
{1} Rysujemy kołko o współrzędnych 320,240 ( jest to środek ekranu gdyż włączyliśmy tryb VGAHi, którego rozdzielczość to: 640x480 ) i o promieniu 40
{2} Czekamy aż zostanie wciśnięty jakiś klawisz ( spróbuj usunąć tą linię to dowiesz się dlaczego jest taka ważna )
lorun