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




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:
frameobiekt BRect określający obszar który zajmie nasz obiekt widoku (o klasie BRect pisałem więcej w 3 części kursu)
namenazwa 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
resizingModeflaga określająca zachowanie naszego obiektu, na zmianę rozmiaru właściciela. Najważniejsze wartości to:

B_FOLLOW_LEFTmargines między lewą krawędzią obiektu widoku, a krawędzią właściciela nie zmieni się
B_FOLLOW_RIGHTmargines między prawą krawędzią obiektu widoku, a krawędzią właściciela nie zmieni się
B_FOLLOW_LEFT_RIGHTmargines 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_CENTERw trakcie zmiany wielkości właściciela, obiekt pozostanie w środku (flaga ustawia zachowanie jedynie dla kierunku poziomego)
B_FOLLOW_TOPodległość między górną krawędzią obiektu widoku, a górną krawędzią właściciela nie zmieni się
B_FOLLOW_BOTTOModległość między dolną krawędzią obiektu widoku, a dolną krawędzią właściciela nie zmieni się
B_FOLLOW_TOP_BOTTOMobiekt 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_CENTERw 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_SIDESto samo co B_FOLLOW_LEFT_RIGHT i B_FOLLOW_TOP_BOTTOM
B_FOLLOW_NONEto 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_DRAWoznacza, ż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_NEEDEDoznacza, że BView będzie otrzymywało komunikat B_PULSE, obsługiwany przez funkcję Pulse()
B_FRAME_EVENTSoznacza, że BView bedzie otrzymywało komunikaty dotyczące zmiany rozmiaru/położenia, obsługiwane przez funkcje FrameResized(), FrameMoved()
B_FULL_UPDATE_ON_RESIZEoznacza że całe wnętrze obiektu BView będzie aktualizowane, po zmianie rozmiaru
B_NAVIGABLEumożliwia zmianę ogniska klawiatury na ten obiekt za pomocą klawisza Tab
B_NAVIGABLE_JUMPumoż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_PRECISEwyłą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


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