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 ProjectAdd 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()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.


Powrót do początku