|
o tabela de raspuns,la fel ca pentru orice alt eveniment.Functia de ras-
|
səhifə | 11/18 | tarix | 12.09.2018 | ölçüsü | 1,36 Mb. | | #81721 |
| o tabela de raspuns,la fel ca pentru orice alt eveniment.Functia de ras-
puns este declansata la aparitia mesajului WM_COMMAND + ID_BUTTON.La fie-
care apasara de buton,Windows emite automat cele doua mesaje.
-68-
In exemplu,apasarea butonului genereaza un mesaj de raspuns si executa
o operatie grafica de umplere a unei suprafete,folosind un obiect de tip
TBrush.In constructor,valorile numerice specifica pozitia si dimensiuni-
le butonului.Pentru detalii,studiati fila .
Pentru a va simplifica munca de programare,este bine sa extrageti din
filele header obiectele cu care lucrati frecvent,impreuna cu definitia
constructorilor si metodele pe care le utilizati frecvent.Este bine sa
aveti si o schita de ansamblu cu arborele genealogic al tuturot obiectelor
OWL,pentru a urmarii cat mai usor metodele mostenite de la ancestori.
(copiati schita de pe Internet,sau desenati o schita proprie).
Un alt element de interfata,extrem de comun,este textul static(TStatic).
Se utilizeaza pentru a introduce diverse etichete explicative.Este definit
in fila
EXEMPLU: (vezi si OWL_ABC / owl7 )
Deschideti un proiect nou si complectati fila .cpp astfel:
#include
#include
#include
#include
const uint16 ID_STATIC1 = 101;
const uint16 ID_STATIC2 = 102;
const uint16 ID_STATIC3 = 103;
class Fer1 : public TWindow {
public:
Fer1(); };
Fer1::Fer1():TWindow(0,0,0) {
new TStatic(this,ID_STATIC1,"Text static 1 (eticheta)",50,50,250,20);
new TStatic(this,ID_STATIC2,"Al doilea text static" ,50,100,250,50,50);
new TStatic(this,ID_STATIC3,"Eticheta cea mai lata",50,200,250,100,50);
};
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();
};
Codul intern de identificare a elementului (ID_STATIC) se utilizeaza doar
pentru a putea identifica automat elementul de interfata dorit.Daca nu
va fi necesar in program,se poate utiliza orice valoare numerica int (-1).
Valorile numerice din constructor descriu pozitia si dimensiunile.
In toate exemplele am pastrat si fila pentru ca sa fie cat
mai usor de transformat.Toate filele header standard au conditii de pre-
compilare astfel concepute incat sa nu se incarce de doua ori in memorie.
Puteti transforma exemplele dupa bunul plac.Restul filelor header va atrag
doar atentia asupra filelor sursa in care sunt definite obiectele.
-69-
Un alt element de interfata este butonul CheckBox.Este definit in fila
si este format dintr-un buton de selectie si un element
static de tip text.Se utilizeaza pentru a selecta sau pentru a seta un
grup de date sau de valori,sau pentru a declansa un set de operatii.
EXEMPLU: ( vezi si OWL_ABC / owl8 )
Deschideti un nou proiect si editati fila .cpp astfel:
#include
#include
#include
#include
const uint16 ID_CHECKBOX1 = 101;
const uint16 ID_CHECKBOX2 = 102;
class Fer1 : public TWindow {
public: Fer1();
protected:
void HandleCheckBox1Msg();
void HandleCheckBox2Msg();
TCheckBox* CB1;
TCheckBox* CB2;
DECLARE_RESPONSE_TABLE(Fer1); };
DEFINE_RESPONSE_TABLE1(Fer1,TWindow)
EV_COMMAND(ID_CHECKBOX1,HandleCheckBox1Msg),
EV_COMMAND(ID_CHECKBOX2,HandleCheckBox2Msg),
END_RESPONSE_TABLE;
Fer1::Fer1():TWindow(0,0,0) {
CB1=new TCheckBox(this,ID_CHECKBOX1,"Control 1",50,50,150,20,0);
CB2=new TCheckBox(this,ID_CHECKBOX2,"Control 2",50,100,150,20,0);
void Fer1::HandleCheckBox1Msg()
{ if (CB1->GetCheck() == BF_CHECKED)
MessageBox("Control 1 = SELECTAT","text:",MB_OK);
else
MessageBox("Control 1 = Neselectat","text:",MB_OK); };
void Fer1::HandleCheckBox2Msg()
{ if (CB2->GetCheck() == BF_CHECKED)
MessageBox("Control 2 = SELECTAT","text:",MB_OK);
else
MessageBox("Control 2 = Neselectat","text:",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();
};
Observati ca cele doua controale pot fi apelate prin pointeri (CB1 si CB2)
iar cu ajutorul operatorului -> (selectia membrului dintr-un pointer) se
pot apela metodele obiectului pointat.
-70-
Un alt tip de buton,este butonul "radio",definit in fila "radiobut.h".
Este asemanator cu butonul "checkbox",dar,atunci cand exista mai multe
butoane radio incluse in acelasi spatiu de vizibilitate(in acelasi obiect)
selectarea unuia dintre butoane le deselecteaza automat pe celelalte.
EXEMPLU: (vezi si OWL_ABC / owl9)
#include
#include
#include
#include
const uint16 ID_RADIOB1 = 101;
const uint16 ID_RADIOB2 = 102;
class Fer1 : public TWindow {
public: Fer1();
protected:
void HandleRadioB1Msg();
void HandleRadioB2Msg();
TRadioButton* RB1;
TRadioButton* RB2;
DECLARE_RESPONSE_TABLE(Fer1); };
DEFINE_RESPONSE_TABLE(Fer1,TWindow)
EV_COMMAND(ID_RADIOB1,HandleRadioB1Msg),
EV_COMMAND(ID_RADIOB2,HandleRadioB2Msg),
END_RESPONSE_TABLE;
Fer1::Fer1():TWindow(0,0,0) {
RB1=new TRadioButton(this,ID_RADIOB1,"Radio 1",50,50,150,20,0);
RB2=new TRadioButton(this,ID_RADIOB2,"Radio 2",50,100,150,20,0); };
void Fer1::HandleRadioB1Msg()
{
MessageBox("Butonul Radio 2","text:",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,link-ati si apoi executati aplicatia.Pentru a selecta
un buton,executati un click de mouse,in orice loc din aria butonului.
Observati ca selectarea unui buton,deselecteaza automat celalat buton
(in cazul in care era selectat anterior).Prin urmare,acest gen de butoane
se poate utiliza atunci cand se doreste selectia unei singure optiuni,
dintr-un grup oarecare de optiuni.Pentru a forma mai multe grupuri de
optiuni,care sa nu se excluda reciproc,trebuie ca fiecare grup de butoane
sa fie inclus intr-un obiect distinct.Pentru acest scop,se poate utiliza
un obiect simplu,denumit "groupbox" si definit in fila "groupbox.h".
Obiectul groupbox,limiteaza spatiul de vizibilitate si asigura si cateva
-71-
metode auxiliare (GetText(),SetText(),GetNotifyParent() etc.).
EXEMPLU: (vezi si OWL_ABC / owl10)
deschideti un nou proiect si editati fila .cpp:
#include
#include
#include
#include
#include
const uint ID_RADIOB1 = 101;
const uint ID_RADIOB2 = 102;
const uint ID_GROUPBOX = 103;
class Fer1() : public TWindow {
public: Fer1();
protected:
void HandleGroupBoxMsg(uint);
TRadioButton* RB1;
TRadioButton* RB2;
TGroupBox* Grup1;
DECLARE_RESPONSE_TABLE1(Fer1); };
DEFINE_RESPONSE_TABLE(Fer1); };
EV_CHILD_NOTIFY_ALL_CODES(ID_GROUPBOX,HandleGroupBoxMsg),
END_RESPONSE_TABLE;
Fer1::Fer1():TWindow(0,0,0) {
Grup1=new TGroupBox(this,ID_GROUPBOX,"Grup 1",20,20,200,200);
RB1=new TRadioButton(this,ID_RADIOB1,"Radio 1",50,50,150,20,Grup1);
RB2=new TRadioButton(this,ID_RADIOB2,"Radio 2",50,100,150,20,Grup1); };
void Fer1::HandleGroupBoxMsg(uint)
{
if( RB1->GetCheck() == BF_CHECKED)
MessageBox("Butonul Radio 1 este SELECTAT","text:",MB_OK);
if( RB2->GetCheck() == BF_CHECKED)
MessageBox("Butonul Radio 2 este SELECTAT","text:",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,link-ati si apoi executati aplicatia.In acest caz,
cele doua butoane radio vor fi incluse in caseta denumita "Grup1".Se pot
introduce in fereastra "Fer1" mai multe astfel de grupuri de optiuni,
astfel incat fiecare grup sa fie independent de celelalte.Observati cele
doua modificari din program: 1.constructorul celor doua butoane radio are
ca ultim paramteru obiectul care le contine(Grup1) si 2. tabela de raspuns
utilizeaza comanda CHILD_NOTIFY_ALL_CODES pentru a prelua mesajele de la
-72-
obiectul din interior(obiectul "child") in loc de a prelua mesajele de la
fereastra principala.Prin acest tip de compartimentare,mesajele fiecarui
grup de butoane nu pot corupe mesajele unui alt grup.Compartimentarea se
poate face utilizand orice alt tip de obiecte(de exemplu:doua ferestre
diferite) dar volumul de memorie ocupata per obiect va fi mult mai mare.
Un obiect asemanator este "checklist" definit in fila "checklst.h".
Obiectul permite selectarea unei optiuni,sau a unui anumit grup de optiuni
dintr-o lista.Se utilizeaza pentru a realiza combinatii complexe intre
mai multe grupuri de optiuni sau elemente distincte.
EXEMPLU: (vezi si OWL_ABC /owl11 )
deschideti un proiect nou si completati fila .cpp astfel:
#include
#include
#include
#include
#include
const uint16 ID_CHECKLIST = 201;
class Fer1 : public TWindow {
public: Fer1();
protected: bool CanClose();
TCheckList* Lista;
TCheckListItem* Items; };
Fer1::Fer1():TWindow(0,0,0) {
Items= new TCheckListItem[4];
Items[0].SetText("Primul element din lista");
Items[1].SetText("Al doilea element din lista");
Items[2].SetText("Al treilea element din lista");
Items[3].SetText("Ultimul element din lista");
Items[0].Toggle();
Items[1].SetIndeterminate();
Items[2].SetThreeStates(true);
Lista=new TCheckList(this,ID_CHECKLIST,40,40,400,200,Items,4); };
bool Fer1::CanClose() {
char tampon[400];
char text[40];
tampon[0]=0;
for (int i=0;i<4;i++) {
if (Items[i].IsChecked() || Items[i].IsIndeterminate())
{ Items[i].GetText(text,40);
strcat(tampon,text);
strcat(tampon,"\r\n"); }}
MessageBox(tampon,"Elementele selectate sunt: ",MB_OK);
return TRUE; };
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 link-ati (eventual cu F7).
-73-
Observati ca fiecare element din lista este la randul sau un obiect de
tip TCheckListItem.Deschideti fila si observati definitia
celor doua clase.
In constructorul ferestrei am declarat la inceput un obiect de tip
TCheckListItem si am initializat obiectul cu o serie de valori de tip
text,pentru fiecare element.Apoi am apelat cate o metoda(Toggle()...etc.)
pentru a determina aspectul casutei de selectie) si in final am utilizat
operatorul "new" pentru a construi un obiect din tipul TCheckList,la care
am utilizat in constructor obiectul TCheckListItem declarat anterior.
Fiecare element are o casuta de selectie,care poate avea trei aspecte
diferite(selectata,neselectata sau indeterminata=colorata in gri).Pentru
a seta automat casuta se pot utiliza cele trei metode ale obiectului de
tip TCheckListItem(Toggle(),SetIndeterminate() si SetThreeStates() ).
Un alt element nou in program este faptul ca nu am utilizat o tabela
de raspuns prin care sa se contabilizeze fiecare mesaj din fereastra,ci
am utilizat metoda CanClose(),prin care se va efectua doar bilantul final
al evenimentelor din fereastra inainte de inchiderea aplicatiei.
Pentru metoda CanClose() au utilizat o bucla iterativa in care se
verifica starea fiecarui element si se arhiveaza starea acestuia intr-un
tampon temporar de memorie de tip caracter.In final,tamponul de memorie
este afisat intr-o fereastra de tip MassageBox,pentru a semnala elementele
din lista care au fost selectate.
Obiectul de tip TCheckList contine si el o serie de metode proprii,
dintre care cele mai valoroase sunt: EvLButtonDown,EvChar si Update().
Cu ajutorul acestui tip de obiect se pot realiza conexiuni si interactiuni
complexe.Fiecare element din lista poate declansa o anumita actiune,sau
se pot realiza diverse combinatii,prin care doar o anumita combinatie de
elemente selectate sa determine o operatie oarecare.Mai mult,se pot uti-
liza in paralele mai multe obiecte de tip TCheckList,de la care se pot
utiliza si combina una sau mai multe combinatii de optiuni.
Pe masura ca aplicatia incepe sa contina tot mai multe obiecte dis-
tincte,este tot mai greu sa urmariti filiatia fiecarui obiect.Pentru o
orientare rapida se poate utiliza diagrama oferita de meniul View/Classes.
Un alt element extrem de important il reprezinta spatiul de vizibilitate
al fiecarui obiect din interfata.Atunci cand exista un singur obiect,
totul este extrem de simplu.Cand exista mai multe obiecte,este posibil sa
apara interferente intre obiecte,datorita faptului ca un anumit mesaj
Windows poate fi exploatat de catre mai multe obiecte concurente.Pentru
a evita astfel de situatii,trebuie sa alegeti cu atentie tipul de mesaj
care va fi exploatat de catre fiecare obiect in parte,sau sa izolati
obiectele care utilizeaza acelasi mesaj in compartimente diferite.De
obiecei,interferentele apar intre obiectele care utilizeaza un mesaj
extrem de comun(gen WM_ACTIVATE,WM_COMMAND,WM_LBUTTONDOWN etc.).
Pentru a evita orice gen de neplaceri,este bine sa utilizati cat mai
frecvent cate o tabela de raspunsuri,in care pentru fiecare comanda de
identificare se atribuie o anumita functie da raspuns.Se vor evita astfel
situatiile in care mesajele sunt corupte,sunt preluate sau exploatate de
catre alt obiect din interfata sau declanseaza raspunsuri multiple.
Pentru situatiile complexe,sau pentru depanarea unor aplicatii,se poate
desena o "harta de evenimente",pe care specificati in ordinea in care apar
toate evenimetele din program si mesajul Windows eliberat/sau exploatat.
-74-
Un alt element frecvent utilizat in interfata grafica este caseta de
dialog de tip "listbox".Clasa TListBox este definita in fila "listbox.h",
impreuna cu clasa TListBoxData.Clasa TListBox,contine un numar mare de
metode prin care se poate opera asupra datelor(vezi fila "listbox.h").
EXEMPLU: (vezi si OWL_ABC / owl12 )
deschideti un proiect nou si completati fila .cpp astfel:
#include
#include
#include
#include
#include
const uint16 ID_LISTA1 = 201;
class Fer1 : public TWindow {
public: Fer1();
void SetupWindow();
protected:
TListBox* Lista; };
Fer1::Fer1():TWindow(0,0,0) {
Lista = new TListBox(this,ID_LISTA1,50,50,400,200);
};
void Fer1::SetupWindow()
{
Lista->Create();
Lista->AddString("Prima linie din lista");
Lista->AddString("A doua inregistrare");
Lista->AddString("...................");
Lista->AddString("Ultima inregistrare");
};
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.
Pentru a utiliza o astfel de caseta de dialog,se va utiliza operatorul
new si constructorul TListBox,in constructorul ferestrei principale(Fer1),
dupa care se va apela o functie oarecare,in care se pot efectua toate
operatiile de configurare a obiectului.Conventional,se utilizeaza o
functie denumita SetupWindow(),pentru a fi usor de identificat,dar puteti
utiliza orice alta denumire.Obiectul nu poate fi initializat cu valori
in constructorul ferestrei(se returneaza un mesaj de eroare).Pentru a
introduce date in caseta de dialog se pot utiliza metodele AddString(),sau
InsertString().Pentru a alege tipul de caseta listbox se poate utiliza
proprietatea Attr.Style.Casetele de dialog de tip listbox pot fi de trei
tipuri: simple,cu multiselectie sau cu afisare pe mai multe coloane.
Constructorul implicit creaza o caseta simpla in care datele din lista
sunt sortate automat in ordine alfabetica( vezi owl12).Pentru a afisa
datele nesortate,se poate apela prporietatea: Attr.Style ~LBS_SORT.
Toate setarile se vor efectua in functia de configurare(SetupWindow).
-75-
EXEMPLU: ( vezi si OWL_ABC / owl13 )
#include
#include
#include
#include
#include
const uint ID_LISTA1 = 201;
class Fer1 : public TWindow {
public: Fer();
void SetupWindow();
protected:
TListBox* Lista; };
Fer1::Fer1():TWindow(0,0,0) {
Lista = new TListBox(this,ID_LISTA1,50,50,400,40); };
void Fer1::SetupWindow()
{
Lista->Attr.Style |= LBS_MULTICOLUMN;
Lista->AttrStyle &= ~LBS_SORT;
Lista->SetColumnWidth(100);
Lista->Create();
Lista->AddString("unu");
Lista->AddString("doi");
Lista->AddString("trei");
Dostları ilə paylaş: |
|
|