PROGRAMOWANIE – PRZYKŁADY
IDE C++ WinBGI C# Wpadki

WinBGI

O bibliotece Wersje do pobrania Instalacja biblioteki       – Borland       – MinGW       – Visual Studio Okno graficzne Kolory Podstawowe funkcje Conio2 dla MinGW a WinBGI Kontakt

O bibliotece

Biblioteka WinBGI jest emulacją standardowego w Turbo Pascalu i Borland C++ DOS-owego inter­fejsu BGI (Borland Graphics Interface) umożli­wiającą obsługę grafiki w pro­gramach trybu konso­lowego tworzonych w nowszych środo­wiskach programi­stycznych C++ w Windows i Linux. Zawiera implemen­tacje większości funkcji BGI. Niektóre wersje oferują dodatkowo paletę kolorów RGB, dowolne rozdziel­czości trybów graficznych, obsługę myszy, drukowanie grafiki, transmisję plików graficznych i wielo­wątkowość.

Autorem pierwszej wersji WinBGI dla kompilatora Borland C++ 5.02 jest Konstantin Knizhnik (1998). Biblio­teka jest ciągle rozwijana i rozpowsze­chniana na licencji wolnego oprogra­mowania (GNU – dozwolone uruch­amianie, kopiowanie, modyfikowanie i rozpowsze­chnianie). Jej rozliczne wersje o nazwach WinBGI i WinBGIm dla różnych kompila­torów języka C++ można znaleźć w zasobach interne­towych, m.in. pod adresami:

Wersje do pobrania

Poniżej dostępne są wersje WinBGI dla trzech kompilatorów języka C++ w Windows: Borland C++ 5.5, MinGW C++ 5.1 i Microsoft Visual C++ 2017. Gwoli ścisłości, ich kod źródłowy jest dokładnie taki sam, różnią się natomiast kodem skompi­lowanym (biblio­tekami statycznymi dołączanymi do programów graficznych). Bazą ich kodu źródło­wego jest wersja 3.4 biblio­teki Konstantina Knizhnika wzboga­cona o funkcje obsługi myszki (Michael Main) i paletę kolorów RGB (Mark Richardson). Wprowadzone tu modyfi­kacje dotyczą głównie udoskona­lenia procedury tworzenia okna graficznego i uproszczenia funkcji rysujących lub wynikają z konie­czności dosto­sowania kodu źródłowego do nowszych specy­fikacji języka C++. Chociaż biblio­teka nie jest dopra­cowana do końca, to prostota jej użytko­wania, małe rozmiary plików i możliwość bezpo­średniej kompilacji kodu źródłowego w innych wersjach kompila­torów C++ sprawiają, że warto rozważyć jej przydatność w edukacji początkowej programowania.

Instalacja biblioteki

W celu zainstalowania biblioteki WinBGI należy pobrać jej spakowaną wersję odpowiednią do używanego środo­wiska programi­stycznego. Po rozpa­kowaniu archiwum w nowym folderze znajduje się pięć plików:

graphics.h Plik nagłówkowy biblioteki, jej interfejs (kopia pliku winbgi.h)
info.txt Plik tekstowy zawierający krótką instrukcję instalacji biblioteki
winbgi.cpp Kod źródłowy biblioteki w języku C++, implemen­tacja biblioteki
winbgi.h Plik nagłówkowy biblioteki potrzebny przy kompilacji jej kodu źródłowego
winbgi.lib lub libbgi.a Kod wynikowy (binarny) biblioteki w postaci tzw. biblio­teki statycznej

Instalacja biblioteki WinBGI sprowadza się do skopiowania pliku graphics.h do folderu include i pliku wibbgi.lib (Borland C++Visual C++) lub libbgi.a (MinGW C++) do folderu lib kompilatora. Wymagane jest też ustawienie stosownych opcji środo­wiska programi­stycznego.

Instalacja w Borland C++ 5.5 i Relo

1 Kopiujemy plik nagłówkowy graphics.h do folderu include kompilatora. W przy­padku instalacji standar­dowej jest to folder C:\Borland\BCC55\include.
2 Kopiujemy bibliotekę statyczną winbgi.lib do folderu lib kompilatora. W przy­padku instalacji standar­dowej jest to folder C:\Borland\BCC55\lib.
3 Dla każdego kompilowanego programu używającego biblioteki WinBGI przywo­łujemy okno opcji projektu za pomocą polecenia Project Project Options, wybieramy zakładkę Linker i w polu Extra Libraries wpisujemy tekst winbgi.lib (rys.).
4 Zatwierdzamy zmiany przyciskiem OK.

Instalacja w MinGW C++ 5.1 i Code::Blocks

1 Kopiujemy plik nagłówkowy graphics.h do folderu include kompilatora. W przy­padku instalacji standar­dowej jest to folder*
C:\Pliki programów (x86)\CodeBlocks\MinGW\include
2 Kopiujemy bibliotekę statyczną libbgi.a do folderu lib kompilatora. W przy­padku instalacji standar­dowej jest to folder*
C:\Pliki programów (x86)\CodeBlocks\MinGW\lib
3 Przywołujemy okno ustawień kompilatora za pomocą polecenia Settings Compiler Linger settings (lub w wersji polskiej Ustawienia Kompilator Ustawienia linkera), w lewym panelu tego okna wskazujemy ścieżkę do biblio­teki libbgi.a (przycisk Add lub Dodaj), zaś w prawym panelu wpisujemy następu­jące opcje (rys.):
-lbgi
-lgdi32
-lcomdlg32
-luuid
-loleaut32
-lole32
W przypadku załączonej wersji biblioteki WinBGI niezbędne są dwie pierwsze opcje, pozostałe można pominąć, ale ich obecność nie przeszkadza. Wersje WinBGI i WinBGIm pobrane z innych źródeł interne­towych mogą wymagać wszystkich opcji.
4 Zatwierdzamy ustawienia przyciskiem OK.

* W przypadku 32-bitowej wersji Windows w nazwie foldera zamiast Pliki programów (x86) występuje Program Files.

Instalacja w Visual Studio Community 2017

1 Kopiujemy plik nagłówkowy graphics.h do folderu include kompilatora. W przy­padku instalacji standar­dowej jest to folder*
C:\Pliki programów (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14·14·26428\include
2 Kopiujemy bibliotekę statyczną winbgi.lib do folderu lib kompilatora. W przy­padku instalacji standar­dowej jest to folder*
C:\Pliki programów (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14·14·26428\lib\x86
3 Dla każdego kompilowanego programu używającego biblioteki WinBGI przywołujemy okno stron właściwości projektu za pomocą polecenia Projekt Właściwości..., rozwijajmy w lewym panelu okna węzeł Konsoli­dator i wybieramy zakładkę Dane wejściowe. Następnie w części centralnej okna wybieramy pozycję Dodatkowe zależności, rozwijamy strzałką w dół listę opcji i wybieramy z niej <Edytuj...>, po czym w okienku, które się pojawiło, wpisujemy tekst winbgi.lib (rys.).
4 Zamykamy okna Dodatkowe zależnościStrony właściwości przyciskami OK.

* W części cyfrowo-kropkowej nazwy foldera (tu: 14·14·26428) może wystąpić inny zestaw cyfr. Ponadto w przypadku 32-bitowej wersji Windows w nazwie foldera zamiast Pliki programów (x86) występuje Program Files.

Okno graficzne

Funkcja initgraph w WinBGI tworzy okno graficzne o nazwie Windows BGI i rozmiarze wynikającym z wartości dwóch pierwszych parametrów określa­jących sterownik i tryb graficzny. Ścieżka dostępu do sterownika karty graficznej podawana w trzecim parametrze jest nieistotna, gdyż sterownik nie jest używany. Można ją zastąpić wskaźnikiem pustym NULL, wówczas przyjęta zostanie rozdziel­czość 640x480 karty VGA. Obszar roboczy okna jest ograni­czony ramką i paskiem tytułowym. Grubość ramki zależy od wersji systemu i ustawień. Obszar roboczy ma kolor czarny, ale można go zmienić, ustalając inny kolor tła i czyszcząc ekran za pomocą funkcji setbkcolorclearviewport. Funkcja closegraph zamyka okno graficzne.

Wygodniejszą funkcją do utworzenia okna graficznego w WinBGI jest initwindow. Jej dwa obowiązkowe parametry precyzują rozdziel­czość trybu grafi­cznego, a właściwie rozmiar obszaru roboczego okna. Zmienne określa­jące sterownik i tryb graficzny w initwindow nie występują. Trzy pozostałe parametry initwindow są nieobo­wiązkowe. Gdy nie są podane, przypi­sywane są im wartości domyślne. Pierwszy, typu char*, określa tytuł okna graficznego (domyślnie łańcuch "Windows BGI"), a dwa pozostałe, typu int, współ­rzędne ekranowe jego lewego górnego rogu (domyślnie obie są równe zero).

Współrzędne punktów ekranu graficznego są liczbami całkowitymi od zera wzwyż. Proje­ktanci kompu­terów i twórcy środowisk programi­stycznych przyjęli dziwaczne zało­żenie, że początek układu współ­rzędnych znajduje się w lewym górnym rogu ekranu. Zatem w przy­padku okna grafi­cznego w WinBGI oś x biegnie górnym brzegiem jego obszaru roboczego w prawo, zaś oś y lewym brzegiem tego obszaru w dół (rys.).

Kolory

Oto podstawowy zestaw szesnastu kolorów tradycyjnej w Turbo Pascalu i wczesnych wersjach Borland C++ DOS-owej biblio­teki BGI zaimplemen­towany w dostę­pnej na niniejszej stronie wersji WinBGI:

Nazwa koloru Numer Opis Nazwa koloru Numer Opis
BLACK 0         – czarny DARKGRAY 8         – ciemnoszary
BLUE 1         – niebieski LIGHTBLUE 9         – jasnoniebieski
GREEN 2         – zielony LIGHTGREEN 10         – jasnozielony
CYAN 3         – turkusowy LIGHTCYAN 11         – jasnoturkusowy
RED 4         – czerwony LIGHTRED 12         – jasnoczerwony
MAGENTA 5         – fioletowy LIGHTMAGENTA 13         – jasnofioletowy
BROWN 6         – brązowy YELLOW 14         – żółty
LIGHTGRAY 7         – jasnoszary WHITE 15         – biały

Zestaw ten jest w WinBGI podzbiorem pełnej gamy kolorów trybu RGB. Standar­dowe numery i nazwy kolorów można używać, ale dowolny kolor można złożyć, określając intensy­wność od 0 do 255 trzech podsta­wowych barw: czerwonej, zielonej i niebie­skiej. Służy do tego funkcja COLOR(r,g,b). Na przykład poniższy program pokazuje w oknie o roz­miarze obszaru robo­czego 256×256 pikseli wszystkie kombi­nacje barw czerwonej i niebie­skiej (rys.).

#include <graphics.h>

int 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();
    return 0;
}

Przytoczony wyżej program może rodzić pytanie: dlaczego nie włączono do niego pliku nagłów­kowego conio.h, skoro wywołuje funkcję getch? Odpowiedź jest prosta: biblioteka WinBGI zawiera implemen­tacje funkcji getchkbhit. Jednak nie należy z nich korzystać poza trybem graficznym, gdyż program zachowałby się nieprzewi­dywalnie. Wypada przy okazji nadmienić, że nowsze środowiska programi­styczne C++ traktują funkcje biblioteki conio.h o tych nazwach za przesta­rzałe. Zamiast nich należy w trybie znakowym używać funkcji _getch_kbhit.

Podstawowe funkcje

Pełna lista funkcji biblioteki WinBGI jest dość pokaźna. Niektóre nie mają swoich odpowie­dników w biblio­tece BGI, część zaś została zdefi­niowana tylko w celu zachowania zgodności z biblio­teką BGI, ale ich używanie nie daje żadnego efektu. Najważniej­szymi funkcjami WinBGI są:

arc Rysuje łuk okręgu
bar3d Rysuje trójwymiarowy słupek histogramu
circle Rysuje okrąg o danym środku i promieniu
cleardevice Czyści obszar roboczy okna, wypełniając go aktualnym kolorem tła
closegraph Zamyka okno graficzne (powrót do trybu tekstowego)
COLOR Zwraca kolor RGB o zadanych składowych: czerwona, zielona, niebieska
delay Wstrzymuje wykonanie programu przez określoną liczbę milisekund
drawpoly Rysuje łamaną otwartą lub zamkniętą, której wierzchołki są podane w tablicy
ellipse Rysuje elipsę
fillellipse Rysuje elipsę wypełnioną aktualnym kolorem lub wzorem wypełniania
fillpoly Rysuje łamaną otwartą lub zamkniętą (jak drawpoly) i wypełnia ją aktualnym kolorem
floodfill Wypełnia obszar aktualnym kolorem lub wzorem wypełniania
getbkcolor Zwraca aktualny kolor tła
getch Zwraca kod ASCII wciśniętego klawisza*
getcolor Zwraca aktualny kolor pisaka
getimage Zapisuje w pamięci prostokątny fragment obszaru roboczego okna (bitmapę)
getmaxx Zwraca szerokość obszaru roboczego okna
getmaxy Zwraca wysokość obszaru roboczego okna
getpixel Zwraca kolor piksela o danych współrzędnych
getx Zwraca współrzędną x aktualnej pozycji pisaka
gety Zwraca współrzędną y aktualnej pozycji pisaka
imagesize Zwraca rozmiar prostokątnego fragmentu obszaru roboczego okna (bitmapy) w bajtach
initgraph Tworzy okno graficzne (inicjacja trybu graficznego)
initwindow Tworzy okno graficzne (funkcja wygodniejsza od initgraph, nie występuje w BGI)
kbhit Zwraca wartość niezerową, gdy bufor klawiatury jest niepusty, lub zero w przeciwnym razie
line Rysuje odcinek łączący dwa dane punkty (x1,y1)(x2,y2)
linerel Rysuje odcinek od aktualnej pozycji pisaka do punktu odległego od niej o wektor (dx,dy)
lineto Rysuje odcinek od aktualnej pozycji pisaka do danego punktu (x,y)
moverel Przesuwa pisak do pozycji odległej od aktualnej o wektor (dx,dy)
moveto Przesuwa pisak do danego punktu (x,y)
outtext Wyświetla tekst od aktualnej pozycji pisaka
outtextxy Wyświetla tekst od danej pozycji (x,y)
putimage Wyświetla zapisany w pamięci prostokątny rysunek (bitmapę)
putpixel Wyświetla dany punkt (x,y) w określonym kolorze
rectangle Wyświetla prostokąt o lewym górnym wierzchołku (x1,y1) i prawym dolnym (x2,y2)
setbkcolor Ustawia kolor tła
setcolor Ustawia kolor pisaka
setfillstyle Ustawia aktualny wzorzec i kolor wypełniania
setlinestyle Ustawia styl rysowania linii
setwritemode Ustawia tryb rysowania linii

* Naciśnięcie klawisza sterowania kursorem lub klawisza funkcyj­nego powoduje pobranie do bufora klawia­tury nie jednego, lecz dwóch znaków. Pierwszy z pary ma kod zero, zaś drugi różny od zera. Zatem gdy wynikiem wywołania funkcji getch jest zero, należy ją ponownie wywołać, by pobrać drugi znak oczeku­jący w buforze, który pozwoli na zidenty­fikowanie wciśnię­tego klawisza.

Conio2 dla MinGW a WinBGI

Biblioteka conio2 dla kompilatora MinGW C++, dostępna w zasobach interne­towych, jest emulacją biblio­teki standar­dowej conio (console input output) w Borland C++ wywo­dzącej się ze środo­wiska DOS i zawiera­jącej wiele funkcji obsługi konsoli, których brak jest w conio MinGW C++. Jednoczesne użycie bibliotek conio2WinBGI prowadzi do kolizji nazw kolorów (dwukrotne definicje nazw BLACK, BLUE, ..., WHITE). Aby tego uniknąć, należy zmodyfikować plik nagłówkowy conio2.h, wprowa­dzając warunkową defini­cję nazw kolorów w miejsce dotychczasowej:

#ifndef __COLORS
#define __COLORS
enum colors {
    BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY,
    LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE
};
#endif

W programach dostępnych na niniejszej witrynie biblio­teka conio2 nie jest używana. Zamiast niej korzysta się z opraco­wanego w Windows API modułu obsługi okna konsoli, który może być używany nie tylko w środo­wisku MinGW C++, lecz także w Visual C++.


© 2001-2010 by Kazimierz Jakubczyk
Ostatnia modyfikacja: 29.12.2018