Koło informatyczne

Biblioteka newconio

Biblioteka newconio powstała kilka lat temu na kole informatycznym w I LO w Tarnowie. Jej głównym zastosowaniem jest umożliwienie programiście sterowanie wszystkimi funkcjami dostępnymi w trybie konsoli znakowej Windows bez zbędnego grzebania się w Win32 API:

  • kolorowy tekst
  • polskie litery
  • pozycjonowanie tekstu
  • wypełnianie obszarów
  • tworzenie ramek
  • zapamiętywanie obszarów i odtwarzanie ich
  • przesuwanie obszarów w różnych kierunkach

Funkcje te pozwalają na wygodne pisanie dowolnych gier konsolowych, na których młodzi adepci szlifują swoje umiejętności programowania w języku C++.

Instalacja biblioteki jest bardzo prosta:

Przekopiuj do swojego katalogu projektowego poniższe dwa pliki:

newconio.cpp  -  plik źródłowy biblioteki
newconio.h  - plik nagłówkowy dla biblioteki

Dołącz do projektu oba pliki.

W każdym programie wykorzystującym funkcje biblioteczne wpisz polecenie preprocesora:
 

#include "newconio.h"

 

Na początku funkcji main() umieść wywołanie:
 

 _cinit();

Dokonuje ono inicjalizacji biblioteki. Od tego momentu możesz w swoim programie korzystać ze wszystkich funkcji biblioteki.

Poniższy opis funkcji biblioteki proponuję wydrukować i trzymać ten wydruk stale pod ręką. W ten sposób nie będziemy musieli się uczyć tych funkcji na pamięć - chociaż przy dużej liczbie pisanych programów same wchodzą do głowy.

 

Opis funkcji biblioteki newconio

_cinit()

Funkcja inicjuje bibliotekę newconio oraz ustawia odpowiednio konsolę znakową do pracy z programem. Funkcję tą wywołujemy tylko jeden raz w programie użytkownika - na samym początku funkcji main():

main()

{

    _cinit();

    ...

}

 

_pl(tekst)

Konsola znakowa pracuje w innym standardzie znaków niż środowisko graficzne Windows, w którym przygotowujemy teksty programów C++. Konsekwencją tego faktu jest to, iż teksty zawierające polskie literki będą nieprawidłowo wyświetlone przez konsolę. Problem rozwiązuje funkcja _pl(). Zamienia ona kody znaków reprezentujących polskie literki w standardzie Windows na odpowiednie kody tych znaków w konsoli znakowej. Użycie jest następujące:

...

cout << _pl("Zażółć gęślą jaźń\n");

...

 

center(nr wiersza, tekst)

Procedura wyświetla podany tekst na środku zadanego wiersza ekranu. Nadaje się głównie do tytułów.

 

clrscr()

Funkcja czyści ekran konsoli znakowej. Ustawia pozycję kursora na początku pierwszego wiersza. Na całym ekranie ustawiane są bieżące atrybuty kolorów.

 

cursoroff()

Jeśli tworzymy na ekranie konsoli jakąś animację, to często denerwuje nas kursor tekstowy. Za pomocą tej funkcji możemy go wyłączyć - tzn. kursor tekstowy stanie się niewidoczny.

 

cursoron()

Po wykonaniu tej funkcji kursor staje się znów widoczny.

 

delay(czas w milisekundach)

Funkcja wstrzymuje wykonanie programu na zadaną liczbę milisekund. Jest przydatna, gdy chcemy zsynchronizować czasowo wykonanie programu. Odmierzanie czasu jest przybliżone i nie należy raczej tworzyć np. zegara na podstawie tej funkcji. Ale w pozostałych przypadkach jest bardzo pożyteczna.

delay(1000); // czeka około 1 sekundę
delay(500);   // czeka około 1/2 sekundy, itd.

 

fillrectattr(atrybut, xb, yb, xe, ye)

Funkcja wypełnia zadany obszar okna konsoli (od pozycji (xb,yb) w lewym górnym narożniku, do pozycji (xe,ye) w prawym dolnym narożniku) podanym atrybutem. Znaki zawarte w tym obszarze nie są zmieniane. Również nie zmienia się pozycja kursora tekstowego.

fillrectattr(0x2f,1,1,78,23); // prostokąt z ciemnozielonym tłem i białymi znakami

 

fillrectch(znak xb, yb, xe, ye)

Funkcja wypełnia zadany obszar okna konsoli (od pozycji (xb,yb) w lewym górnym narożniku, do pozycji (xe,ye) w prawym dolnym narożniku) podanym znakiem. Kolory zawarte w tym obszarze nie są zmieniane. Również nie zmienia się pozycja kursora tekstowego.

fillrectch('X',1,1,78,23); // prostokąt wypełniony literkami X

 

fillrect(znak, atrybut, xb, yb, xe, ye)

Funkcja wypełnia zadany obszar okna konsoli (od pozycji (xb,yb) w lewym górnym narożniku, do pozycji (xe,ye) w prawym dolnym narożniku) podanym znakiem i atrybutem. Nie zmienia się pozycja kursora tekstowego.

fillrect('X',0x2f,1,1,78,23); // prostokąt wypełniony literkami białymi X na ciemnozielonym tle.

 

frame(rodzaj, atrybut, xb, yb, xe, ye)

Na obrzeżach zadanego obszaru okna konsoli (od pozycji (xb,yb) w lewym górnym narożniku, do pozycji (xe,ye) w prawym dolnym narożniku) rysowana jest ramka. Nie zmienia się pozycja kursora tekstowego. Rodzaje ramek są następujące:

 

FRAME_EMPTY - ramka wypełniona spacjami
FRAME_SINGLE - ramka zbudowana z pojedynczej linii
FRAME_DOUBLE - ramka zbudowana z linii podwójnej
FRAME_SOLID - ramka wypełniona znakiem pełnym
FRAME_SHADED - ramka wypełniona znakiem cieniowanym

 

fillframe(rodzaj, atrybut, xb, yb, xe, ye)

Na obrzeżach zadanego obszaru okna konsoli (od pozycji (xb,yb) w lewym górnym narożniku, do pozycji (xe,ye) w prawym dolnym narożniku) rysowana jest ramka. Dodatkowo wnętrze obszaru zostaje wypełnione spacjami i atrybutem koloru. Nie zmienia się pozycja kursora tekstowego. Rodzaje ramek są takie same jak dla funkcji frame().

 

fullscreen(tryb)

Funkcja włącza tryb pełnoekranowy dla parametru tryb = true lub tryb pracy w oknie dla tryb = false. W trybie pełnoekranowym okno konsoli posiada 50 wierszy po 80 kolumn w każdym. Ekran nie może być przewijany. W trybie okienkowym liczba kolumn wynosi 80, lecz liczba wierszy może zależeć od ustawionego rozmiaru okna. Treść okna konsoli może być przewijana.

...
fullscreen(true); // włączenie trybu pełnoekranowego
...
fulscreen(false); // powrót do trybu okienkowego
...

 

getattrxy(x, y)

Funkcja odczytuje atrybut koloru z pozycji x,y ekranu konsoli.

 

getch()

Funkcja odczytuje klawisz naciśnięty na klawiaturze. Jeśli klawisz nie został naciśnięty, funkcja oczekuje na niego. Nadaje się zatem np. do wstrzymywania pracy programu aż do reakcji użytkownika.

Jeśli naciśnięto klawisz sterujący (np. klawisze kursora, F1..F12, PgUp, PgDn), to pierwsze wywołanie tej funkcji zwraca 0. Dopiero drugie wywołanie zwraca tzw. kod matrycowy klawisza sterującego. Kody matrycowe znajdziemy w kodzie programu przy definicji tablicy kbdtab[].

...
while(!getch()) ;  // oczekiwanie na dowolny klawisz.
...

 

getchxy(x, y)

Funkcja odczytuje kod ASCII znaku umieszczonego na pozycji x,y ekranu konsoli.

 

getrect(xb, yb, xe, ye)

Funkcja rezerwuje bufor dla zdefiniowanego w parametrach obszaru okna konsoli i umieszcza w tym buforze zawartość obszaru, po czym adres (wskaźnik) bufora jest zwracany jako wynik (jeśli wynikiem jest NULL, to obszar został błędnie zdefiniowany lub jest poza oknem konsoli). Funkcja ta została zaprojektowana do chwilowego przechowania fragmentu ekranu konsoli, na którym wyświetlono coś innego (np. komunikat). Funkcja współpracuje z funkcją putrect(), która odtwarza z bufora poprzednio zapamiętany obszar.

WORD * bufor;

...
if(!(bufor = getrect(10,10,69,14))
{
  ... // robimy coś na obszarze 10,10 \ 69,14, np, wyświetlamy ostrzeżenie
  putrect(bufor); // odtwarzamy obszar i zwalniamy pamięć bufora
}

 

gotoxy(x,y)

Funkcja umieszcza kursor na pozycji x,y okna konsoli. Pierwszy zapis do okna rozpocznie się od tej pozycji.

...
gotoxy(37,12); cout << "HELLO";
...

 

highvideo()

Funkcja rozjaśnia kolor tekstu (o ile nie jest rozjaśniony), który zostanie po niej wypisany w oknie konsoli.

...
cout << _pl("Naciśnij klawisz ");
highvideo(); cout << "ENTER"; lowvideo();
cout << _pl(", aby zakończyć działanie programu...");
...

 

kbhit()

Funkcja sprawdza, czy na klawiaturze został naciśnięty jakiś klawisz. Jeśli tak, zwraca true. Inaczej zwraca false.

...
while(!kbhit())
{
    ...
}
...

 

lowvideo()

Funkcja przyciemnia kolor tekstu (o ile nie jest przyciemniony), który zostanie po niej wypisany w oknie konsoli.

...
cout << _pl("Naciśnij klawisz ");
highvideo(); cout << "ENTER"; lowvideo();
cout << _pl(", aby zakończyć działanie programu...");
...

 

putattrxy(atrybut, x, y)

Funkcja wprowadza atrybut koloru na pozycję x,y ekranu konsoli. Kolor znaku na tej pozycji oraz jego tła zostaną odpowiednio zmienione.

 

putchxy(znak, x, y)

Funkcja umieszcza znak na pozycji x,y ekranu konsoli. Atrybut tej pozycji nie jest zmieniany.

 

putrect(bufor)

Funkcja odtwarza obszar konsoli zapamiętany wcześniej za pomocą funkcji getrect(). Użyty do tego celu bufor jest po wykonaniu operacji zwalniany.

 

putxy(znak, atrybut, x, y)

Funkcja umieszcza podany znak oraz atrybut koloru na pozycji x,y ekranu konsoli.

 

scrollrect(kierunek, odległość, xb, yb, xe, ye)

Funkcja przesuwa treść obszaru zawartego w prostokącie od (xb,yb) do (xe,ye) w podanym kierunku i na zadaną odległość. Treść okna konsoli poza zdefiniowanym obszarem nie ulega zmianie. Po przesunięciu treści obszaru powstaje puste miejsce. Zostanie ono wypełnione spacjami w bieżącym kolorze tła i tekstu. Dozwolone kierunki przesuwu są następujące:

 

SCROLL_UP - przesuw w górę
SCROLL_RIGHT - przesuw w prawo
SCROLL_DOWN - przesuw w dół
SCROLL_LEFT - przesuw w lewo

 

textattr(atrybut)

Funkcja ustawia bieżący atrybut koloru. Po jej wywołaniu znaki wypisywane na konsoli będą posiadały kolory tekstu i tła zgodne z podanym atrybutem.

 

textbackground(kolor)

Funkcja ustawia kolor tła znaków. Kody kolorów (0...16) podaliśmy w tabelce na początku rozdziału. Zamiast wartości liczbowych można również stosować odpowiednie stałe, np. BLACK, YELLOW, WHITE itp. Po wywołaniu tej funkcji znaki zapisywane do konsoli będą posiadały zadany kolor tła.

 

textcolor(kolor)

Funkcja ustawia kolor znaków. Kody kolorów (0...16) podaliśmy w tabelce na początku rozdziału. Zamiast wartości liczbowych można również stosować odpowiednie stałe, np. BLACK, YELLOW, WHITE itp. Po wywołaniu tej funkcji znaki zapisywane do konsoli będą posiadały zadany kolor.

 

wherex()

Funkcja odczytuje numer kolumny ekranu konsoli zawierającej kursor.

 

wherey()

Funkcja odczytuje numer wiersza ekranu konsoli zawierającego kursor.

 

Kolory

STAŁE KOLORÓW DLA KONSOLI
binarnie szesnastkowo dziesiętnie nazwa stałej kolor
0000 0 0 BLACK                 
0001 1 1 BLUE  
0010 2 2 GREEN  
0011 3 3 CYAN  
0100 4 4 RED  
0101 5 5 MAGENTA  
0110 6 6 BROWN  
0111 7 7 LIGHTGRAY  
1000 8 8 DARKGRAY  
1001 9 9 LIGHTBLUE  
1010 A 10 LIGHTGREEN  
1011 B 11 LIGHTCYAN  
1100 C 12 LIGHTRED  
1101 D 13 LIGHTMAGENTA  
1110 E 14 YELLOW  
1111 F 15 WHITE  

 

Przykładowe zastosowania biblioteki newconio.

W wybranych miejscach ekranu program wyświetla przypadkowe znaki.

 

// (C)2016 Koło Informatyczne I LO
//
// -------------------------------

#include "newconio.h"
#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

int main()
{
    int key;
  
    _cinit();

    srand((unsigned)time(NULL)); 
  
    gotoxy(11,0);
    cout << _pl("Aby zakończyć działanie programu, naciśnij klawisz ");
    highvideo(); cout << "[ESC]"; lowvideo(); cout << ".";

    do
    {
      putchxy(rand() % 256, 1 + rand() % 78, 2 + rand() % 22);
      if(kbhit()) while(!(key = getch())) ;
    } while(key != 27); // powtarzamy aż do naciśnięcia ESC

    return 0;
}

 

obrazek

 


 

W wybranych miejscach ekranu program ustawia przypadkowe atrybuty.

 

// (C)2016 Koło Informatyczne I LO
//
// -------------------------------

#include "newconio.h"
#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

int main()
{
    int key;
  
    _cinit();

    srand((unsigned)time(NULL)); 
  
    gotoxy(11,0);
    cout << _pl("Aby zakończyć działanie programu, naciśnij klawisz ");
    highvideo(); cout << "[ESC]"; lowvideo(); cout << ".";

    do
    {
      putattrxy(rand() % 256, 1 + rand() % 78, 2 + rand() % 22);
      if(kbhit()) while(!(key = getch())) ;
    } while(key != 27); // powtarzamy aż do naciśnięcia ESC

    return 0;
}

 

obrazek

 


 

Na ekranie konsoli przedstawione zostają wszystkie możliwe kombinacje kolorów tła i znaków (w sumie 256 możliwości).

 

// (C)2016 Koło Informatyczne I LO
//
// -------------------------------

#include "newconio.h"
#include <iostream>

using namespace std;

int main()
{
    int i,j;
  
    _cinit();

    gotoxy(11,0);
    cout << _pl("Aby zakończyć działanie programu, naciśnij klawisz ");
    highvideo(); cout << "[ESC]"; lowvideo(); cout << ".\n\n\n";
    for(i = 0; i < 16; i++)
    {
      gotoxy(8,wherey());
      for(j = 0; j < 16; j++)
      {
        textattr(i << 4 | j);
        cout << (char) 176 << (char) 177 << (char) 178 << (char) 219;
      }
      cout << endl;
    }

    while(getch() != 27); // Czekamy na klawisz ESC

    textattr(7);

    return 0;
}

 

obrazek

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2024 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe