Limbajul C++ si oop abc-doar



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

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

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