|
un anumit proces sau o anumita prioritate de executie)
|
səhifə | 15/18 | tarix | 12.09.2018 | ölçüsü | 1,36 Mb. | | #81721 |
| 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); };
250>
Dostları ilə paylaş: |
|
|