Programowanie w języku C/C++ » Artykuły

BGI

  • 2011-04-17 09:50
  • 5 komentarzy
  • 3797 odsłon
  • Oceń ten tekst jako pierwszy
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, &#8222;C:\\\\BORLANDC\\\\BGI&#8221;); - bezpośrednie zainicjowanie trybu graficznego,  gdzie &#8222;C:\\\\BORLANDC\\\\BGI&#8221; 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 &#8211; 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 &#8222;trójwymiarowy&#8221;
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 &#8222;nadrysowania&#8221; 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,&#8221;?&#8221;);  - 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: [email protected]

Mr. Black

5 komentarzy

BAT 2007-10-20 20:55

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

Yoe 2007-09-01 11:27

w jakim kompilatorze to działa??

NorWeed 2003-01-08 10:49

Zastąp w arcie znaczki &lt; - &lt i &gt; - &gt, bo ich nie widać!
IMHO BGI jest do bani - strasznie wolne i wogole przestarzale...

Duch^ 2003-02-01 11:24

Tja... zdobylem komplikator ale wole C++ Buldier'a :P

Khobar 2003-01-06 16:25

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...