Limbajul C++ si oop abc-doar


un anumit proces sau o anumita prioritate de executie)



Yüklə 1,36 Mb.
səhifə15/18
tarix12.09.2018
ölçüsü1,36 Mb.
#81721
1   ...   10   11   12   13   14   15   16   17   18

un anumit proces sau o anumita prioritate de executie).

Un alt obiect destinat pentru interfata grafica este butonul de tip

TUpDown,definit in fila "updown.h" si utilizat pentru incrementarea sau

decrementarea unor valori numerice.

EXEMPLU: (vezi si OWL_ABC /owl31 )

#include

#include

#include

const uint16 IDC_BUTTON1 = 111;int valoare;

class Fer1 : public TWindow {

public: Fer1();

void SetupWindow();

void EvLButtonDown(uint,TPoint&);

protected: TUpDown* Buton1;

DECLARE_RESPONSE_TABLE(Fer1); };

DEFINE_RESPONSE_TABLE1(Fer1,TWindow)

EV_WM_LBUTTONDOWN,

END_RESPONSE_TABLE;

Fer1::Fer1():TWindow(0,0,0) {

Buton1 = new TUpDown(this,111,300,100,30,30,0);

Buton1 -> SetRange(0,250); Buton1 -> SetPos(100); };

void Fer1::SetupWindow() { Buton1 -> Create(); };

void Fer1::EvLButtonDown(uint,TPoint&)

{ valoare = Buton1 -> GetPos();

TClientDC dc(*this);

dc.Rectangle(200,200,valoare,valoare); };

class Aplicatie1 : public TApplication {

public: Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1 :: InitMainWindow()

{ MainWindow = new TFrameWindow(0,"test",new Fer1); };

int OwlMain(int,char* []) { return Aplicatie1().Run(); }

Compilati,construiti si executati aplicatia.

Executati un click de mouse,in fereastra pentru a desena un patrat de

referinta (cu valorile initiale: 200,200,100,100).Apoi utilizati unul

dintre butoanele de incrementare sau decrementare,de mai multe ori.Fiecare

click pe unul dintre butoane va modifica variabila VALOARE cu o unitate.

Apoi executati din nou un click de mouse in fereastra pentru a observa

diferenta.

Deschideti fila "owl/updown.h" si analizati obiectul TUpDown.Observati

ca este derivat din TControl si TBitFlags(mosteneste si metodele acestora)

la care se adauga metodele proprii.Obiectul contine si o serie de constan-

te pentru a specifica starea obiectului (csGrayed,csHidden,csMouseOut,

csIncrement,csDecrement,csTimer1On,csTimer2On) precum si o serie de pro-

ceduri specializate pentru tratarea evenimentelor Windows (EvEnable,EvShow

Window,EvCancel,EvTimer,EvLButtonDown,EvRButtonDown,EvLButtonUp,si

EvMouseMove).


-98-

In interfata grafica se pot utiliza si imagini de tip BitMap indepen-

dente de contextul de dispozitiv grafic (DC),cu ajutorul unei clase specia-

lizate,denumita TPictureWindow,definita in fila "pictwind.h".Acest obiect

permite preluarea diercta a imaginii bitmap.Mai mult,imaginea poate fi

expandata sau restransa,pixel cu pixel,astfel incat sa se adapteze la

dimensiunea ferestrei.

EXEMPLU: (vezi si OWL_ABC / owl32 ) Editati fila .cpp astfel:

#include

#include

#include

class Aplicatie1 : public TApplication {

public: Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1::InitMainWindow()

{ MainWindow = new TFrameWindow(0,"text",new TPictureWindow

(0,new TDib("Desen.bmp"),TPictureWindow::Center)); };

int OwlMain(int,char*[]) { return Aplicatie1().Run(); }

Adaugati in acelasi director orice imagine de tip BitMap cu numele

Desen.bmp (sau utilizati Resource Project pentru a edita o fila noua).

Compilati,construiti si executati aplicatia.

Din economie de spatiu,am cumulat trei operatii in definitia ferestrei

principale MainWindow.In ordine cronologica,cele trei operatii se pot exe-

cuta si astfel: 1.Se defineste o fereastra de tip TPictureWindow in care

se utilizeaza un obiect TDib pentru a prelua imaginea BitMap.

2.Se defineste o fereastra TFrameWindow din tipul de fe-

reastra TPictureWindow definit anterior.

3.Se defineste fereastra MainWindow din tipul TFrameWin-

dow definit in etapa anterioara.

Deschideti fila "pictwind.h" si observati ca definitia clasei TPicture-

Window (derivata din TWindow) include si o serie de parametri utilizati

pentru a seta modul de afisare (UpperLeft,Center,Stretch).Pentru ca imagi-

nea preluata din fila BitMap sa se adapteze automat la dimensiunea feres-

trei se va utiliza parametrul "Stretch".

EXEMPLU: (vezi si OWL_ABC / owl33 ) Editati fila .cpp astfel:

#include

#include

#include

class Aplicatie1: public TApplication {

public:

Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1::InitMainWindow()

{ MainWindow = new TFrameWindow(0,"text",new TPictureWindow

{0,new TDib("Desen.bmp"),TPictureWindow::Stretch)); };

int OwlMain(int,char* []) { return Aplicatie1().Run(); }

Puteti utiliza orice fila .bmp (utilizati numele corect in loc de Desen)

Compilati,construiti si executati aplicatia.Observati ca daca utilizati

butoanele de marire sau micsorare a ferestrei,imaginea se va adapta auto-

mat la dimensiunea ferestrei.Pentru a adauga butoane,sau alte controale,se

va proceda la fel ca in exercitiile precedente,dar fereastra Fer1 va fi

de tip TPictureWindow in loc de TWindow.

-99-

Biblioteca OWL contine si o fila destinata pentru organizarea datelor

sub forma de arbore genealogic.File se numeste "treewind.h" si contine

definitia urmatoarelor clase: TTreeWindow,TTreeNode,TTreeItem,TTwHitTest-

Info,TTwNotify,TTwKeyDownNotify,TTwComparator.Pentru a realiza un arbore

se utilizeaza o fereastra de tip TTreeWindow in care nodurile retelei

sunt formate din obiecte de tip TTreeNode iar elementele din TTreeItem.

EXEMPLU: (vezi si OWL_ABC / owl34 ) Editati fila .cpp astfel:

#include

#include

class Fer1 : public TWindow {

public: Fer1();

void SetupWindow();

TTreeWindow* Arbore; };

Fer1::Fer1():TWindow(0,0,0) {

Arbore = new TTreeWindow(this,133,10,10,400,200,

TTreeWindow::Style(TTreeWindow::twsHasLines)); };

void Fer1::SetupWindow()

{ TWindow::SetupWindow();

TTreeNode root = Arbore ->GetRoot();

TTreeNode parent1 = root.AddChild(TTreeItem("Director1"));

TTreeNode child1 = parent1.AddChild(TTreeItem("Subdirector 1"));

parent1.AddChild(TTreeItem("Subdirector 2"));

parent1.AddChild(TTreeItem("Subdirector 3"));

TTreeNode child2 = child1.AddChild(TTreeItem("Sub-Subdirector 1"));

Arbore -> Update(); };

class Aplicatie1 : public TApplication {

public : Aplicatie1() : TApplication {};

void InitMainWindow(); };

void Aplicatie1::InitMainWindow()

{ MainWindow = new TFrameWindow(0,"Test",new Fer1); };

int OwlMain(int char* []) { return Aplicatie1().Run(); }

Compilati,construiti si executatti aplicatia.

Observati ca la lansarea aplicatiei se va afisa doar nodul principal (cel

denumit Director).Pentru a afisa si sundirectoarele sale,executati un

dublu click de mouse pe "Director".Pentru a inchide directorul,executati

un nou dublu click,iar pentru a afisa si sub-subdirectorul 1,executati un

dublu click pe subdirectorul 1.

In mod similar,se poate construi orice tip de retea binara organizata

sub forma de arbore genealogic.

Clasa TTreeItem are patru constructori si metode pentru setarea sau

preluarea datelor (SetText si GetText) sau pentru setarea imaginii de tip

bitmap atasata datelor (SetImageIndex).

Clasa TTreeNode contine trei constructori,un grup de metode destinate

pentru navigarea automata prin arbore (GetParent,GetChild,GetNextSibling,

GetPrevSibling,GetNextVisible,GetPrevVisible,GetNextItem) sau pentru a

adauga/sterge elemente (AddChild,AddSibling,InsertChild,InsertItem,Delete)

precum si alte metode utile (Editlabel,EnsureVisible,ExpandItem etc.).

Clasa TTreeWindow contine doi constructori si metode pentru setarea si

sau identificarea datelor.

Prin combinarea celor trei obiecte si a metodelor aferente,se poate

obtine un numar practic nelimitat de variante pentru afisarea datelor.


-100-

Un astfel de arbore genealogic se poate utiliza pentru a organiza un

grup de file de tip text,sau pentru a prezenta selectiv un grup de date.

De exemplu,in functie de o parola de intrare,arborele va prezenta un

grup mai mic sau mai mare de optiuni executabile.

Un alt element esential pentru dezvoltarea de interfete grafice il re-

prezinta temporizarea actiunilor.In exemplele precedente,actiunile au

fost declansate de apasarea butonului mouse,de actionarea unui buton sau

a unui meniu popup sau au fost temporizate prin functia Sleep() si cu

ajutorul cronometrelor.O alta modalitate simpla si eficienta este sa

utilizati functia GetTickCount(),care determina in milisecunde timpul

scurs de la initializarea programului.

EXEMPLU: (vezi si OWL_ABC / owl 35 ) Editati fila .cpp astfel:

#include

class Fer1 : public TWindow {

public : Fer1();

void SetUpWindow(); };

Fer1::Fer1(): TWindow(0,0,0) {};

void Fer1::SetupWindow()

{ for (int i=0;i<10;i++) {

MessageBeep(-1);

uint32 start = GetTickCount();

while ( GetTickCount() - start <250 );

MessageBeep(-1); };

class Aplicatie1 : public TApplication {

public: Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1::InitMainWindow()

{ MainWindow = new TFrameWindow(0,"Test",new Fer1); };

int OwlMain(int,char*[]) { return Aplicatie1().Run(); }

Compilati,construiti si executati aplicatia.

In exemplul de mai sus,functia SetupWindow executa un numar de 10 beep-uri

cu o intarziere de 250 milisecunde.Pentru a obtine un timp de intarziere

mai lung sau mai scurt,modificati valoarea 250 din bucla WHILE.

Trebuie remarcat faptul,ca desi functia GetTickCount are un grad de

discriminare de 1 milisecunda,intervalul discriminativ real depinde de

sistemul de operare.Astfel,sistemul Windows 95,verifica timerul sistemului

la un interval de 55 de milisecunde,sistemul Windows NT 3.1 verifica

timer-ul la 16 milisecunde iar Windows NT 3.5 si urmatoarele la 10 mili-

secunde.Ca rezultat,in Windows 95 nu puteti obtine intervale mai mici de

55 milisecunde,iar in Windows NT 3.5 nu puteti obtine intervale mai mici

de 10 milisecunde.Din acest motiv,jocurile pentru calculator ruleaza dife-

rit in functie de sistemul de operate.Cu cat sistemul de operare este mai

recent si procesorul este mai rapid,cu atata intervalul de verificare este

mai scurt si functia GetTickCount() este mai discriminativa.

Functia GetTickCount() utilizeaza o valoare de tip DWORD.Ca rezultat,

poate obtine valori semnificative (discriminative) timp de 49,7 zile de

la momentul primei apelari.Dupa acest interval,depaseste domeniul de

reprezentare si returneaza valori care oscileaza in jurul valorii zero.

Daca utilizati aceasta functie pentru animatie si/sau jocuri,trebuie sa

tineti cont si de sistemul de operare pe care va rula aplicatia realizata.

ATENTIE ! -orice bucla WHILE neinchisa va determina operatii infinite.

-101

Un alt tip de obiect este TSplashWindow,care poate fi derivat din clasa

cu acelasi nume definita in fila "splashwi.h".Se utilizeaza pentru a putea

afisa o imagine de tip BitMap pentru un interval determinat de timp (de

obicei scurt),asemanator cu "flash-urile" publicitare.Clasa TSplashWindow

este derivata la randul sau din TLayoutWindow si contine un obiect de tip

TDib,utilizat pentru afisarea imaginii si metode proprii.

EXEMPLU: (vezi si OWL_ABC / owl36 ) Definiti fila .cpp astfel:

#include

#include

class Fer1 : public TWindow {

public: Fer1(); };

Fer1::Fer1(): TWindow(0,0,0) { TSplashWindow* s1; int timp = 3000;

s1=new TSplashWindow(*new TDib("Desen.bmp"),200,200,0x0008,timp,"",0);

s1 -> Create() };

class Aplicatie1 : public TApplication {

public:

Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1::InitMainWindow()

{ MainWindow = new TFrameWindow(0,"Test",new Fer1); };

int OwlMain(int,char* []) { return Aplicatie1().Run(); }

Adaugati in acelasi director fila .bmp (Desen.bmp),apoi compilati si

construiti nodul si apoi intregul proiect.Executati aplicatia.

Fila .bmp va fi afisata timp de 2500 milisecunde.Pentru a modifica

durata,puteti schimba valoarea parametrului "timp".

Fereastra de tip TSplashWindow accepta mai multe stiluri de afisare:

None = 0x0000,ShrinkToFit = 0x0001 (fereastra se redimensioneaza la dimen-

siunea imaginii .bmp),MakeGauge = 0x0002 (afiseaza si un obiect TGauge

pentru a indica progresia),MakeStatic = 0x004 (afiseaza si un text de

control) si CaptureMouse = 0x008 (captureaza si click-uri de mouse).

Constructorul ferestrei include un obiect de tip TDib in care se va

prelua imaginea .bmp,largimea si inaltimea ferestrei,stilul (vezi mai sus)

durata de afisaj (in milisecunde) si eventual fereastra in care este con-

tinuta (fereastra sau obiectul parinte).

Fereastra poate utiliza si evenimentele EvLButtonDown sau EvTimer,

pentru a organiza una sau mai multe operatii sau proceduri.

Se poate utiliza pentru a semnaliza anumite informatii.De exemplu se

poate afisa la debutul executiei autorul,compania si numele programului,

sau o sigla,un antet,o adresa de e-mail etc.O alta aplicatie posibila,

este pentru a semnaliza sfarsitul unei anumite operatii (cum ar fi sal-

varea unor date pe disc),aparitia unei anumite exceptii,sau pur si simplu

pentru a avertiza sau a reaminiti ceva,din timp in timp,fara ca sa fie

necesar ca utilizatorul sa execute operatii de inchidere a ferestrei.

Daca fereastra este de tip CaptureMouse,poate fi inchisa inainte de

epuizarea termenului cu un simplu click de mouse.Pentru restul situatiilor

se poate apela metoda CloseWindow() sau se poate apela destructorul,pentru

a elimina obiectul din memorie.

Pentru operatii care dureaza mai mult timp,se poate utiliza o astfel

de fereastra,cu stilul MakeGauge,pentru a prezenta pas cu pas modul de

progresie a operatiilor (intr-un obiect TGauge).Pentru a prezenta imagini

diferite,utilizati cate o fereastra pentru fiecare imagine.


-102-

O alta fila utila din biblioteca OWL este "validate.h" in care sunt

definite urmatoarele clase: TValidator,TXValidator,TPXPictureValidator,

TFilterValidator,TRangeValidator,TLookupValidator,TSortedStringArray,

si TStringLookupValidator.

Dim toate aceste clase,se pot deriva obiecte utilizate pentru a filtra

datele introduse de la tastatura intr-un obiect de tip TEdit.Pentru a de-

termina definitia datelor acceptate,se pot utiliza cifre,litere si carac-

terele speciale generale de tip #,? etc.

EXEMPLU: ( vezi si OWL_ABC / owl37 )

#include

#include

#include

#include

const uint ID_BUTTON = 101;

class Fer1 : public TWindow { public: Fer1(); void SetupWindow();

void HandleButtonMsg(); TEdit* Caseta1; TLookupValidator* val1;

TButton* b1; DECLARE_RESPONSE_TABLE(fer1); };

DEFINE_RESPONSE_TABLE1(Fer1,TWindow)

EV_COMMAND(ID_BUTTON,HandleButtonMsg),

END_RESPONSE_TABLE;

Fer1::Fer1(): TWindow(0,0,0) {

Caseta1= new TEdit(this,222,"",50,50,150,100);

b1 = new TButton(this,ID_BUTTON,"AJUTOR",350,50,80,30,false);

val1 = new TLookupValidator(); };

void Fer1::SetupWindow()

{ Caseta1 -> Create();

Caseta1 -> SetValidator(new TFilterValidator("A-M"));

b1 -> Create(); };

void Fer1::HandleButtonMsg()

{ MessageBox("Utilizati doar literele A...M","",MB_OK); };

class Aplicatie1 : public TApplication (

public : Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1::InitMainWindow()

{ MainWindow = new TFrameWindow(0,"test",new Fer1); };

int OwlMain(int,char* []) { return Aplicatie1().Run(); }

Compilati,construiti si executati proiectul.Executati un click de

mouse in caseta TEdit si observati ca nu puteti introduce decat caractere

majuscule cuprinse intre A si M (intervalul din TFilterValidator).

Pentru alt gen de filtru,sau alt gen de obiect,puteti utiliza pentru

functia SeTValidator una dintre variantele:

SetValidator(new TPXPPictureValidator("###-##-####"));

SetValidator(new TRangeValidator(1,99));

SetValidator(new TPXPictureValidator("Ion,Ana,Maria,Vasile"));

SetValidator(new TPXPictureValidator("11,12,13,14,15"); etc...

Ca rezultat,caseta TEdit nu va accepta decat formatul impus: care poate

fi un numar de telefon,un cod numeric sau alfa-numeric,o parola etc.

Acest gen de implementare se utilizeaza pentru a bloca orice posibilitate

de a introduce date eronate sau cu un format diferit decat cel acceptat.

Este extrem de util atunci cand se lucreaza cu baze de date formatate.

Pentru a rezolva eventualele erori,se poate utiliza metoda Error.


-103-

Pentru imprimarea datelor,biblioteca OWL contine fila "printer.h" in

care sunt definite urmatoarele clase: TPrinterAbortDlg,TPrintout,TPrinter,

si TXPrinter.Dintre acestea,TPrintout preia si prelucreaza documentul pe

care il expediaza la imprimanta,iar TPrinter face legatura fizica cu

dispozitivul de imprimare.Pentru fiecare document se va utiliza cate un

obiect de tip TPrintout(fiecare document va avea setari proprii).

EXEMPLU: (vezi si OWL_ABC /owl38 ). Editati fila .cpp astfel:

#include

#include

#include

#include

class Imprima : public TPrintout {

public : Imprima(const char* title,TWindow* window);

void PrintPage(int page,TRect& rect,unsigned flags);

bool HasPage(int pagina) { return pagina == 1; };

bool SetBanding(bool b) { Banding = b;};

TWindow* Window; };

Imprima :: Imprima(const char* title,TWindow* window): TPrintout(title)

{ Window = window; };

void Imprima :: PrintPage(int,TRect& rect,unsigned);

{ int prevMode;

TSize oldVExt,oldWExt;

prevMode = DC -> SetMapMode(MM_ISOTROPIC);

TRect windowSize = Window -> GetClientRect();

DC -> SetViewportExt(PageSize,&oldVExt);

DC -> SetWindowExt(windowSize.Size(),&oldWExt);

DC -> IntersectClipRect(windowSize);

DC -> DPtoLP(rect,2);

Window -> Paint(*DC,false,rect);

DC -> SetWindowExt(oldWExt);

DC -> SetViewportExt(oldVExt)

DC -> SetMapMode(prevMode); };

class Fer1 : public TWindow {

public: Fer1();

~Fer1(){ Scrie(); delete Imprimanta; };

void Scrie();

void Paint(TDC&,bool,TRect&);

TPrinter* Imprimanta; };

Fer1::Fer1(): TWindow(0,0,0) { Imprimanta = new TPrinter; };

void Fer1::Scrie() { Imprima imp1("text",this);

Imprimanta -> Print(this,imp1,false); };

Yüklə 1,36 Mb.

Dostları ilə paylaş:
1   ...   10   11   12   13   14   15   16   17   18




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin