|
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() : |
start | obiekt BPoint określający współrzędne początku linii |
end | obiekt BPoint określający współrzędne końca linii |
aPattern | okreś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() : |
rect | obiekt BRect określający prostokąt do narysowania |
aPattern | rodzaj 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() : |
rect | obiekt BRect określający prostokąt do narysowania |
aPattern | wzó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() : |
rect | obiekt BRect określający prostokąt do narysowania |
xRadius | promień zaokrąglenia w kierunku x |
yRadius | promień zaokrąglenia w kierunku y |
aPattern | wzó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() : |
rect | obiekt BRect określający prostokąt do narysowania |
xRadius | promień zaokrąglenia w kierunku x |
yRadius | promień zaokrąglenia w kierunku y |
aPattern | wzó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, thirdPoint | współrzędne wierzchołków trójkąta |
aPattern | wzó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, thirdPoint | współrzędne wierzchołków trójkąta |
aPattern | wzó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() : |
rect | prostokąt w którym zawarta będzie elipsa |
center | Środek elipsy |
xRadius | promień w poziomie |
yRadius | promień w pionie |
aPattern | wzó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() : |
rect | prostokąt w którym zawarta będzie elipsa |
center | Środek elipsy |
xRadius | promień w poziomie |
yRadius | promień w pionie |
aPattern | wzó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() : |
rect | prostokąt w którym zawarta będzie elipsa |
center | Środek elipsy |
xRadius | promień w poziomie |
yRadius | promień w pionie |
angle | kąt pomiędzy osią x a początkiem rysowanego wycinka elipsy |
span | ilość stopni zgodnie ze wskazówkami zegara, określająca wielkość wycinka elipsy |
aPattern | wzó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() : |
rect | prostokąt w którym zawarta będzie elipsa |
center | Środek elipsy |
xRadius | promień w poziomie |
yRadius | promień w pionie |
angle | kąt pomiędzy osią x a początkiem rysowanego wycinka elipsy |
span | ilość stopni zgodnie ze wskazówkami zegara, określająca wielkość wycinka elipsy |
aPattern | wzó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
|