BGI
Adam Boduch
WITAM!!!
Obecnie zajmiemy się zagadnieniem, które przyda Wam się w dalszej karierze programisty w C++. Rozpoczniemy dzisiaj pracę nad grafiką w środowisku DOS. Zapewne wielu z Was w tym momencie podniosło głosy sprzeciwu:, DOS to prehistoria, przecież teraz króluje Windows. Może i tak, ale kto z Was uczył się jazdy na rowerze zanim nauczył się chodzić?:). Więc zaczynamy!
Grafika tworzona w środowisku DOS bywa nazywana grafiką BGI. Jej nazwa pochodzi od sterownika graficznego, z którego będziemy korzystać (BGI – Borland Graphics Interface).
Monitor komputera może pracować w dwóch trybach:
- tryb tekstowy (text mode, character mode)
- tryb graficzny (graphics mode)
Tryb graficzny w DOS i tryb graficzny w Windows to dwa różne typy pracy.
Najważniejszymi parametrami pracy strowników są:
-
ilość kolorów (paleta barw)
-
rozdzielczość (ilość pikseli na ekranie)
-
ilość pamięci (pamięć karty graficznej)
Do przełączania trybu tekstowego DOS(domyślnego) na graficzny (i odwrotnie) służą funkcje:
initgraph(....); - zainicjowanie trybu graficznego
closegraph(); - zamknięcie trybu graficznego i powrót do trybu tekstowego
W przypadku grafiki DOS BGI do programu musimy dołączyć moduł obsługi grafiki:
#include <graphics.h>
Po tych wstępnych wiadomościach przyjżyjmy się przykładowemu programowi:
#include <graphics.h>
#include <conio.h>
main()
{
int karta,tryb;
karta=DETECT;
initgraph(&karta, &tryb, „C:\\\\BORLANDC\\\\BGI”);
line(100,200,200,200);
circle(200,200,30);
getch()
closegraph();
return 0;
}
Omówienie:
karta - identyfikator karty graficznej
karta=DETECT - komputer sam sprawdza kartę graficzną zainstalowaną w komputerze. Bez słowa DETECT, będziemy musieli sami podać nazwę karty (np.VGA).
tryb - tryb graficzny (rozdzielczość, ilość kolorów).
Możemy używać następujących trybów graficznych:
Nazwa symboliczna Numer Rozdzielczość
VGAHI 2 640x480
VGAMED 1 640x350
VGALO 0 640x200
tryb= VGAHI oraz tryb=2 są określeniami równoważnymi (możemy stosować zarówno numerki jaki i nazwy symboliczne).
Jeżeli tryb nie zostanie określony (numerem lub nazwą symboliczną), funkcja initgraph(...) automatycznie wybierze tryb o najwyższej, możliwej dla danej karty, rozdzielszości.
initgraph(&karta, &tryb, „C:\\BORLANDC\\BGI”); - bezpośrednie zainicjowanie trybu graficznego, gdzie „C:\\BORLANDC\\BGI” oznacza ścieżkę dostępu do sterownika karty graficznej - *.BGI.
line(100,200,200,200) - program narysuje linię o wspólrzędnych podanych w nawiasach, gdzie pierwsze dwie liczby oznaczają współrzędne początka linii(od lewej strony, od góry) a dwie następne oznaczają jej koniec.
circle(200,200,30) - program rysuje okrąg w współrzędnych 200x200 oraz promieniu 30.
getch() - program czeka z przejściem z trybu graficznego do tekstowego do momentu naciśnięcia jakiegokolwiek klawisza.
closegraph() - przejście do trybu graficznego.
Oczywiście zachęcam do eksperymentów. Spróbujcie na przykład zmienić współrzędne figur lub narysujcie inne figury (np.prostokąty – rectangle(100,100,200,200).
Jak Wam już wiadomo, wykorzystując grafikę BGI możemy narysować różne figury geometryczne, ale nie tylko. Istnieje bardzo wiele funkcji i procedur graficznych BGI.
arc - łuk, wycinek okręgu
bar - prostokąt, np. dla wykresów słupkowych
bar3d - słupek „trójwymiarowy”
circle - okrąg
cleardevice - czyszczenie ekranu w tybie graficznym
cleraviewpor - czyszczenia części okna w trybie graficznym
closegraph - zamknięcie trybu graficznego
detectgraph - sprawdzenie karty graficznej i trybu graficznego
drawpoly - wielokąt
ellipse - elipsa
fillelipse - elipsa wypełniona wewnątrz
fillpoly - wielokąt wypełniony wewnątrz
floodfill - wypełnienie zamkniętego (ograniczonego liniami innego koloru) obszaru ekranu
getarccoords - współrzędne ostatnio rysowanego łuku
getacpectratio - współczynnik skali rysunku
getbkcolor - bieżący kolor tła
getcolor - bieżący kolor rysowania
getdefaultpalette - ustaw domyślną paletę kolorów
getdrivername - podaj nazwę sterownika graficznego
getfillpattern - podaj bieżący wzór wypełnienia
getfillsettings - podaj bieżący kolor i wzór wypełnienia
getgraphmode - podaj bieżący tryb graficzny
getimage - zapamiętaj rysunek
getlinesettings - podaj bieżący styl linii
getmaxcolor - podaj najwyższy dostępny numer koloru
getmaxmode - podaj najwyższy dostępny tryb graficzny
getmaxx - podaj najwyższą wartość współrzędnej x na ekranie
getmaxy - podaj najwyższą wartość wspólrzędnej y na ekranie
getmodename - podaj nazwę trybu graficznego
getmoderange - podaj zakres dostępnych trybów graficznych
getpalette - podaj bieżącą paletę kolorów
getpalettesize - podaj wielkość palety kolorów
getpixel - podaj kolor danego punktu na ekranie
gettextsettings - podaj bieżące ustawienia datyczące wprowadzanego tekstu
getviewsettings - podaj parametry bieżącego okna graficznego
getx - podaj bieżącą współrzędną x kursora graficznego
gety - podaj bieżącą współrzędną y kursora graficznego
graphdefaults - wróć do domyślnych ustawień trybu graficznego (kursor znajduje się na początku ekranu)
grapherrormsg - wyświetl komunikat o błędzie grafiki z zadanym numerem
graphresult - wynik zainicjowania trybu graficznego
imagesize - wielkość rysunku
initgraph - zainicjuj tryb graficzny
installuserdriver - zainstaluj sterownik graficzny użytkownika
instaluserfont - zainstaluj czcionki użytkownika
line - linia prosta
lineral - linia prosta do bieżącej pozycji kursora graficznego
lineto - linia od bieżącej pozycji kursora do wskazanego punktu
moverel - przesuń kursor graficzny
moveto - przesuń kursor graficzny do wskazanego puktu
outtext - wyprowadź (umieść) tekst
outtextxy - umieść tekst począwszy od punktu o podanych współrzędnych x i y
pieslice - narysuj wycinek wykresu kołowego
putimage - wstaw rysunek na ekran
putpixel - zapal (wstaw) punkt na ekranie
rectangle - prostokąt
registerbgidriver - zarejestruj sterownik graficzny bgi
registerbgifont - zarejestruj czcionki
restorectrmode - wróć na chwilę do trybu tekstowego
sector - wypełniony wycinek elipsy/okręgu
setactivepage - wybierz aktywną stronę
setallpalette - zmień wszystkie kolory palety na te podane
setaspectratio - ustaw skalę rysunku
setbkcolor - ustaw kolor tła
setcolor - ustaw kolor rysunku
setfillpatern - ustaw wzór wypełniacza
setfillstyle - ustaw rodzaj wypełniacza
setgraphbufsize - ustaw wielkość bufora pamięci dla grafiki
setgraphmode - włącz tryb graficzny
setlinestyle - ustaw rodzaj linii
setpalette - ustaw stosowaną paletę barw
setrgbpalette - ustaw paletę trójskładnikową (chyba nie trzeba wyjaśniać, co oznacza skrót RGB?)
settextjustify - ustaw sposób wyrównywania tekstu
settextstyle - ustaw styl tekstu
setusercharsize - ustaw wielkość czcionek użytkownika
setviewport - ustaw okno graficzne na ekranie
setvisualpage - ustaw stronicę pamięci karty graficznej widoczną na ekranie
setwritemode - ustaw tryb „nadrysowania” na poprzedni rysunek
textheight - ustaw wysokość tekstu
textwidth -ustaw szerokość tekstu
Powyższe funkcje i procedury potrzebują do poprawnego działanie dodatkowych parametrów. Pomocy na ich temat szukajcie w pomocy podręcznej kompilatorów, książkach lub czekajcie na dalsze części naszego kursu.
Wypełnianie figur
Zaczniemy od prostego przykładu:
#include <graphics.h>
#include <conio.h>
main()
{
int Karta=Detect,Tryb;
initgraph(&Kara,&Tryb,”?”);
setbkcolor(BLUE);
setcolor(RED);
circle(100,100,50);
setfillstyle(5,GREEN);
floodfill(101,101,RED);
rectangle(160,160,200,200);
setfillstyle(7,MAGENTA);
floodfill(161,161,RED);
getch();
closegraph();
return 0;
}
Omówienia:
initgraph(&Karta,&Tryb,”?”); - znak ? oznacza, że w to miejsce należy wstawić ścieżkę dostępu do BGI.
setbkcolor(BLUE); - ustawienie tła na kolor niebieski.
setcolor(RED); - ustawienie koloru rysunku na czerwony.
setfillstyle(5,GREEN); - ustawienie sposobu wypełnienia figury:5 oznacza wzór linii ukośnych grubszych a GREEN oznacza kolor wzoru.
floodfill(101,101,RED); - współrzedne wypełnienia. Liczby oznaczają początek wypełnianego obszaru - należy pamiętać, aby współrzędne nie leżały poza rysunkiem, ponieważ w przeciwnym razie wypełnienu może ulec cały ekran. RED oznacza kolor linii ograniczających wypełniany obszar - należy pamiętać, aby zawsze podawać w tym miejscy kolor rysunku (obszaru), który chcemy wypełnić, w przeciwnym razie wypełnienu ulegnie inny obszar.
Wszelkie pytania i sugestie proszę przesyłać na mój adres e-mail. Z góry przepraszam, jeśli odpowiedzi na niektóre listy przyjdą z opóźnieniem, jest to spowodowane tym, że jestem teraz w trakcie pisania mojej pracy dyplomowej i nie zawsze mogę odpowiadać na czas.
Mój e-mail: black13.dark@tenbit.pl
Mr. Black
Można by usunąć połowę tych enterów :-P "Zaśmiecają" tylko...
w jakim kompilatorze to działa??
Zastąp w arcie znaczki < - < i > - >, bo ich nie widać!
IMHO BGI jest do bani - strasznie wolne i wogole przestarzale...
Tja... zdobylem komplikator ale wole C++ Buldier'a :P
Mój brat programował jesze w trybie 13 tyle że do tego potrzebne są jeszcze dodatkowe biblioteki...ale efekty tego były całkiem całkiem...