|
|
səhifə | 13/18 | tarix | 12.09.2018 | ölçüsü | 1,36 Mb. | | #81721 |
| public: Fer1();
TButton* TB1;
protected: void HandleButtonMsg();
void Button1(){
::MassageBeep(-1);TDClient DC dc1(*this);
dc1.Ellipse(80,120,90,130);dc1.Ellipse(120,120,130,130);
dc1.Rectangle(70,105,90,120);dc1.Rectangle(92,95,140,120); };
DECLARE_RESPONSE_TABLE(Fer1); };
DEFINE_RESPONSE_TABLE(Fer1,TWindow)
EV_COMMAND(ID_BUTTON,HandleButtonMsg),
EV_COMMAND(IDB_BITMAP1,Buton1),
END_RESPONSE_TABLE;
Fer1::Fer1():TWindow(0,0,0) {
TB1 = new TButton(this,ID_BUTTON,"Button",250,50,280,30,false); };
void Fer1::HandleButtonMsg()
{ TClientDC dc1(*this);
dc1.Rectangle(50,50,150,150); };
class Aplicatie1 : public TApplication {
public: Aplicatie1() : TApplication() {};
~Aplicatie1(){};
void InitMainWindow();
TControlBar* ControlBar;
TButtonGadget* TG1; };
void Aplicatie1::InitMainWindow()
{ TWindow* testWindow = new Fer1;
TDecoratedFrame* frame = new TDecoratedFrame(0,"test",testWindow,true);
ControlBar = new TControlBar(frame,TControlBar::Horizontal,
new TGadgetWindowFont,0);
frame->Insert(*ControlBar,TDecoratedFrame::Top);
ControlBar->Insert(*new TButtonGadget(IDB_BITMAP1,IDB_BITMAP1,
TButtonGadget::Command,true,TButtonGadget::Up,false));
SetmainWindow(frame); };
int OwlMain(int,char[]*) { return Aplicatie1().Run; }
Pentru imaginea de tip BITMAP,puteti utiliza fila .rc din owl21
(fila owl21.rc) sau puteti edita o fila noua.
-84-
Pentru a edita o fila noua de resurse,alegeti din meniul File optiunea
New si Resource Project.In fereastra de dialog New Resource Project ale-
geti optiunea Bitmap.Observati ca in meniul principal au aparut o serie
de optiuni noi.Alegeti Bitmap si Show,apoi ColorPallete pentru a afisa
si paleta de culori.Apoi utilizati instrumentele de desanare pentru a
realiza imaginea dorita.Pentru exemplul owl21 desenati un camion.Apoi
salvati fila in directorul in care urmeaza sa fie utilizata(de exemplu
in owl21) cu numele de BITMAP1.bmp.
Pentru ca fila sa poata fi utilizata in proiect,trebuie sa fie inclusa
in fila de resurse.Eliminati din proiect fila .def,care nu este necesara,
apoi executati un dublu click de mouse pe fila .rc.Se va deschide o
fereastra de dialog in care apare caseta owl21.rc goala.Executati un
click de mouse drept pe caseta goala si alegeti optiunea Add to Project,
apoi utilizati caseta de navigare pentru a selecta fila BITMAP1.bmp si
confirmati cu Open apoi OK.
Daca totul este OK,acum caseta va avea un semn + si in momentul in
care executati un click pe semnul + se va afisa o ramificatie in care
este declarata resursa de genul: #define IDB_BITMAP1 <1> si un nou
folder in care este inclusa fila BMP cu numele: BITMAP:IDB_BITMAP1(1)
Daca fila are alta denumire sau extensie,inlocuiti in fila .cpp declaratia
#define IDB_BITMAP1 1 cu cea existenta in fila editata de d-voastra.
Proiectul contine cele doua file: owl21.cpp si owl21.rc.Compilati fiecare
nod,apoi construiti nodul .exe si verificati legaturile cu Link(cu click
drept de mouse pe fiecare nod).
Executati aplicatia si apasati alternativ cele doua butoane.
Observati ca fereastra contine un buton obisnuit,iar in partea supe-
rioara contine o banda gri si un buton activ,pe care apare desenul reali-
zat in fila BITMAP1.bmp.Bara de control,realizata prin obiectul ControlBar
s-a adaptat automat al dimensiunea butonului inclus.
Analizati putin fila .cpp.Fila contine o serie de file header noi (
,,,,).
Deschideti fiecare fila si analizati clasele de obiecte declarate.Fila
"decframe" se utilizeaza pentru clasa de fereastra TDecoratedFrame,care
accepta si barele de controale de tip TControlBar si TStatusBar.Fila
"controlb" contine declaratia pentru bara de control iar fila "buttonga.h"
contine declaratia pentru butonul cu imaginea Bitmap de import.
Analizati cu atentie fiecare clasa utilizata (mai ales constructorul).
In exercitiul owl21,am efectuat in ordine urmatoarele operatii:
1. -am declarat fereastra Fer1 de tip TWindow la care am declarat si
doua proceduri de raspuns la actionarea butoanelor.
2. -am declarat si definit tabela de raspuns in care am asociat fiecare
mesaj Windows de apasare a butoanelor cu una dintre procedurile de
raspuns.
3. -am redefinit constructorul pentru Fer1 si am inclus in fereastra
si un buton obisnuit (ID_BUTTON)
4. -am declarat un obiect derivat din clasa TApplication
5. -am redeclarat constructorul si destructorul
6. -am declarat o procedura InitMainWindow pentru setarea obiectului
7. -am declarat cate un obiect de tip:TControlBar si TButtonGadget
8. -am definit procedura InitMainWindow astfel:
8.1 -am declarat un obiect de tip TDecoratedFrame
-85-
8.2 -am declarat un obiect de tip TControlBar (bara de control)
8.3 -am introdus bara de control in fereastra "frame" cu Insert
8.4 -am introdus in bara de control butonul cu pictograma
8.5 -am setat fereastra frame ca fereastra principala
9. -am executat aplicatia din functia principala OwlMain prin apelul
metodei .Run() din obiectul de tip TApplication.
In rezumat,pentru realizarea interfetei grafice se pot utiliza si o serie
de obiecte grafice denumite "gadgets",definite in file speciale.Fiecare
astfel de "gadget" poate fi inclus cu Insert,intr-un obiect de grupare,
denumit TControlBar sau TStatusBar.Obiectele de grupare,denumite si bare
de control pot fi incluse in partea superioara sau in partea inferioara
a unei ferestre de tip TDecoratedFrame.Asadar,se va declara o ferastra
de tip TDecoratedFrame,apoi se va include o bara de control,iar in bara
de control se vor include obiectele dorite.Evenimentele si procedurile
de raspuns la fiecare eveniment se programeaza la fel ca pentru orice alt
obiect(cu o tabela de raspuns).Procedeul tehnic este putin mai dificil
decat in Delphi,dar nu este chiar atat de dificil de implementat.Atunci
cand utilizati un numar mare de obiecte de tip "gadget" este bine sa
desenati si pe hartie,schema obiectelor si a legaturilor ce trebuiesc
rezolvate(filele de resurse necesare,tabela de raspunsuri si procedurile
de raspuns,mesajele Windows utilizate,etc.).
Dificultatile pot sa apara mai ales atunci cand utilizati algoritmi
dinamici de includere si excludere a obiectelor din bara de control.De
exemplu,in functie de o anumita parola de raspuns,bara de controale poate
avea o configuratie diferita.In acest caz,pentru fiecare configuratie va
trebui editat un algoritm de generare dinamica a obiectelor incluse.In
acest caz,exista riscul ca mesajele Windows exploatate de obiectele gene-
rate automat sa fie nediscriminative,caz in care procedurile de raspuns
la evenimente vor fi accesate defectuos.In aceste situatii,fiecare obiect
generat automat va trebui sa fie depanat independent,apoi se vor face
combinatii intre doua sau mai multe obiecte,pana cand se identifica me-
sajul "buclucas".
Cu cat exista mai multe obiecte care au acelasi spatiu de vizibilitate,
cu atat creste riscul ca mesajele destinate unui obiect (sau cele astepta-
te de un anumit obiect) sa interfereze si cu un alt obiect din acelasi
spatiu de vizibilitate.Solutia cea mai simpla este sa grupati obiectele
astfel incat sa nu poata exsita interferente incompatibile.Daca este
necesar sa utilizati un numar mare de obiecte de acelasi fel,este bine
sa utilizati un numar mai mare de obiecte de grupare (bare de control),
astfel incat obiectele care asteapta acelasi tip de mesaj sa fie incluse
in spatii cu vizibilitate diferita (sa fie incapsulate diferit).
Pe cat posibil,evitati supraincarcarea interfetelor cu obiecte inutile.
Fiecare obiect acupa spatiu in memoria de operare si trebuie sa fie ges-
tionat separat.Fiecare obiect poate fi o sursa pentru erori de executie
(nedetectate in etapa de compilare),care sunt uneori extrem de greu de
anticipat sau foarte greu de depanat.Daca interfata trebuie sa contina
un numar foarte mare de optiuni,este preferabil sa utilizati meniuri si
bare de meniuri,sau meniuri pop-up,care se preteaza mult mai greu la
astfel de interferente.
Ca pentru orice alta problema,solutia cea mai buna este intotdeauna
solutia cea mai simpla.
-86-
Un alt obiect asemanator cu TControlBar este TStatusBar (bara de stare)
definit in fila "statusba.h".Se utilizeaza pentru a afisa starea unui
anumit grup de taste (de obicei tastele speciale: Scroll,Insert etc.) sau
pentru a afisa data si ora curenta.Se apeleaza la fel ca orice obiect:
EXEMPLU: (vezi si OWL_ABC /owl22 )
Deschideti un proiect nou si completati fila .cpp astfel:
#include
#include
#include
#include
class Fer1 : public TWindow {
public: Fer1(); };
Fer1::Fer1(): TWindow(0,0,0) { };
class Aplicatie1 : public TApplication {
public: Aplicatie1() : TApplication() {};
~Aplicatie1(){};
void InitMainWindow();
TStatusBar* BaraDeStare; };
void Aplicatie1::InitMainWindow()
{ TWindow* testWindow = new Fer1;
TDecoratedFrame *frame=new TDecoratedFrame(0,"test",testWindow,true);
BaraDeStare = new TStatusBar(frame);
BaraDeStare->Insert(*new TTimeGadget(&TTimeGadget::GetSystemTime));
frame->Insert(*BaraDeStare,TDecoratedFrame::Bottom);
SetMainWindow(frame); };
int OwlMain(int,char*[]) { return Aplicatie1().Run(); }
Compilati,construiti si executati proiectul.
Si in acest exemplu,suportul este asigurat de o fereatra de tip TDeco-
ratedFrame in care se va introduce bara de stare cu Insert.In bara de
stare am introdus un obiect de tip TTimeGadget,pentru a afisa in perma-
nenta data si ora sistemului(preluata cu metoda GetySystemTime).
Pentru limitarea spatiului ocupat,cele trei operatii se realizeaza intr-o
singura expresie.Pentru ca programul sa fie cat mai clar,cele trei ope-
ratii se pot separa: 1.se deriva un obiect de tip TTimeGadget 2.se ape-
leaza metoda GetSystemTime 3.se include obiectul in bara de stare .
Observati cele doua file header: si .
Analizati cu atentie fiecare clasa,si metodele specifice.
In programele si aplicatiile mari,se pot realiza diverse combinatii de
bare de meniu,bare de stare si bare de control.Exemplu clasic il repre-
zinta interfata grafica pentru Windows95,care combina o bara de control
cu un meniu popup (declansat de butonul Start).Obiectele dintr-o bara de
control(sau de stare) se pot grupa si cu ajutorul unor alte obiecte de
grupare(gen GroupBox).In acest caz,creste numarul de spatii de vizibili-
tate si depanarea programului poate fi destul de dificila.Pentru astfel
de programe,se recomanda sa realizati si un mic program de depanare auto-
mata,care verifica fiecare mesaj si fiecare obiect din aplicatie,dupa
care alcatuieste un raport final.O alta solutie,este sa adaugati un mic
comentariu,prin care sa semnalizati fiecare spatiu de vizibilitate pentru
mesajele Windows care sunt asociate cu o functie de raspuns.Pentru pro-
gramele mari se pot realiza diagrame,tabele,sau file auxiliare de tip
text in care se specifica recomandarile pentru depanarea programului.
-87-
Daca se combina TControlBar cu TStatusbar,prin conventie bara de stare
se amplaseaza la baza ferestrei.
EXEMPLU: ( vezi si OWL_ABC/ owl23 )
#include
#include
#include
#include
#include
#include
#include
#include
#include
class Fer1: public TWindow {
public: Fer1(); };
Fer1::Fer1():TWindow(0,0,0) { };
class Aplicatie1 : public TApplication {
public: Aplicatie1() : TApplication(){};
~Aplicatie1(){};
void InitMainWindow();
TStatusBar* BaraDeStare; TControlBar* Control1;
TTextgadget* text1; };
void Aplicatie1::InitmainWindow()
{ TWindow* testWindow = new Fer1;
TDecoratedFrame* frame= new TDecoratedFrame(0,"test",testWindow,true);
BaraDeStare = new TStatusBar(frame);
BaraDeStare->Insert(*new TModeGadget(VK_INSERT,"Insert"));
BaraDeStare->Insert(*new TModeGadget(VK_SCROLL,"Scroll"));
Control1 = new TControlBar(frame);
text1 = new TTextGadget(0,TGadget::Recessed,TTextGadget::Left,15);
text1->SetText("Editor de text:");
Control1->Insert(*text1);
Control1->Insert(*new TControlGadget(*new TEdit(0,222,"",0,0,150,25)));
frame->Insert(*BaraDeStare,TDecoratedFrame::Bottom);
frame->Insert(*Control1,TDecoratedFrame::Top);
SetMainWindow(frame); };
int OwlMain(int,char* []) { return Aplicatie1().Run(); }
Compilati,construiti si executati proiectul.
In acest caz,in bara de stare am inclus doua obiecte de tip TModeGadget
care verifica starea tastelor Scroll si Insert (apasati cele doua taste
pentru a vedea diferenta),iar in bara de controale am inclus un text cu
ajutorul unui obiect de tip TTextGadget si un editor de text de tip TEdit.
Analizati cu atentie filele header pentru fiecare tip de gadget.In mod
similar se pot realiza diverse combinatii de butoane,texte statice sau
casete de dialog,prin care se realizeaza interfata dintre program si
utilizator.Aspectul grafic este foarte important,dar mult mai important
este ca fiecare obiect sa fie definit corect,iar tabela de raspuns la
evenimente sa nu include nici o posibilitate de "eroare accidentala".
Nu in ultimul rand,este prioritara analiza exhaustiva a memoriei consu-
mate,raportata la rezultatul obtinut.Pentru operatii simple se vor prefera
solutiile cele mai simple,iar pentru operatii complexe se va alege solutia
care executa cat mai multe operatii/obiect/instanta/eveniment.
-88-
Un alt tip de obiect,este TGauge,definit in fila "gauge.h".Acest gen
de obiect indicator,este utilizat pentru a afisa gradul de executie a
unui proces,sau orice alt eveniment in care exista o evolutie gradata.
EXEMPLU: ( vezi si OWL_ABC / owl24) Editati fila .cpp astfel:
#include
#include
#include
#include
const uint ID_BUTTON = 101;
class Fer1: public TWindow {
public: Fer1();
TGauge* obiect1;
void HandleButtonMsg();
DECLARE_RESPONSE_TABLE(Fer1); };
DEFINE_RESPONSE_TABLE1(Fer1,TWindow)
EV_COMMAND(ID_BUTTON,HandleButtonMsg),
END_RESPONSE_TABLE;
Fer1::Fer1():TWindow(0,0,0) {
Attr.X = 20;
Attr.Y = 20;
Attr.W = 280;
Attr.H = 200;
new TButton(this,ID_BUTTON,"Apasa",80,100,100,30,false);
obiect1 = new TGauge(this,"executie /100",209,20,20,240,40,true);
obiect1->SetRange(0,100);
SetBkgndColor(RGB(250,100,30)); };
void Fer1::HandleButtonMsg()
{ for(int i=1;i<11;i++)
{ obiect1->SetValue(i*10);
UpdateWindow();
sleep(1); };
};
class Aplicatie1::InitMainWindow()
{ TFrameWindow* testWindow = new TFrameWindow(0,"text",new Fer1,true);
SetMainWindow(testWindow);
};
int OwlMain(int,char* []) { return Aplicatie1().Run(); }
Compilati,construiti si executati obiectul.
Deschideti fila si observati metodele obiectului TGauge.
TGauge are trei constructori,metode pentru specificarea gradatiei:SetRange
SetStep,SetValue,StepIt,metode pentru citirea gradatiei:GetRange,GetValue,
GetStep,DeltaValue,metode pentru personalizarea indicatorului: SetLed si
SetColor sau SetNativeUse,metode pentru redesenarea obiectului: Paint,
SetupWindow,PaintBorder si EvEraseBkgnd si metode de raspuns la mesajele
Windows (pentru tratarea evenimentelor Windows): Min,Max,Value,Step,Margin
IsHorizontal,LedSpacing,LedThick,BarColor.
Cu ajutorul acestor metode,TGauge se poate utiliza atat pentru a afisa
gradul de evolutie al unor procese,cat si pentru a determina o serie de
procese in functie de starea de moment a obiectului.Un exemplu clasic este
obiectul utilizat de sistemul Windows pentru a afisa o operatie de copiere
(download) a datelor (vezi si exemplul Gauge din Examples).
-89-
Un obiect asemenator cu TGauge este THSlider din fila "slider.h".
Butonul de culisare (slider) se utilizeaza mai ales pentru a seta o
anumita valoare dintr-o scara gradata,dar poate fi actionat si automat.
EXEMPLU: ( vezi si OWL_ABC / owl25 ) Editati fila .cpp astfel:
#include
#include
#include
#include
const uint16 ID_BUTTON = 101;
class Fer1 : public TWindow {
public: Fer1();
THSlider* obiect1;
void HandleButtonMsg();
DECLARE_RESPONSE_TABLE(Fer1); };
DEFINE_RESPONSE_TABLE1(Fer1,TWindow)
EV_COMMAND(ID_BUTTON,HandleButtonMsg),
END_RESPONSE_TABLE;
Fer1::Fer1():TWindow(0,0,0) {
Attr.X = 20;
Attr.Y = 20;
Attr.W = 280;
Attr.H = 200;
new TButton(this,ID_BUTTON,"Apasa",80,100,100,30,false);
obiect1 = new THSlider(this,209,20,20,240,40);
obiect1->SetRange(0,100);
SetBkgndColor(RGB(25,150,200)); };
void Fer1::HandleButtonMsg()
{ for (int i=1;i<11;i++)
{ obiect1->SetPosition(i*10);
if (i > 9) { MessageBox("Volum Maxim !","",MB_OK); };
UpdateWindow();
sleep(1); }; };
class Aplicatie1: public TApplication {
public: Aplicatie1() : TApplication() {};
~Aplicatie1(){};
void InitMainWindow(); };
void Aplicatie1::InitMainWindow()
{ TFrameWindow* TestWindow = new TFrameWindow(0,"text",new Fer1,true);
SetMainWindow(testWindow); };
int OwlMain(int,char* []) { return Aplicatie1().Run(); }
Compilati,construiti si executati proiectul.Obesrvati ca am utilizat
si structura TWindowAttr (din ) pentru a redimensiona Fer1.
Deschideti si fila si observati metodele obiectului(care
este derivat din TScrollBar).Remarcati metodele destinate pentru exploata-
rea butonului: PointToPos,PosToPoint,NotifyParent,SetupThumbRgn,HitTest,
SlideThumb,PaintRuler,PaintSlot,PaintThumb precum si metodele de raspuns
la mesajele Windows: EvGetDlgCode,EvPaint,EvLButtonDown,EvMouseMove,EvL-
ButtonUp,EvLButtonDblClk,EvKeyDown,EvSetFocus,EvKillFocus etc.
TSlider este mult mai complex decat TGauge si permite o gama mult mai
larga de implementari.Un exemplu clasic este butonul utilizat de sistemul
Windows pentru reglarea volumului sunetelor,pentru egalizator,etc.
-90-
Un obiect destinat pentru importul de imagini de tip BitMap si pentru
1>
Dostları ilə paylaş: |
|
|