Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
DIALOG BOX
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

 

Descrierea suprafetei grafice Windows trebuie sa includa si comunicarea om-calculator, pe linga aspectele tehnice ale programarii care sa conduca inspre o astfel de comunicare. Din aceasta cauza este evident ca ferestrele de dialog( Dialog Box )-pe care le vom numi de aici inainte: dialoguri - trebuie sa fie prezente. De asemenea prezentarea va fi mai mult sintetica decit una tehnica a dialogurilor si a filozofiei de lucru cu ele. Aceasta si datorita faptului ca multe din problemele proiectarii ferestrelor au fost au fost preluate de utilitare puternice de editare a resurselor, iar exemplele de ferestre de dialog au aparut deja in sursele care au insotit laboratoarele precedente.

Aspecte generale

Dialogurile sunt utilizate, in general, pentru a obtine informatii de intrare mai substantiale. O regula adesea folosita pentru a sugera utilizatorului ca o comanda din meniu, de exemplu, necesita si informatii suplimentare obtinute printr-un dialog, este de a pune simbolul (...) dupa numele ei, de exemplu: b1y11yr
Open... . Diverse mesaje de alarma, atentionare sau informative pot fi generate foarte usor in astfel de ferestre.
Dialogurile se proiecteaza, de regula, cu un editor de resurse, producind sablonul dialogului - dialog box template. Daca resursa este salvata separat ea are extensia .DLG, astfel ca in fisierul de resurse .RC ea se va gasi dupa declaratia DIALOG.
In general, editoarele de resurse pot genera fisiere sursa .RC sau direct modulul de resurse compilat .RES care va fi atasat, in final, exectabilului
Windows.
In timpul executiei programului, atunci cind trebuie deschis un dialog, nucleul Windows va crea pe baza sablonului din resurse o fereastra pe ecran cu aspectul dorit si avind pozitionate toate controalele vizibile. Tot nucleul va atasa acestei ferestre o procedura standard pentru tratarea mesajelor pe care o s-o numim "managerul dialogului". La aceasta procedura se conecteaza functia pe care o scriem noi pentru tratari specifice, numita de acum "procedura dialogului". Deci, fata de o fereastra de aplicatie apar citeva deosebiri ale caror semnificatii le vom patrunde in curind. Procedura dialogului este, in linii mari, o procedura de fereastra simplificata. Ea trateaza mesajele controalelor atasate si, eventual, problemele legate de initializarea dialogului si terminarea lui. O mare parte a gestiunii mesajelor aferente se realizeaza automat in managerul dialogului-cele mai importante fiind crearea controalelor si mutare focus-ului de la unul la altul, in concordanta cu mesajele de mouse sau tastatura.
Ferestrele de dialog se impart in doua mari categorii dupa modul imperativ in care actioneaza. Primul tip si cel mai des intilnit este dialogul "modal" modal. Acesta, o data initiat nu mai cedeaza controlul inapoi aplicatiei (de exmplu printr-un clic in afara ferestrei) decit prin actionarea de obicei a unui buton de terminare (OK sau Cancel). Totusi, daca se activeaza dupa aplicatie, aceasta va deveni activa in timp ce fereastra aplicatiei noastre si dialogul deschis devin inactive. Un superset al acestor dialoguri sunt cele modale-sistem - system modal, care nu cedeaza nici altor aplicatii controlul. In fine, cele mai pasnice sunt cele din categoria nemodale - modeless, acestea putind ceda controlul ferestrei aplicatiei chiar daca ramin deschise (un exemplu tipic este dialogul Find sau Replace din meniul Find al utilitarului Write).
Adaugarea unui dialog la o aplicatie pare un lucru banal dar asertiunea nu este intotdeauna adevarata. Operatia necesita modificarea multor fisiere ale proiectului: trebuie creat sablonul deci se va modifica fisierul de resurse
.RC ,apoi identificatorii diferitelor controale vor trebui definiti intr-un fisier header .H ,procedura dialogului va fi scrisa intr-un modul sursa .C , iar numele ,exportat prin declaratia corespunzatoare din fisierul de definire
.DEF.




Resurse

Dialogul este in primul rind o fereastra de interactiune si abia apoi una de prezentare. Aceasta impune respectarea unor norme ca de exemplu o aranjare judicioasa a controalelor intr-o ordine fireasca a importantei si utilizarii lor. Dupa cum se stie deja din labor anterioare controalele sunt ferestre specializate pentru operatii de intrare sau afisare.
Trebuie gindita cu mare atentie distribuirea ergonomica a controalelor.
Acestea trebuie grupate, daca este cazul, functional, trebuie alese acele tipuri care reflecta cel mai bine natura informatiei de prelucrat, textele trebuie sa fie concise si imperative iar dialogul suficient de aerisit pentru ca utilizatorul sa-si poata focaliza atentia asupra aspectelor importante. De asemenea aceste ferestre trebuie sa fie de o marime rezonabila, maxim 1/4 din ecran, pentru a putea fi cuprinse dintr-o privire iar pe de alta parte pentru a se putea manevra usor cu mouse-ul in interiorul ei. Numarul de controale nu trebuie sa depaseasca
10-12, iar daca aplicatia impune, este preferabila cascadarea unor parti functionale relativ independente in dialoguri succesive. Un exemplu in acest sens pot fi dialogurile PRINT.
Din punctul de vedere al functionalitatii trebuie prevazute cazurile de abandonare sau reluare iar, daca este cazul, de obtinere a unor explicatii ajutatoare.
S-a vazut in cele cateva exemple prezentate in labor anterioare cum arata fisierele de resurse in format sursa deci .RC. Iata in continuare un fragment de sursa generat de AppStudio - editorul de resurse al Visual C++.
Trebuie facuta precizarea ca limbajul de descriere a resurselor sufera in continuare modificari asa incat compilarea depinde de versiunea compilatorului de resurse. Aceasta nu reprezinta insa un impediment major deoarece in mod normal nu intervenim manual in sursele .RC decat atunci cand avem de facut modificari minore sau trebuie sa specificam parametrii unor comenzi care nu pot fi generati automat la editarea sursei.
ÚAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
³ NumeDialog DIALOG DISCARDABLE 40,40,160,120 ³
³ STYLE DS MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU ³
³ CAPTION "Exemplu" ³
³ CLASS "ExDial" ³
³ FONT 8,"MS Sans Serif" ³
³ BEGIN ³
³ ³
³ // ... lista controalelor ³
³ ³
³ END ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ

Prima linie defineste numele dialogului inainte de instructiunea DIALOG dupa care urmeaza directive de incarcare (PRELOAD, LOADONCALL) si alocare a memoriei (FIXED,MOVEABLE,DISCARDABLE), implicit acestea sunt LOADONCALL si
MOVEABLE. Primele doua numere care urmeaza reprezinta coordonata coltului stanga-sus (x,y) al ferestrei relativ la zona client a ferestrei parinte care a invocat dialogul. Ultimele doua numere reprezinta marimea dialogului pe orizontala, respectiv pe verticala (cx,cy). Acesti doi parametri nu sunt exprimati insa in unitati pixel ci in unitati ce reprezinta fractiuni ale dimensiunilor dreptunghiului mediu in care se inscriu caracterele fontului selectat pentru dialog, respectiv 1/4 din latimea medie a caracterului (chcx) pentru orizontala si 1/8 din inaltimea caracterului (chcy)-pentru verticala:

þ ux=1/4*chcx
þ uy=1/8*chcy

Acest sistem de coordonate permite ca dimensiunile dialogului relative la ecran sa nu se modifice de la o rezolutie la alta. Dimensiunea pe verticala si orizontala a unitatilor este relativ egala deoarece raportul latime/inaltime al dreptunghiului mediu pentru fonturile de sistem este de aproximativ 1/2.
Despre atributele de stil s-a mai vorbit. Cele care incep cu WS_ sunt atribute generale de fereastra. Pentru dialoguri au fost introduse stilurile definite in windows.h cu prefixul DS.
DS_MODALFRAME - este cel mai important specificand stilul modal cu caracteristicul chenar gros nescalabil.
DS_SYSMODAL - se foloseste pentru dialogurile modale-sistem.
DS_SETFONT - acest atribut provoaca generarea unui mesaj WM_SETFONT la initializarea dialogului care poate fi tratat de procedura dialogului pentru a modifica fontul dialogului.
Alte atribute, ca DS_ABSALIGN, DS_LOCALEDIT si DS_NOIDLEMSG se utilizeaza foarte rar, asa incat nu vom insista acum asupra lor.
Se poate incerca, pentgru exercitiu, combinarea diferitelor atribute de stil pentru a obtine anumite efecte. Trebuie sa mai amintesc aici doar valorile implicite ale stilului daca instructiunea STYLE nu este prezenta. In acest caz avem WS_POPUP | WS_BORDER. Aceasta insa nu arata prea bine asa ca utilizati
WS_DLGFRAME. Daca se foloseste instructiunea CAPTION care specifica existenta unei bare de titlu, stilul implicit va fi WS_POPUP | WS_CAPTION | WS_SYSMENU.
Ultimul atribut specifica meniul de sistem. Daca un dialog are definita o bara de titlu, aceasta va fi afisata pe ecran deasupra coordonatei y din linia instructiunii DIALOG, asa incat acea coordonata sa coincida cu originea zonei client a ferestrei dialogului.
Desi este un lucru neobisnuit, exista posibilitatea ca dialogul sa aiba un meniu daca se introduce linia :

MENU "NumeMeniu"

iar resursa "NumeMeniu" a fost definita. Atentie in acest caz deoarece identificatorii pentru controalele dialogului si elementele meniului trebuie sa fie unici.

Controale

Tipurile de controale predefinite se regasesc in instructiunile specifice ale editorului de resurse (tabelul 1).

ÚAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
³ Instructiunile limbajului RC pentru controale ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ <tip - control> ³ clasa ³ stilul ³ ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ PUSHBUTTON ³button ³BS_PUSHBUTTON|WS_TABSTOP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ DEFPUSHBUTTON ³button ³BS_DEFPUSHBUTTON|WS_TABSTOP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ CHECKBOX ³button ³BS_CHECKBOX|WS_TABSTOP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ RADIOBUTTON ³button ³BS_RADIOBUTTON|WS_TABSTOP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ GROUPBOX ³button ³BS_GROUPBOX|WS_TABSTOP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ LTEXT ³static ³SS_LEFT|WS_GROUP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ RTEXT ³static ³SS_RIGHT|WS_GROUP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ CTEXT ³static ³SS_CENTER|WS_GROUP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ ICON ³static ³SS_ICON ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ EDITTEXT ³edit ³ES_LEFT|WS_BORDER|WS_TABSTOP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ SCROLLBAR ³scrollbar ³SBS_HORZ ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ LISTBOX ³listbox ³LBS_NOTIFY|WS_BORDER|ES_VSCROLL ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa
³ COMBOBOX ³combobox ³CBS_SIMPLE|WS_TABSTOP ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ

La compilare fiecare control primeste automat si atributele WS_CHILD | WS_VISIBLE.
Toate aceste controale cu exceptia ultimelor patru se definesc dupa cum urmeaza:

<TIP_CONTROL> "text", nID, poz_x, poz_y, latime, inaltime, dwStil

iar ultimele prin:

<TIP_CONTROL> nID, poz_x, poz_y, latime, inaltime, dwStil

Ultimul parametru este optional, aici putindu-se preciza daca dorim atribute suplimentare pentru controlul respectiv. De notat ca toate coordonatele si valorile sunt in unitati de dialog (ux,uy).
Controalele mai pot fi introduse in sablon si cu ajutorul unei instructiuni generale:

CONTROL "text", nID, "clasa", dwStil, poz_x. poz_y, latime, inaltime

Iata doua linii sursa care vor produce acelasi rezultat:

ÚAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
³ PUSHBUTTON "Ok", IDOK, 10,20,32,14 ³
³ CONTROL "Ok", IDOK, "button", BS_PUSHBUTTON | WS_TABSTOP,10,20,32,14 ³
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ

Surse

Procedura de dialog care va gestiona functionarea ferestrei de dialog desi seamana cu o procedura de fereastra are cateva caracteristici speciale. Pentru inceput iata cadrul:

BOOL FAR PASCAL ProceduraDialog(HWND hDlg,WORD msg,WORD wParam,LONG lParam)
A switch (message)
A case WM_INITDIALOG: break; case WM_COMMAND: switch (wParam)
A case IDOK: case IDCANCEL: EndDialog(hDlg,0); break;
S break; default: return FALSE;
S return TRUE;
S

Dupa cum se observa, parametrii sunt similari unei proceduri tipice, chiar daca am numit handle-ul ferestrei hDlg. Sa notam diferentele:
þ o procedura de fereastra returneaza un long pe cand procedura de dialog un BOOL (definit in windows.h ca int).
þ Procedura de fereastra apeleaza DefWindowProc daca nu proceseaza un mesaj, procedura de dialog returneaza FALSE daca nu proceseaza mesajul si TRUE daca il proceseaza.
þ Procedura de dialog nu are nevoie de procesarea mesajului WM_DESTROY. De asemenea ea nu primeste mesajul WM_CREATE, in schimb apare un nou mesaj WM_INITDIALOG.
Acest WM_INITDIALOG este primul mesaj primit de o procedura de dialog.
Acesta este cel mai potrivit prilej pentru a fixa focus-ul pe controlul dorit din dialog. Daca am facut aceasta operatie trebuie sa returnam FALSE, altfel un TRUE informeaza managerul de dialog ca el va pozitiona focus-ul, si o va face pe primul control din dialog care are atributul de stil WS_TABSTOP.
Singurul mesaj pe care il mai procesam este cel trimis de controale. Am vazut deja ca acestea informeaza parintele prin WM_COMMAND desemnandu-se prin
wParam=ID-ul sau. Am presupus ca exista un buton IDOK si unul IDCANCEL
(aceste doua ID-uri sunt deja definite in windows.h) si ca urmare a actionarii lor provocam terminarea dialogului. Terminarea se face intotdeauna cu ajutorul functiei EndDialog. Al doilea parametru al functiei reprezinta valoarea returnata spre procedura care a initiat dialogul.
Numele procedurii de dialog trebuie introdus in sectiunea EXPORT din modulul de definitie .DEF. Acest lucru este necesar deoarece, ca si in cazul unei proceduri de fereastra, apelul ei se face din nucleu.
Referitor la modul de initiere al dialogurilor, acest mecanism difera in functie de tipul de dialog. Paragrafele care urmeaza descriu principalele functii de initiere a dialogurilor.

DialogBox

Inainte de a discuta codul de initiere a dialogului s-a reamintim din labor anterioare cateva informatii privind modul de creare a unei ferestre.
Crearea unei ferestre presupune existenta unei clase de ferestre inregistrata care printre alti parametri ai structurii WNDCLASS are definita procedura ferestrei (.lpfnWndProc), stilul clasei (.style), dimensiunea unei zone de date auxiliare utilizata pentru ferestrele din aceasta clasa (.cbWndExtra) precum si handle-ul instantei aplicatiei care a inregistrat clasa si care va fi de asemenea instanta ferestrei aplicatiei. De ce s-a amintit acestea? Pentru ca dialogurile se bazeaza pe o clasa de ferestre predefinite a carei procedura de fereastra este managerul de dialog. Clasa ataseaza un numar de 33 octeti pentru fiecare dialog deschis (.cbWndExtra), constanta definita in windows.h ca DLGWINDOWEXTRA. Acest spatiu este folosit de managerul de dialog si de functiile specifice specifice dialogurilor pentru informatii suplimentare. Cea mai importanta este instanta atasata procedurii dialogului.
Urmatoarea secventa de cod initiaza un dialog modal sau modal-sistem:

A int nret;
FARPROC lpfnDlgProc; lpfnDlgProc=MakeProcInstance(ProceduraDialog,hInst); nret=DialogBox(hInst,"NumeDialog",hWnd,lpfnDlgProc);
FreeProcInstance(lpfnDlgProc);
S

Functia MakeProcInstance returneaza pointerul lpfnDlgProc care reprezinta adresa prologului zonei de cod atasata unei functii exportate-procedura noastra de dialog "ProceduraDialog". Acest prolog va face atasarea segmentului de date instantiat dialogului (hInst) pentru ca procedura sa aiba acces la variabilele globale ale aplicatiei noastre. hInst este de regula o variabila globala in care se salveaza parametrul hInstance primit de functia WinMain, sau se actualizeaza in procedura ferestrei aplicatiei la tratarea mesajului WM_CREATE hInst = ((LPCREATESTRUCT)lParam)->hInstance;
In cazul in care dialogul este initializat dintr-un DLL si nu dintr-un executabil, in locul functiei MakeProcInstance se foloseste functia GetProcAddress
(hInst,"ProceduraDialog").
Initierea propriu-zisa a dialogului se realizeaza prin functia DialogBox care primeste parametri: hInst - instanta aplicatiei, pentru regasirea sablonului de dialog "NumeDialog" din resursele aplicatiei, handle-ul ferestrei parinte
-hWnd si evident lpfnDlgProc. Din acest moment procedura aplicatiei se opreste din executie, fereastra aplicatiei devine inactiva, se creeaza fereastra dialogului si se bucleaza tratarea mesajelor prin managerul de dialog si procedura dialogului pina la executia functiei EndDialog, al carei al doilea parametru reprezinta chiar valoarea pe care DialogBox o va returna la terminarea executiei sale cind distruge fereastra de dialog.
Deoarece nu mai este nevoie de memoria alocata pentru prologul codului procedurii dialogului ea trebuie eliberata prin FreeProcInstance.

MessageBox

Vom cunoaste acum cea mai simpla modalitate de a dialoga-fereastra mesaj.
Aceasta apare ca un dialog cu un titlu, meniu sistem, un text care este de fapt mesajul un icon si maxim trei butoane. Sintaxa generala pentru invocarea unei ferestre de mesaj este:

nRet = MessageBox(hWndParent,lpszText,lpszCaption,nFlags);

Parametrii au urmatoarea semnificatie: hWnd este handle-ul ferestrei parinte (daca este NULL, la inchiderea ferestrei de mesaj focosul nu va fi returnat neaparat ferestrei aplicatiei care a initiat-o) , lpszText este un LPSTR deci un pointer far la sirul de caractere ce trebuie afisat in fereastra, lpszCaption este adresa titlului ferestrei iar ultimul parametru este un intreg ce se obtine din combinatia diferitelor atribute ce determina aspectul ferestrei de mesaj.
Aceste atribute pot fi impartite in cinci grupe:
*prima specifica butoanele care vor apare:

MB_OK(implicit)
MB_OKCANCEL,
MB_YESNO,
MB_YESNOCANCEL,
MB_RETRYCANCEL si
MB_ARBORTRETRYIGNORE,

*a doua precizeaza care este butonul initial (default):

MB_DEFBUTTON1 (implicit),
MB_DEFBUTTON2 si
MB_DEFBUTTON3,

*a treia desemneaza ce icon sa apara in fereastra:

MB_ICONINFORMATION,
MB_ICONEXCLAMATION,
MB_ICONSTOP,
MB_ICONQUESTION si nici un icon daca flagurile de mai sus lipsesc,

*a patra stabileste tipul dialogului:

MB_APPMODAL (implicit) sau
MB_SYSTEMMODAL, iar

*a cincea cuprinde un singur atribut:

MB_NOFOCUS care opreste cedarea focosului catre fereastra la crearea acesteia.

Valoarea returnata, nRet poate avea una din valorile IDOK,IDCANCEL,IDYES ,IDNO,IDRETRY,IDABORT in functie de butonul apasat.
Ferestrele de mesaj se dovedesc foarte utile atunci cind se doreste un simplu raspuns la o intrebare sau luarea unei decizii din partea utilizatorului.
Ele se dovedesc de asemenea foarte utile in faza de depanare a programului in care putem verifica executia programului prin mesaje inserate in sursa.

Lista alfabetica a functiilor legate de utilizarea dialogurilor

#include windows.h

CheckDlgButton -modifica starea unui buton al dialogului.
CheckRadioButton -modifica starea unui buton radio dintr-o suita de astfel de butoane excusive.
CreateDialog -creaza un dialog nemodal.
CreateDialogIndirect-creaza un dialog nemodal pe baza unui sablon creat in memorie.
CreateDialogIndirectParam-creaza un dialog nemodal pe baza unui sablon creat in memorie si informeaza procedura dialogului prin
WM_INITDIALOG de parametrii la creare.
CreateDialogParam-creaza un dialog nemodal si informeaza procedura dialogului prin WM_INITDIALOG de parametrii la creare.
DefDlgProc-Asigura procesarea implicita a mesajelor ferestrei de dialog.
DialogBox-creaza un dialog modal.

DialogBoxIndirect-creza un dialog modal pe baza unui sablon creat in memorie.
DialogBoxIndirectParam-creaza un dialog modal pe baza unui sablon creat in memorie si informeaza procedura dialogului prin WM_INITDIALOG de parametrii la creare.
DialogBoxParam-creaza un dialog modal si informeaza procedura dialogului prin
WM_INITDIALOG de parametrii la creare.
DlgDirList-Umple o lista cu fisierele unui director.
DlgDirListComboBox-Umple o lista combinata cu fiserele unui director.
DlgDirSelect-completeaza un sir cu selectia dintr-o lista continind fisierele unui director.
DlgDirSelectEx-completeaza un sir cu selectia dintr-o lista continind fiserele unui director.
DlgDirSElectComboBox-completeaza un sir cu selectia dintr-o lista combinata continind fiserele unui director.
DlgDirSelectComboBoxEx-completeaza un sir cu selectia dintr-o lista combinata continind fisierele unui director.
EndDialog-Termina un dialog modal.
GetDialogBaseUnits-regaseste unitatile de dialog.
GetDlgCtrlID-returneaza ID-ul unui control cu un anumit handle de fereastra.
GetDlgItem-returneaza handle-ul de fereastra al unui control cu un anumit ID dintr-un dialog.
GetDlgItemInt-returneaza textul unui control transformat in intreg.
GetDlgItemText-returneaza textul unui control.
GetNextDlgGroupItem-returneaza elementul anterior sau urmator dintr-un grup de controale ce au atributul WS_TABSTOP
IsDialogMessage- determina daca mesajul este pentru un dialog nemodal sau nu
IsDlgButtonChecked-determina starea unui buton.
MapDialogRect-transforma unitatile de dialog in pixeli.
SendDlgltemMessage-trimite un mesaj unui control dintr-un dialog.
SetDlgltemInt-modifica textul unui control cu sirul rezultat din conversia unui intreg
SetDlgItem Text-modifica textul unui control.

CreateDialog

Dialogurile nemodale sunt undeva intre ferestrele normale si dialogurile modale. Ele sunt initiate cu ajutorul functiei :

hDlgModeless = CreateDialog(hInst,"NumeDialog",hWnd,lpfnDialogProc);

Parametri functiei sunt aceeasi cu cei discutati la functia DialogBox, iar MakeProcInstance (sau GetProcAddress) si FreeProcInstance trebuie apelate in acelasi mod. Diferenta majora este ca functia CreateDialog se termina imediat dupa crearea ferestrei dialogului prin returnarea handle-ului acesteia la fel ca functia de creare a ferestrelor CreateWindow.
Iata in continuare, diferentele care apar intre dialogurile modale si cele nemodale.
-Un dialog nemodal are, in mod normal, titlu si meniu sistem pentru ca utilizatorul sa poata muta fereastra unde doreste. Stilul uzual ar fi deci:

WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_VISIBLE

-Observati inserarea atributului WS_VISIBLE. Acesta, ca si in cazul ferestrelor normale, provoaca afisarea imediata a ferestrei pe ecran. Daca el lipseste, fereastra dialogului nemodal poate fi facuta vizibila atunci cand dorim prin functia ShowWindow(hDlgModeless,SW_SHOW).
-Cea mai importanta deosebire este in circulatia mesajelor aferente unei ferestre dialog nemodale. Acestea sunt receptionate prin bucla de mesaje a aplicatiei de catre GetMessage. Acest lucru ne frustreaza de prelucrarea automata a mesajelor de tastatura sau mouse pe care o facea managerul de dialog in cazul dialogurilor modale, utila mai ales in navigarea intre diferite controale ale dialogului precum si de directionarea lor de catre procedura dialogului. Pentru a compensa acest lucru Windows-ul ne ofera o solutie prin functia IsDialogMessage. Bucla de mesaje trebuie modificata dupa cum urmeaza:

while(GetMessage(&msg,NULL,0,0))A if(hDlgModeless==0 || !IsDialogMessage(hDlgModeless,&msg))
A
TranslateMessage(&msg);
DispatchMessage(&msg);
S
S

-Un aspect important in exemplu de mai sus este ca variabila hDlgModeless trebuie sa fie globala. Aceasta asigura initializarea ei cu zero in momentul initierii dialogului nemodal. La inchiderea lui trebuie avut grija la reinitializarea ei. Dupa cum e folosita se poate deduce ca IsDlgMessage returneaza TRUE daca mesajul este adresat dialogului si FALSE in caz contrar.
-In fine, ultimul aspect se refera la terminarea unui dialog nemodal.
Functia ce trebuie utilizata este DestroyWindow, iar momentul cel mai propice este tratarea mesajului WM_CLOSE pe care managerul de dialog nu-l proceseaza.
Codul care urmeaza este tipic in acest sens:

case WM_CLOSE:
DestoyWindows(hDlg); hDlgModeless=0; break;

Observati ca handle-ul ferestrei ''distruse'' nu este hDlgModeless, ci hDlg-primul parametru al procedurii de dialog. Acest WM_CLOSE este trimis dialogului daca utilizatorul selecteaza Close din meniul sistem, comanda valida doar pentru dialoguri nemodale. Daca dorim ca dialogul sa se incheie dupa apasarea unui buton, cea mai buna solutie este ca la tratarea mesajului de la buton sa trimitem dialogului un WM_CLOSE.

Dialogurile comune(Common DialogBoxes )

De la versiunea 3.1 Windows-ul este echipat cu cateva dialoguri predefinite, gandite pentru a fi utilizate in situatiile cele mai uzuale cum ar fi operatiile de deschidere/inlocuire de text, schimbare de culori sau fonturi.
Aceste dialoguri sunt cuprinse intr-un fisier .DLL (Dynamic Link Library biblioteca de functii accesibile in momentul executiei unei aplicatii Windows) din directorul Windows\System care se numeste COMMDLG.DLL. Programatorul poate utiliza aceste dialoguri daca precizeaza in sursa declaratia de includere a fisierului header commdlg.h, furnizat in SDK-ul pentru Windows 3.1 sau orice alt pachet C de dezvoltare aplicatii pentru Windows 3.1) care ne ofera functiile si structurile de initiere a lor. Iata in continuare lista acestor functii:

-CommDlgExtendedError-determina tipul de eroare returnat de procedura com-dialogului.
-ChooseColor -initiaza com-dialogul de selectie culoare pe baza structurii CHOOSECOLOR.
-ChooseFont -initiaza com-dialogul de selectie font pe baza structurii CHOOSEFONT.
-FindText -initiaza com-dialogul de cautare text pe baza structurii
FINDREPLACE.
-GetFileTitle -extrage numele de fisier dintr-un nume complet cuprinzand unitate:cale\nume.
-GetOpenFileName -initiaza com-dialogul de deschidere fisier pe baza structurii OPENFILENAME.
-GetSaveFileName -initaza com-dialogul salvare fisier pe baza structurii OPENFILENAME.
-PrintDlg -initiaza com-dialogul de tiparire pe baza structurii
PRINTDLG.
-ReplaceText -initiaza com-dialogul de cautare si inlocuire text pe baza structurii FINDREPLACE.

Fazele de initiere pentru unul din aceste dialoguri presupun actualizarea unei structuri specifice pentru initializarea dialogului si "personalizare", avind posibilitatea de a defini titlul, controalele necesare si cele care se doresc ascunse, starea initiala a acestora modul de operare, etc. Dupa aceasta initializare a structurii se apeleaza functia specifica de initializare a dialogului, care de obicei actualizeaza cimpurile de raspuns din structura si pozitioneaza niste flaguri spre modul de derulare a dialogului. In final, daca se doreste, se poate consulta prin functia CommDlgExtendedError daca totul a fost OK sau nu.
Trebuie remarcat ca aceste dialoguri sunt unul din cele mai frumoase cadouri oferite de realizatori Windows-ului cu noua versiune 3.1, scutind programatorul de foarte multa munca insipida, caci implementarea unor astfel de dialoguri nu este nici un lucru comod si nici deosebit de interesant. In plus se realizeaza o uniformizare a aspectului general al dialogurilor aplicatiilor, fapt apreciat mai ales de utilizatori.

Programul prezentat in acest labor poate fi caracterizat ca un exemplu de "ingeniozitate a lenevirii" in programarea sub Windows. Desi implementeaza un calculator hexazecimal cu zece operatori intr-o interfata completa pentru tastatura si mouse programul nu are mai mult de 150 de linii sursa in care nu veti gasi nici functia CreateWindow, procesarea mesajelor WM_PAINT sau a mesajelor de mouse. Fereastra aplicatiei este un hibrid intre o fereastra normala (OVERLAPPED) si un dialog nemodal. Tot trucul consta in inregistrarea clasei "HexCalc", din modul de resurse. Apelind CreateDialog pentru a crea fereastra, provocam nucleul la a construi toata fereastra aplicatiei inclusiv controalele dupa care aceasta va functiona pe baza procedurii WndProc care va procesa mesajele, fara a mai fi interpusa procedura de gestiune a dialogurilor din nucleu. Doua observatii: prima se refera la prezenta numelui procedurii WndProc in declararea clasei dialogului si a doua, necesitatea acelor octeti suplimentari DLGWINDOWEXTRA, de care nucleul are nevoie la crearea si gestiunea ferestrei.

Alt truc deosebit de util uneori este cel folosit pentru ID-urile controalelor.
Observati ca nu exista nici un fisier header care sa le contina deoarece s-au botezat dupa textul pe care il contine fiecare. O mica procesare a tastaturii este necesara insa, WM_Keydown face translatia pentru sageata-stanga in BkSpace. Pe parcursul tratarii mesajului WM_CHAR se verifica validitatea caracterelor de la tastatura interogind prezenta unui buton cu text similar prin functia GetDlgItem.
In cazul ca acesta exista se simuleaza apasarea lui prin trimiterea unui mesaj
BM_SETSTATE. Este doar un mic artificiu dar care sporeste "naturaletea" interfetei.
Daca observam mai indeaproape felul in care procedura scrisa se ataseaza dialogului prin simpla mentionare a ei in structura clasei definite, se poate merge mai departe si imagina ca daca s-ar putea afla clasa unei ferestre, s-ar putea sa o modificam asa incit mesajele unei ferestre sa nu ajunga la procedura ei ci la procedura noastra. Apoi dupa tratarile de rigoare o lasam pe aceasta sa-si finalizeze treaba si daca rezultatul returnat de ea nu convine, il modificam ulterior. Chiar daca lucrul pare la prima vedere nesemnificativ, aceasta tehnica este una din cele mai puternice si periculoase totodata. Este vorba de "subclasarea ferestrelor", operatie pe care o putem face cu ajutorul unui set de functii deosebite. Cele mai importante se pot vedea in sursa a doua prezentata in continuare: SUBCLAS.C(part.) un modul partial scris pentru un Dll (daca intentionati sa o folositi pentru un EXE amintiti-va sa inlocuiti
GetProcAddress cu MakeProcInstance). Fereastra hWndOn este subclasata de functia
Subclass pentru sub=TRUE si de-subclasata pentru sub=FALSE, procedura ferestrei este gasita prin GetWindowLong cu parametrul GWL_WNDPROC si modificata prin functia
SetWindowLong. Apelul procedurii originale se face din functia noastra care subclaseaza fereastra-SubclProc- prin functia CallWindowProc.

_________
HEXCALC.C

#include <windows.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

long FAR PASCAL WndProc(HWND,WORD,WORD,LONG);

int PASCAL WinMAin(HANDLE hInstance,HANDLE hPrevInstance,LPSTR lpszCmdLine, int nCmdShow ) A static char szAppNameai = "w7";
HWND hwnd;
MSG msg;
WNDCLASS wndclass; if( ! hPrevInstance ) A
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = DLGWINDOWEXTRA;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance,szAppName);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = COLOR_WINDOW + 1;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;

RegisterClass( &wndclass );
S hwnd = CreateDialog( hInstance, szAppName, 0 , NULL );
ShowWindow( hwnd, nCmdShow );
while( GetMessage( &msg, NULL, 0, 0 ) ) A
TranslateMessage( &msg );
DispatchMessage( &msg );
S return msg.wParam;
S void ShowNumber( HWND hwnd, DWORD dwNumber ) A char szBuffera20i;
SetDlgItemText( hwnd, VK_ESCAPE, strupr(ltoa(dwNumber,szBuffer,16)));
S
DWORD CalcIt(DWORD dwFirstNum, short nOperation, DWORD dwNum)
A switch( nOperation ) A case '=': return dwNum; case '+': return dwFirstNum + dwNum; case '-': return dwFirstNum - dwNum; case '*': return dwFirstNum * dwNum; case '&': return dwFirstNum & dwNum; case 'I': return dwFirstNum I dwNum; case '^': return dwFirstNum ^ dwNum; case '<': return dwFirstNum << dwNum; case '>': return dwFirstNum >> dwNum; case '/': return dwNum ? dwFirstNum / dwNum : ULONG_MAX; case ' ': return dwNum ? dwFirstNum % dwNum : ULONGMAX;
S
S long FAR PASCAL WndProc( hwnd, WORD message, WORD wParam, LONG lParam ) A static BOOL bNewNumber = TRUE; static DWORD dwNumber, dwFirstNum; static short nOperation = '=';
HWND hButton; switch( message ) A case WM_KEYDOWN: if( ( wParam = toupper( wParam )) == VK_RETURN )
wParam = '='; if( hButton = GetDlgItem( hwnd, wParam )) A
SendMessage( hButton, BM_SETSTATE, 1, OL );
S else A
MessageBeep( 0 ); break;
S // continuare in conditia urmatoare case WM COMMAND:
SetFocus( hwnd ); if( wParam ==WK_BACK )
ShowNumber( hwnd, dwNumber /= 16 ); else if( wParam == VK_ESCAPE )
ShowNumber( hwnd, dwNumber = OL ); else if( isxdigit( wParam ) ) A if( bNewNumber ) A dwFirstNum = dwNumber; dwNumber = OL;
S bNewNumber = FALSE; if( dwNumber <= ULONG_MAX >> 4 )
ShowNumber( hwnd, dwNumber = 16 * dwNumber +
wParam - ( isdigit( wParam ) ? 'O' : 'A' - 10 ) ); else
MessageBeep( 0 );
S else A if( ! bNewNumber )
ShowNumber ( hwnd, dwNumber = CalcIt(dwFirstNum, nOperation, dwNumber ) ); bNewNumber = TRUE; nOperation = wParam;
S return 0; case WM_DESTROY:
PostQuitMessage( 0 ); return;
S return DefWindowProc( hwnd, message, wParam, lParam );
S

___________
HEXCALC.DEF

NAME w7

DESCRIPTION "Calculator Hexazecimal"
EXETYPE WINDOWS
STUB "WINSTUB.EXE"
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 1024
STACKSIZE 8192
EXPORTS WndProc

__________
HEXCALC.RC

#include <windows.h>
HexCalc ICON w7.ico
HexCalc DIALOG 32768, 0, 102, 122
STYLE WS_OVERLAPPED I WS_SYSMENU I WS_MINIMIZEBOX
CLASS "w7"
CAPTION "Hex Calculator"
A
PUSHBUTTON "D", 68, 8, 24, 14, 14
PUSHBUTTON "A", 65, 8, 40, 14, 14
PUSHBUTTON "7", 55, 8, 56, 14, 14
PUSHBUTTON "4", 52, 8, 72, 14, 14
PUSHBUTTON "1", 49, 8, 88, 14, 14
PUSHBUTTON "O", 48, 8, 104, 14, 14
PUSHBUTTON "0", 27, 26, 4, 50, 14
PUSHBUTTON "E", 69, 26, 24, 14, 14
PUSHBUTTON "B", 66, 26, 24, 14, 14
PUSHBUTTON "8", 56, 26, 56, 14, 14
PUSHBUTTON "5", 53, 26, 72, 14, 14
PUSHBUTTON "2", 50, 26, 88, 14, 14
PUSHBUTTON "Back", 8, 26, 104, 32, 14
PUSHBUTTON "C", 67, 44, 40, 14, 14
PUSHBUTTON "F", 70, 44, 24, 14, 14
PUSHBOTTON "9", 57, 44, 56, 14, 14
PUSHBUTTON "6", 54, 44, 72, 14, 14
PUSHBUTTON "3", 51, 44, 88, 14, 14
PUSHBUTTON "+", 43, 62, 24, 14, 14
PUSHBUTTON "-", 45, 62, 40, 14, 14
PUSHBUTTON "*", 42, 62, 56, 14, 14
PUSHBUTTON "/", 47, 62, 72, 14, 14
PUSHBUTTON "&", 37, 62, 88, 14, 14
PUSHBUTTON "Equalsœ", 61, 62, 104, 32, 14
PUSHBUTTON "&& ",38, 80, 24, 14, 14
PUSHBUTTON "I" ,124, 80, 40, 14, 14
PUSHBUTTON "^",94, 80, 56, 14, 14
PUSHBUTTON"<", 60, 80, 72, 14, 14
PUSHBUTTON ">",62, 80, 88, 14, 14
S

-------------------------- SUBCLAS.C (part.)

FARPROC lpfnwndon;
//////////////////////////// voidSubclass(BOOL sub, hwndon )
A
FARPROC lpfnSubclProc; if(sub)A lpfnWndOn =(FARPROC)GetWindowLong(hWndOn,GWL_WNDPROC); lpfnSubclProc =GetProcAddress(hinst, "SubclPROC";
SELSE lpfnSubclProc =lpfnWndon;
SetWindowLong(hWndOn, GWL_WNDPROC,(LONG)lpfnSubclProc);
S
//////////////////////////////////////////////////////////////

LRESULT CALLBACK SubclProc(HWND hWnd, UINT message,
WPARAM wParam,LPARAM 1 Param)
A
LONG lres;
....
// procesarea mesajelor"filtrate total" switch( message)A case WM_...; return...;
S
//apel pentru procesarea mesajelor la functia "originala" lres =CallWindowBroc( lpfnWndOn, hWndOn, messade,
wParam, lParam);

// eventuala modificare a rezultatului "original" pentru anumite mesaje
// switch( message ) A case WM... break;
S return lres;
S


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 -