Powrót na stronę główną www.And3mD.prv.pl

Menu:
Strona Początkowa
Co Nowego?
BeOS/OpenBeOS
Linux
Podstawy C/C++
C FAQ
Biblioteki stand. C (GNU libc)
Programowanie w Linuxie
Programowanie w BeOSie
GLib
GTK
OpenGL
SDL
Moje Programy
Download
Linki
Pozdrowienia
Autor




BView - podstawowe funkcje rysujące



Klasa BView posiada ogromną liczbę funkcji rysujących, od najprostszych jak rysowanie linii, do bardziej skomplikowanych pozwalających np. kopiować bitmapy.

Pozycja, określanie współrzędnych:

Aby móc cokolwiek narysować na powierzchni potrzebny jest jakiś sposób na jednoznaczne określenie współrzędnych. W BeOSie najczęściej wykorzystywane są do tego dwie klasy - BPoint i BRect.

Klasa BPoint:

Klasa BPoint jednoznacznie określa położenie punktu na ekranie, a jej konstruktor wygląda następująco:

inline BPoint(float x,float y);

czyli, aby stworzyć obiekt BPoint wskazujący na pozycję (10,10) wystarczy napiasać:

BPoint punkt(10,10);

aby zmienić współrzędne, na które wskazuje obiekt BPoint używamy funkcję Set() np.:

punkt.Set(30,40);

aby obiekt wskazywał na współrzędną (30,40).

Klasa BRect:

Klasę BRect dokładniej omówiłem w trzeciej części kursu [Link] .

Podstawowe funkcje rysujące:

Rysowanie Linii:

Do rysowania linii służy funkcja StrokeLine() o składni:

void StrokeLine(BPoint start, BPoint end, pattern aPattern = B_SOLID_HIGH);
void StrokeLine(BPoint end, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji StrokeLine():
startobiekt BPoint określający współrzędne początku linii
endobiekt BPoint określający współrzędne końca linii
aPatternokreśla rodzaj linii, jeżeli pominiemy ten argument zostanie ustawiony na ciągłą o kolorze high

Jeżeli nie podamy punktu startowego linia zostanie narysowana od aktualnej pozycji pisaka.

Np. aby narysować linię od punktu (12,12) do (49, 56):

BPoint s(12,12);
BPoint k(49,56);
StrokeLine(s,k);

Np. aby narysować linię od aktualnej pozycji pisaka do (100,200):

BPoint koniec(100,200);
StrokeLine(koniec);

Rysowanie prostokąta:

Aby narysować prostokąt należy użyć funkcji StrokeRect() o składni:

void StrokeRect(BRect rect, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji StrokeRect():
rectobiekt BRect określający prostokąt do narysowania
aPatternrodzaj linii/obramowania, jeżeli nie ustawione to ciągła

Np. aby narysować prostokąt o lewym górnym rogu w punkcie 15,20, szerokości 200 i wysokości 50:

BRect prostok(15,20,200,50);
StrokeRect(prostok);

Rysowanie wypełnionego prostokąta:

Do rysowania wypełnionego prostokąta służy funkcja FillRect() o składni:

void FillRect(BRect rect, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji FillRect():
rectobiekt BRect określający prostokąt do narysowania
aPatternwzór według którego zostanie narysowany wypełniony prostokąt, domyślnie kolor high

Np. aby narysować wypełniony prostokąt o lewym górnym rogu w punkcie 15,20, szerokości 200 i wysokości 50:

BRect prostok(15,20,200,50);
FillRect(prostok);

Rysowanie prostokąta z zaokrąglonymi kątami:

Używamy funkcję StrokeRoundRect() o składni:

void StrokeRoundRect(BRect rect, float xRadius, float yRadius, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji StrokeRoundRect():
rectobiekt BRect określający prostokąt do narysowania
xRadiuspromień zaokrąglenia w kierunku x
yRadiuspromień zaokrąglenia w kierunku y
aPatternwzór według którego zostanie narysowany wypełniony prostokąt, domyślnie kolor high

Rysowanie wypełnionego prostokąta z zaokrąglonymi kątami:

Używamy funkcję FillRoundRect() o składni:

void FillRoundRect(BRect rect, float xRadius, float yRadius, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji FillRoundRect():
rectobiekt BRect określający prostokąt do narysowania
xRadiuspromień zaokrąglenia w kierunku x
yRadiuspromień zaokrąglenia w kierunku y
aPatternwzór według którego zostanie narysowany wypełniony prostokąt, domyślnie kolor high

Rysowanie trójkąta:

Aby narysować trójkąt używamy funkcję StrokeTriangle() o składni:

void StrokeTriangle(BPoint firstPoint, BPoint secondPoint, BPoint thirdPoint, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji StrokeTriangle():
firstPoint, secondPoint, thirdPointwspółrzędne wierzchołków trójkąta
aPatternwzór według którego zostanie narysowany trójkąt, domyślnie kolor high

Rysowanie wypełnionego trójkąta:

Używamy funkcję FillTriangle() o składni:

void FillTriangle(BPoint firstPoint, BPoint secondPoint, BPoint thirdPoint, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji StrokeTriangle():
firstPoint, secondPoint, thirdPointwspółrzędne wierzchołków trójkąta
aPatternwzór według którego zostanie narysowany trójkąt, domyślnie kolor high

Rysowanie elipsy:

Używamy funkcję StrokeEllipse() o składni:

void StrokeEllipse(BRect rect, pattern aPattern = B_SOLID_HIGH);
void StrokeEllipse(BPoint center, float xRadius, float yRadius,pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji StrokeEllipse():
rectprostokąt w którym zawarta będzie elipsa
centerŚrodek elipsy
xRadiuspromień w poziomie
yRadiuspromień w pionie
aPatternwzór według którego zostanie narysowana elipsa, domyślnie kolor high

Np. aby narysować elipsę która będzie mieściła się w prostokącie o współrzędnych (10,10), szerokości 100, wysokości 50:

BRect pr(10,10, 100, 50);
StrokeEllipse(pr);

Np. aby narysować elipsę, o środku w punkcie 100,100, promieniu poziomym 100 i promieniu pionowym 75:

BPoint srodek(100,100);
StrokeEllipse(srodek,100,75);

Rysowanie wypełnionej elipsy:

Używamy funkcję FillEllipse() o składni:

void FillEllipse(BRect rect, pattern aPattern = B_SOLID_HIGH);
void FillEllipse(BPoint center, float xRadius, float yRadius, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji FillEllipse():
rectprostokąt w którym zawarta będzie elipsa
centerŚrodek elipsy
xRadiuspromień w poziomie
yRadiuspromień w pionie
aPatternwzór według którego zostanie narysowana elipsa, domyślnie kolor high

Np. aby narysować wypełnioną elipsę która będzie mieściła się w prostokącie o współrzędnych (10,10), szerokości 100, wysokości 50:

BRect pr(10,10, 100, 50);
FillEllipse(pr);

Np. aby narysować wypełnioną elipsę, o środku w punkcie 100,100, promieniu poziomym 100 i promieniu pionowym 75:

BPoint srodek(100,100);
FillEllipse(srodek,100,75);

Rysowanie wycinka elipsy:

Używamy funkcję StrokeArc() o składni:

void StrokeArc(BRect rect, float angle, float span, pattern aPattern = B_SOLID_HIGH);
void StrokeArc(BPoint center, float xRadius, float yRadius, float angle, float span,pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji StrokeArc():
rectprostokąt w którym zawarta będzie elipsa
centerŚrodek elipsy
xRadiuspromień w poziomie
yRadiuspromień w pionie
anglekąt pomiędzy osią x a początkiem rysowanego wycinka elipsy
spanilość stopni zgodnie ze wskazówkami zegara, określająca wielkość wycinka elipsy
aPatternwzór według którego zostanie narysowany wycinek elipsy, domyślnie kolor high

Rysowanie wypełnionego wycinka elipsy:

Używamy funkcję FillArc() o składni:

void FillArc(BRect rect, float angle, float span, pattern aPattern = B_SOLID_HIGH);
void FillArc(BPoint center, float xRadius, float yRadius, float angle, float span, pattern aPattern = B_SOLID_HIGH);

Opis argumentów funkcji FillArc():
rectprostokąt w którym zawarta będzie elipsa
centerŚrodek elipsy
xRadiuspromień w poziomie
yRadiuspromień w pionie
anglekąt pomiędzy osią x a początkiem rysowanego wycinka elipsy
spanilość stopni zgodnie ze wskazówkami zegara, określająca wielkość wycinka elipsy
aPatternwzór według którego zostanie narysowany wycinek elipsy, domyślnie kolor high

Program przykładowy - Funkcje Rysujące:

Program przykładowy prezentuje, co 1500000 mikrosekund inną funkcję rysującą, zaczynając od StrokeRect(), a kończąc na FillArc().
Program korzysta z komunikatu systemowego B_PULSE, aby zmieniać wartość zmiennej licznik określającej, jaka figura ma być narysowana oraz z funkcji Invalidate() nakazującej obiektowi BView przerysować swoją zawartość. Funkcją wywoływaną, gdy obiekt musi przerysować swoją zawartość jest funkcja Draw(), która na podstawie wartości zmiennej licznik rysuje odpowiednią figurę.

A oto pełny kod źródłowy programu przykładowego:

Plik Widok.h:
//plik nagłówkowy definiujący klasę widoku
#ifndef _WIDOK_H_
#define _WIDOK_H_
#include<View.h>
extern BRect obszarwidoku;
class Klasa_widoku : public BView
{
public :
Klasa_widoku();
virtual void Draw(BRect);
virtual void Pulse();
int licznik;
};
#endif


Plik Widok.cpp:
#include"Widok.h"

BRect obszarwidoku(0,0,400,400);
Klasa_widoku::Klasa_widoku():BView (obszarwidoku,"widok",B_FOLLOW_ALL,B_WILL_DRAW|B_PULSE_NEEDED)
{
licznik=0;
}

void Klasa_widoku::Draw(BRect)
{
BRect kw(40,40,320,220);
BPoint ws(40,280);
BPoint w1(180,40);
BPoint w2(40,260);
BPoint w3(320,260);

switch(licznik)
{
case 0:
StrokeRect(kw);
DrawString("Funkcja StrokeRect()",ws);
break;
case 1:
FillRect(kw);
DrawString("Funkcja FillRect()",ws);
break;
case 2:
StrokeRoundRect(kw,10,10);
DrawString("Funkcja StrokeRoundRect()",ws);
break;
case 3:
FillRoundRect(kw,10,10);
DrawString("Funkcja FillRoundRect()",ws);
break;
case 4:
StrokeTriangle(w1,w2,w3);
DrawString("Funkcja StrokeTriangle()",ws);
break;
case 5:
FillTriangle(w1,w2,w3);
DrawString("Funkcja FillTriangle()",ws);
break;
case 6:
StrokeEllipse(kw);
DrawString("Funkcja StrokeEllipse()",ws);
break;
case 7:
FillEllipse(kw);
DrawString("Funkcja FillEllipse()",ws);
break;
case 8:
StrokeArc(kw,0,179);
DrawString("Funkcja StrokeArc()",ws);
break;
case 9:
FillArc(kw,0,179);
DrawString("Funkcja FillArc()",ws);
break;
}

DrawString("Program przykładowy ze strony And3mD online.",BPoint(65,340));
DrawString("www.and3md.prv.pl",BPoint(125,360));
}

void Klasa_widoku::Pulse()
{
licznik=licznik+1;
if (licznik>9) licznik=0;
Invalidate();
}


Plik Okno.h:
//Plik nagłówkowy definiujący klasę okna
#ifndef _OKNO_H_
#define _OKNO_H_
#include<Window.h>
#include"Widok.h"

extern BRect obszarokna;
class Klasa_Okna : public BWindow
{
public :
Klasa_Okna();
virtual bool QuitRequested();
Klasa_widoku * Widok;
};

#endif


Plik Okno.cpp:
/*
Plik źródłowy Okno.cpp zawierający definicje funkcji
*/
#include"Aplikacja.h"
#include"Okno.h"
BRect obszarokna(30,30,400,400);

bool Klasa_Okna::QuitRequested()
{
be_app->PostMessage(B_QUIT_REQUESTED);
return(true);
}

Klasa_Okna::Klasa_Okna():BWindow (obszarokna,"Podstawowe funkcje rysujące BView",B_TITLED_WINDOW,B_NOT_RESIZABLE,B_CURRENT_WORKSPACE)
{
SetPulseRate(1500000);
Widok = new Klasa_widoku;
AddChild(Widok);
}


Plik Aplikacja.h:
//Plik nagłówkowy definiujący klasę aplikacji
#ifndef _APLIKACJA_H_
#define _APLIKACJA_H_
#include <Application.h>
#include"Okno.h"

class Aplikacja : public BApplication
{
public :
Aplikacja();
Klasa_Okna * POkno;
};
#endif


Plik Aplikacja.cpp:
#include"Aplikacja.h"

int main()
{
new Aplikacja();
be_app->Run();
delete be_app;
}

Aplikacja::Aplikacja():BApplication("application/obiektwidoku")
{
POkno = new Klasa_Okna;
POkno->Show();
POkno->Widok->Show();
}


Program przykładowy można ściągnąć stąd [Link].

Powrót


And3mD online - www.and3md.prv.pl
Kontakt: And3mD@interia.pl