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, &#8222;C:\\\\BORLANDC\\\\BGI&#8221;); 

 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,&#8221;?&#8221;); 

 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

5 komentarzy

Można by usunąć połowę tych enterów :-P "Zaśmiecają" tylko...

w jakim kompilatorze to działa??

Zastąp w arcie znaczki < - &lt i > - &gt, 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...