|
Klasa widoku - BView
Skoro potrafimy już tworzyć okna, miło byłoby coś w nich umieścić, narysować itp. Funkcje te udostępnia nam klasa widoku BView i jej pochodne. Sama klasa BView jest chyba najbardziej rozbudowaną klasą w BeOSie. Od klasy tej pochodzą bezpośrednio lub pośrednio wszystkie klasy, które rysują/wyświetlają jakąkolwiek grafikę wewnątrz okien np. przyciski, pola edycyjne itd.
Zwykle okna zawierają wiele różnych klas widoków, które tworzą coś na kształt drzewiastej struktury. Szczyt tej struktury stanowi tzw. Top View. Widok standardowo znajdujący się w oknie, służący jedynie jako podstawa, do której dodajemy następne obiekty widoku.
Aby dodać obiekt widoku do okna, lub innego obiektu widoku korzystamy z funkcji AddChild() . Funkcję tą wywołujemy z obiektu, do którego chcemy dodać obiekt widoku.
Zanim dodamy obiekt widoku do okna (bądź innego widoku) musimy go najpierw stworzyć,
konstruktor klasy BView wygląda następująco:
BView(BRect frame, const char *name,uint32 resizingMode, uint32 flags);
Opis argumentów konstruktora klasy BView : |
frame | obiekt BRect określający obszar który zajmie nasz obiekt widoku (o klasie BRect pisałem więcej w 3 części kursu) |
name | nazwa dla naszej klasy widoku, która może później zostać przez nas wykorzystana jako alternatywny sposób odwoływania się do naszego obiektu (funkcja FindView() ), może być ustalone na NULL |
resizingMode | flaga określająca zachowanie naszego obiektu, na zmianę rozmiaru właściciela. Najważniejsze wartości to:
B_FOLLOW_LEFT | margines między lewą krawędzią obiektu widoku, a krawędzią właściciela nie zmieni się |
B_FOLLOW_RIGHT | margines między prawą krawędzią obiektu widoku, a krawędzią właściciela nie zmieni się |
B_FOLLOW_LEFT_RIGHT | margines między lewą krawędzią obiektu widoku, a krawędzią właściciela nie zmieni się, a także margines między prawą krawędzią obiektu widoku, a krawędzią właściciela nie ulegnie zmianie |
B_FOLLOW_H_CENTER | w trakcie zmiany wielkości właściciela, obiekt pozostanie w środku (flaga ustawia zachowanie jedynie dla kierunku poziomego) |
B_FOLLOW_TOP | odległość między górną krawędzią obiektu widoku, a górną krawędzią właściciela nie zmieni się |
B_FOLLOW_BOTTOM | odległość między dolną krawędzią obiektu widoku, a dolną krawędzią właściciela nie zmieni się |
B_FOLLOW_TOP_BOTTOM | obiekt widoku zostanie rozciągnięty tak aby odległości między górną krawędzią obiektu widoku, a krawędzią właściciela a także między dolną krawędzią obiektu widoku, a dolną krawędzią właściciela nie zmieniła się |
B_FOLLOW_V_CENTER | w trakcie zmiany wielkości właściciela, obiekt pozostanie w środku (flaga ustawia zachowanie jedynie dla kierunku pionowego), obiekt nie będzie rozciągany |
B_FOLLOW_ALL_SIDES | to samo co B_FOLLOW_LEFT_RIGHT i B_FOLLOW_TOP_BOTTOM |
B_FOLLOW_NONE | to samo co B_FOLLOW_LEFT i B_FOLLOW_TOP |
|
flags |
określa jakie komunikaty będzie otrzymywał obiekt BView . Wartość jest kombinacją makr:
B_WILL_DRAW | oznacza, że BView będzie coś rysowało, ustawienie tej flagi powoduje, że obiekt widoku będzie otrzymywał komunkat mówiący że należy przerysować zawartość, obsługiwany przez funkcję Draw() |
B_PULSE_NEEDED | oznacza, że BView będzie otrzymywało komunikat B_PULSE , obsługiwany przez funkcję Pulse() |
B_FRAME_EVENTS | oznacza, że BView bedzie otrzymywało komunikaty dotyczące zmiany rozmiaru/położenia, obsługiwane przez funkcje FrameResized() , FrameMoved() |
B_FULL_UPDATE_ON_RESIZE | oznacza że całe wnętrze obiektu BView będzie aktualizowane, po zmianie rozmiaru |
B_NAVIGABLE | umożliwia zmianę ogniska klawiatury na ten obiekt za pomocą klawisza Tab |
B_NAVIGABLE_JUMP | umożliwia ustawianie grup obiektów B_NAVIGABLE , grupę możemy zmienić za pomocą Control+Tab. Grupę tworzymy nadając obiektowi wyższego poziomu flagę B_NAVIGABLE_JUMP , a obiektom podrzędnym B_NAVIGABLE |
B_SUBPIXEL_PRECISE | wyłącza zaokrąglanie współrzędnych do całości |
Jeżeli nie chcemy ustawić żadnej flagi możemy ustawić wartość argumentu flags na NULL .
|
Dodawanie obiektu BView:
Jak już wcześniej wspomniałem aby dodać obiekt widoku do okna lub innego obiektu widoku używamy funkcji AddChild() o następującej składni:
virtual void AddChild(BView aview);
Jedynym argumentem funkcji jest nazwa obiektu BView , który chcemy dołączyć, a samą funkcję AddChild() wywołujemy z obiektu, do którego chcemy dodać nowy obiekt BView . Na przyszłość należy także pamiętać, że wszystkie kontrolki w BeOSie (np. przyciski) pochodzą od klasy BView , więc zwykle do okna są dodawane za pomocą funkcji AddChild() .
Usuwanie obiektu BView:
Zwykle cała drzewiasta struktura obiektów BView jest uwalniana przy usuwaniu okna i nic nie musimy robić, jeżeli chcemy sami usunąć obiekt BView to najpierw należy "odłączyć" go od okna, za pomocą funkcji RemoveChild() o składni:
virtual bool RemoveChild(BView aView);
Gdzie aView jest nazwą obiektu który odłączamy od okna/innego obiektu BView . Następnie standardowo korzystamy z operatora delete .
Program przykładowy ObiektWidoku:
Podobnie jak z klasami aplikacji i okna, tworząc obiekt widoku nie korzystamy wprost z klasy BView , ale tworzymy klasę opartą na niej. Naszą klasę nazwiemy poprostu Klasa_widoku :
class Klasa_widoku : public BView
{
public :
Klasa_widoku();
virtual void Draw(BRect);
};
Konstruktor naszej klasy będzie wywoływał oryginalny konstruktor klasy BView określający rozmiar naszego przyszłego widoku na 200,80 a jego prawy górny róg będzie znajdował się w punkcie (20,20). Nazwę za pomocą, której będziemy mogli wyszukać obiekt widoku ustawimy na "widok", nasz obiekt będzie także zmieniał swoją wielkość zgodnie ze zmianą okna, będzie także dostawał komunikaty nakazujące aktualizację wyświetlanej przez niego grafiki za pomocą funkcji Draw() :
BRect obszarwidoku(20,20,200,80);
Klasa_widoku::Klasa_widoku():BView(obszarwidoku, "widok",B_FOLLOW_ALL,B_WILL_DRAW)
{
}
Drugą funkcją zadeklarowaną w naszej klasie jest funkcja Draw() . Jak przed chwilą wspomniałem funkcja ta jest wykonywana zawsze gdy nasz obiekt widoku otrzyma komunikat nakazujący przerysowanie jego zawartości.
W naszym przypadku funkcja ta jedynie przesuwa pisak do pozycji (20,20) (MoveToPen(20,20) ), a następnie wypisuje tekst "To jest tekst wyświetlany" (DrawString("To jest tekst wyświetlany"); ), po czym pisak przesuwany jest do pozycji (20,40) i wypisywany jest tekst "przez obiekt BView":
void Klasa_widoku::Draw(BRect)
{
MovePenTo(20,20);//przesunięcie pisaka do pozycji 20,20
DrawString("To jest tekst wyświetlany");//wypisanie tekstu
MovePenTo(20,40);//przesunięcie pisaka do pozycji 20,40
DrawString("przez obiekt BView.");//wypisanie tekstu
}
Sam wskaźnik do obiektu BView zawarty jest w klasie okna, a obiekt tworzony i dołączany do okna jest w konstruktorze klasy okna:
class Klasa_Okna : public BWindow
{
public :
Klasa_Okna();
virtual bool QuitRequested();
Klasa_widoku * Widok;
};
Klasa_Okna::Klasa_Okna():BWindow (obszarokna,"Okno",B_TITLED_WINDOW,0,B_CURRENT_WORKSPACE)
{
Widok = new Klasa_widoku;
AddChild(Widok);
}
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,200,80);
Klasa_widoku::Klasa_widoku():BView (obszarwidoku,"widok",B_FOLLOW_ALL,B_WILL_DRAW)
{
}
void Klasa_widoku::Draw(BRect)
{
MovePenTo(20,20);
DrawString("To jest tekst wyświetlany");
MovePenTo(20,40);
DrawString("przez obiekt BView.");
}
|
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 PierwszeOkno.cpp zawierający definicje funkcji
*/
#include"Aplikacja.h"
#include"Okno.h"
BRect obszarokna(20,20,300,200);
bool Klasa_Okna::QuitRequested()
{
be_app->PostMessage(B_QUIT_REQUESTED);
return(true);
}
Klasa_Okna::Klasa_Okna():BWindow (obszarokna,"Okno",B_TITLED_WINDOW,0,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 ściągnąć stąd [Link].
Powrót
|