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 <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.).
initwindow(256, 256);
for (int r = 0; r < 256; r++)
for (int b = 0; b < 256; b++)
putpixel(r, b, COLOR(r, 0, b));
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));
)
Closegraph ();
return 0;
1
Toudi