Biblioteka winBGI w C.doc

(117 KB) Pobierz
Darmowa biblioteka graficzna WinBGI

Paweł Grądzki Kl. III Ti

Biblioteka winBGI w C++

 

Darmowa biblioteka graficzna WinBGI

 

WinBGI dla Borland C++ 5.5

W środowiskach Borland C++ nowszych od wersji 5.0 nie ma biblioteki graficznej BGI. W programach konsolowych Windows budowanych w C++ można jednak tworzyć grafikę BGI, korzystając z darmowej biblioteki WinBGI lub WinBGIm (licencja GNU). Autorem pierwszej wersji WinBGI (1998) jest Konstantin Knizhnik. Biblioteka jest ciągle rozwijana, jej rozliczne wersje dla różnych kompilatorów (Borland C++, MS Visual C++, Dev-C++, MinGW C++) można znaleźć w zasobach internetowych. WinBGI zawiera implementacje większości funkcji tradycyjnej biblioteki BGI. Niektóre wersje oferują dodatkowe udogodnienia, np. paletę kolorów RGB, dowolne rozdzielczości trybów graficznych, obsługę myszy.

Jedna z wersji biblioteki WinBGI dla Borland C++ 5.5, dostępna na tej witrynie w postaci pliku WinBGI.zip spakowanego programem WinZip, obejmuje pliki: nagłówkowy graphics.h, źródłowy winbgi.cpp, skompilowany winbgi.obj i biblioteczny winbgi.lib. Plik graphics.h najlepiej jest umieścić w katalogu Include kompilatora. Wówczas, podobnie jak w przypadku tradycyjnej biblioteki BGI, tworzone programy graficzne (aplikacje konsolowe) będą zawierały dyrektywę:

   #include <graphics.h>

Aby do budowanego programu graficznego dołączyć wywoływane w nim funkcje biblioteki WinBGI, wystarczy dodać do jego projektu jeden z plików winbgi.cpp lub winbgi.obj. Wygodnie jest wtedy dołączany plik przechowywać w odrębnym katalogu i używać go w różnych programach graficznych. Może to być np. podkatalog WinBGI utworzony w katalogu głównym kompilatora (domyślnie Bcc55). Oczywiście, lepiej jest dołączać plik winbgi.obj, gdyż unika się wówczas kompilacji biblioteki WinBGI.

Najwygodniejszym sposobem dołączania funkcji WinBGI jest wskazanie w parametrach linkera, że ma on dodatkowo przeglądać bibliotekę winbgi.lib. Plik najlepiej jest wówczas umieścić w katalogu Lib kompilatora. W środowisku Relo bibliotekę WinBGI można wtedy dołączyć, przywołując w menu Options okno dialogowe Project options i wpisując w wierszu edycyjnym Extra Libraries nazwę winbgi.lib (rys.). Bibliotekę można również wybrać w oknie Otwieranie przywołanym za pomocą przycisku + usytuowanego tuż za wierszem Extra Libraries.

WinBGI w Borland C++ Builder 6

Bibliotekę graficzną WinBGI można w podobny sposób używać w aplikacjach konsolowych tworzonych w środowisku Borland C++ Builder 6 (rys.). Również wtedy plik nagłówkowy graphics.h najlepiej jest umieścić w katalogu Include, a plik biblioteczny winbgi.lib w katalogu Lib kompilatora. Aby dołączyć do projektu aplikacji wywoływane w niej funkcje WinBGI, wystarczy w oknie dialogowym Add to project, przywołanym polecniami menu Project i Add to Project, wybrać plik winbgi.lib. Oczywiście można za pomocą tych samych poleceń dołączać plik winbgi.obj lub winbgi.cpp zamiast winbgi.lib.

Inicjalizacja grafiki w WinBGI

Konstruując grafikę za pomocą funkcji biblioteki WinBGI, należy kierować się takimi samymi zasadami jak w przypadku tradycyjnej biblioteki BGI. Funkcja initgraph() tworzy normalne okno w Windows o nazwie Windows BGI i rozmiarze obszaru roboczego 640×480 pikseli, odpowiadające ekranowi w trybie VGAHI. Ścieżka dostępu do sterownika karty graficznej jest nieistotna, gdyż jest on niewykorzystywany. Można ją zastąpić wskaźnikiem pustym NULL. Co więcej, wszystkie parametry funkcji initgraph() mają określone wartości domyślne; prototyp tej funkcji ma postać:

   void initgraph(int *device = NULL, int *mode = NULL, char const *pathtodriver = NULL);

Udogodnienie to pozwala na inicjalizację grafiki nie tylko w ten sam sposób, jak w tradycyjnej bibliotece BGI, lecz także bez parametrów w wywołaniu funkcji initgraph() i bez definiowania zmiennych typu int określających rodzaj karty graficznej i tryb jej pracy. Oto przykład programu wypełniającego równomiernie obszar roboczy okna graficznego różnokolorowymi prostokątami:

   #include <graphics.h>

   #include <stdlib.h>

 

   void main()

   {

      randomize();

      initgraph();

      int x1 = 0, x2 = getmaxx(), y1 = 0, y2 = getmaxy();

      while (x1 < x2 && y1 < y2)

      {

         setcolor(random(15)+1);

         rectangle(x1, y1, x2, y2);

         x1 += 4;  x2 -= 4;  y1 += 4; y2 -= 4;

      }

      getch();

      closegraph();

   }

Zamiast funkcji initgraph() można używać funkcji initwindow(), która ma dwa parametry typu int służące do określenia rozdzielczości trybu graficznego, a właściwie rozmiarów obszaru roboczego okna graficznego. Parametry te mają wartości domyślne 640 i 480, co odpowiada rozdzielczości VGAHI.

Definiowanie kolorów w WinBGI

Zestaw tradycyjnych 16 kolorów oryginalnej karty VGA jest w WinBGI podzbiorem pełnej gamy kolorów trybu RGB. Standardowe numery i nazwy kolorów można używać, ale dowolny kolor można złożyć, określając intensywność od 0 do 255 trzech podstawowych barw: red, green i blue. Służy do tego makrodefinicja COLOR(red, green, blue). Na przykład poniższy program pokazuje w oknie graficznym o rozmiarze obszaru roboczego 256×256 pikseli wszystkie kombinacje barw czerwonej i niebieskiej (rys.).

   #include <graphics.h>

 

   void main()

   {

      initwindow(256, 256);

      for (int r = 0; r < 256; r++)

         for (int b = 0; b < 256; b++)

            putpixel(r, b, COLOR(r, 0, b));

      getch();

      closegraph();

   }

Przytoczone wyżej dwa programy mogą rodzić pytanie: dlaczego nie występuje w nich plik nagłówkowy conio.h, skoro wywołują funkcję getch()? Odpowiedź jest prosta: implementacje funkcji getch(), kbhit() i delay() są zawarte w bibliotece WinBGI. Jednak nie można na nich polegać do końca, gdyż zachowują się dziwnie, gdy są wywoływane poza grafiką BGI.

 

 

/ / Dla Dev-C + +, musisz ustalić graphics2.h i WinBgi2.cpp

/ / To zmienić unsigned int getpixel () do getpixel int ()

/ / WinBgi2.cpp mieć w folderze roboczym i dodać do projektu

/ / Graphics2.h mieć w folderze roboczym

/ / Powiązanie z libgdi32.a

/ / To Dev-C + + jest projekt aplikacji konsoli

# include <cstdio>

# include <cmath>

# include "graphics2.h"

using namespace std;

int main ()

(

GraphDriver int = 0, GraphMode = 0;

/ / Tworzymy wykres okna

Initgraph (& GraphDriver i GraphMode, "", 640, 480);

/ / Pierwszy narysować dwie elipsy i linii ...

Setcolor (cyan);

// 2 pixels wide Setlinestyle (SOLID_LINE, 0, 2); / / 2 pikseli szerokości

/ / ** Elipsa (int x, int y, int SA, ea int, int rx, int ry)

/ / ** Centrum = x, y

/ / ** Sa = początek łuku (od 0 do 360 stopni)

/ / ** Ea = koniec łuku

/ / ** Rx = długość osi poziomej (promień)

/ / ** Ry = długość osi pionowej (promień)

Elipsa (320, 150, 0, 360, 150, 20);

Setcolor (LIGHTGREEN);

// 3 pixels wide Setlinestyle (SOLID_LINE, 0, 3); / / 3 pikseli szerokości

Elipsa (320, 150, 0, 360, 40, 90);

Setcolor (LIGHTRED);

Setlinestyle (SOLID_LINE, 0, 2);

/ / Linia (int x1, int y1, int x2, int y2)

Linii (20, 300, 600, 300);

Setcolor (żółty);

Settextstyle (DEFAULT_FONT, HORIZ_DIR, 2);

Outtextxy (20, 320, "Naciśnij dowolny klawisz ...");

// wait Getch (); / / wait

/ / Teraz remis wymyślnej linii ...

int x, y;

int szprychy = 6; / / triangle = 3, bardziej skomplikowane> 3

podwójne radianach;

Setcolor (zielone);

Radiany = 360 / (* szprychy 57,29578);

for (x = 1; x <= szprychy; x + +)

(

              for (y = x, y <= szprychy; y + +)

              (

                            line ((int) (sin (y * radianach) * 225 + 320), (int) (cos (y * radianach) * 145 + 150), (Int) (sin (x * radianach) * 225 + 320), (int) (cos (x * radianach) * 145 + 150));

              )

)

Outtextxy (20, 320, "Naciśnij dowolny klawisz ...");

// wait Getch (); / / wait

Closegraph ();

return 0;

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

Zgłoś jeśli naruszono regulamin