|
BView - Kolory
Zanim zapoznamy się z funkcjami umożliwiającymi zmianę koloru, powinniśmy dowiedzieć się jak zapisywana i przechowywana jest barwa w BeOSie.
Barwy w BeOSie zapisywane są według standardu RGBA, i przechowywane w strukturze rgb_color o składni:
typedef struct {
uint8 red;
uint8 green;
uint8 blue;
uint8 alpha;
} rgb_color
Pola red , green , blue reprezentują nasycenie odpowiednio czerwonego, zielonego i niebieskiego składnika koloru, dodatkowo wartość alpha określa przeźroczystość (0 - totalnie przeźroczyste, 255 - zupełny brak przeroczystości). Przykładowo aby zapisać barwę zieloną bez przeźroczystości wystarczy napisać:
rgb_color barwa_zielona = {0,255,0,255}
Sam zapis barwy w strukturze rgb_color nie pozwala nam wykorzystać jej np. w funkcjach rysujących.
Aby móc wykorzystać jakąkolwiek barwę należy przypisać ją jednemu z dwóch kolorów zwanych high i low (standardowo kolor high ustawiony jest na czarny, a kolor low na biały).
Barwę przypisujemy do koloru high za pomocą funkcji SetHighColor() , a do koloru low za pomocą funkcji SetLowColor() . Funkcje te mają odpowiednio składnię:
virtual void SetHighColor(rgb_color color);
inline void SetHighColor(uchar red, uchar green, uchar blue, uchar alpha = 255);
virtual void SetLowColor(rgb_color color);
inline void SetLowColor(uchar red, uchar green, uchar blue, uchar alpha = 255);
gdzie argument color oznacza barwę zapisaną w strukturze rgb_color , opcjonalnie możemy użyć wersji z 4 argumentami oznaczającymi kolejno nasycenie składnika czerwonego (red ), zielonego (green ), niebieskiego (blue ) barwy i poziom przeźroczystości (alpha ).
Np.:
aby ustawić barwę zieloną dla koloru high wystarczy:
rgb_color zielony = {0,255,0,255}
SetHighColor(zielony);
Barwę przypisaną do kolorów high i low możemy odczytać za pomocą funkcji HighColor() i LowColor() o składni:
rgb_color HighColor(void);
rgb_color LowColor(void);
Przykładowo, aby odczytać barwę koloru low wystarczy napisać:
rgb_color barwa;
barwa = LowColor();
OK, potrafimy już przypisać barwę do koloru high , czy low , ale jak je wykorzystać w funkcjach rysujących?
Nic prostszego, ostatnim argumentem prawie każdej (jeżeli nie każdej ;) funkcji rysującej jest argument aPattern np. w funkcji rysującej linie występuje jako trzeci:
void StrokeLine(BPoint start, BPoint end, pattern aPattern = B_SOLID_HIGH);
aPattern daje naprawdę duże możliwości, dzięki niemu w funkcjach rysujących można wykorzystywać wcześniej stworzone własne wzory. Zwykle jednak najczęściej korzysta się z jednego z trzech predefiniowanych makr:
B_SOLID_HIGH - oznacza że użyty zostanie kolor high
B_SOLID_LOW - oznacza że użyty zostanie kolor low
B_MIXED_COLORS - oznacza że zostanie użyty wzór złożony z barw high i low przypominający efekt dithering.
Jeżeli chcemy dla przykładu, narysować linię kolorem low wystarczy argument aPattern ustawić na B_SOLID_LOW :
StrokeLine(BPoint(0,0),BPoint(100,100),B_SOLID_LOW);
Jeżeli chcemy rysować kolorem high sytuacja jest jeszcze prostsza, ponieważ kolor ten standardowo ustawiony jest jako domyślny, więc możemy w ogóle pominąć argument aPattren :
StrokeLine(BPoint(0,0),BPoint(100,100),B_SOLID_HIGH);
StrokeLine(BPoint(0,0),BPoint(100,100));
Dwa powyższe wywołania funkcji StrokeLine() rysują dokładnie tą samą linię, za pomocą koloru high .
UWAGA!
Jeżeli wykorzystujemy kolor low do rysowania należy pamiętać, że jest on także wykorzystywany do wygładzania krawędzi czcionek, czyli zanim zaczniemy wypisywać jakiś tekst należy jego barwę ustawić na barwę tła.
Kolor tła obiektu BView:
Każdy obiekt BView oprócz kolorów high i low posiada także kolor tła. Standardowo kolor ten ustawiony jest na biały.
Zmianę koloru tła umożliwia nam funkcja SetViewColor() o składni:
virtual void SetViewColor(rgb_color color);
inline void SetViewColor(uchar red, uchar green, uchar blue, uchar alpha = 255);
Znaczenie wszystkich argumentów jest identyczne jak w przypadku funkcji SetHighColor() i SetLowColor() .
Analogicznie jak w przypadku kolorów high i low , możemy pobrać aktualine ustawioną barwę tła. Służy do tego funkcja ViewColor() np.:
rgb_color tlo;
tlo = ViewColor();
Program przykładowy:
Program przykładowy do tej części kursu, rysuje trzy słupki. Pierwszy to kolejne odcienie barwy czerwonej, drugi zielonej, a trzeci niebieskiej.
Cała operacja rysowania zawarta jest w funkcji Draw() obiektu BView i polega na zmianie koloru i współrzędnych dwóch obiektów BPoint , wykorzystywanych później do narysowania linii:
BPoint poczatek;
BPoint koniec;
int l;
for (l=0;l<255;l++)
{
//czerwony:
SetHighColor(l,0,0,255);
poczatek.Set(45,20+l);
koniec.Set(105,20+l);
StrokeLine(poczatek,koniec);
//zielony
SetHighColor(0,l,0,255);
poczatek.Set(125,20+l);
koniec.Set(185,20+l);
StrokeLine(poczatek,koniec);
//niebieski
SetHighColor(0,0,l,255);
poczatek.Set(205,20+l);
koniec.Set(265,20+l);
StrokeLine(poczatek,koniec);
}
A cały kod źródłowy wygląda następująco:
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);
};
#endif
|
Plik Widok.cpp : |
#include"Widok.h"
BRect obszarwidoku(0,0,340,365);
Klasa_widoku::Klasa_widoku():BView (obszarwidoku,"widok",B_FOLLOW_ALL,B_WILL_DRAW)
{
}
void Klasa_widoku::Draw(BRect)
{
BPoint poczatek;
BPoint koniec;
int l;
for (l=0;l<255;l++)
{
//czerwony:
SetHighColor(l,0,0,255);
poczatek.Set(45,20+l);
koniec.Set(105,20+l);
StrokeLine(poczatek,koniec);
//zielony
SetHighColor(0,l,0,255);
poczatek.Set(125,20+l);
koniec.Set(185,20+l);
StrokeLine(poczatek,koniec);
//niebieski
SetHighColor(0,0,l,255);
poczatek.Set(205,20+l);
koniec.Set(265,20+l);
StrokeLine(poczatek,koniec);
}
SetHighColor(0,0,0,255);
DrawString("Program przykładowy ze strony And3mD online.",BPoint(15,310));
DrawString("www.and3md.prv.pl",BPoint(95,325));
}
|
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,340,365);
bool Klasa_Okna::QuitRequested()
{
be_app->PostMessage(B_QUIT_REQUESTED);
return(true);
}
Klasa_Okna::Klasa_Okna():BWindow (obszarokna,"Kolory",B_TITLED_WINDOW,B_NOT_RESIZABLE, B_CURRENT_WORKSPACE)
{
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 pobrać stąd [Link].
Powrót
|