01
Noi
2007

Introducere

Acest articol este adresat in special incepatorilor in programare Windows, cu scopul de a lamuri si a fixa unii termeni privitori la tipuri de ferestre, termeni folositi de multe ori in mod gresit. Sa vedem impreuna ce sunt ferestrele asazise overlapped, popup, child si owned.

The story

De mult, tare de mult, pe cand Windows-ul mai purta pampersi (in versiunile 1.x), existau doua tipuri principale de ferestre: tiled si overlapped. Cele din urma erau mult mai "cool" la vremea respectiva pentru ca le puteai aranja si pune una peste alta. Intre timp ferestrele tiled au disparut, nici nu se mai stie prea bine cum au fost alea, iar azi putem spune ca toate ferestrele sunt overlapped. Asta-i, cred, un motiv pentru care stilul WS_OVERLAPPED are valoarea 0 (zero).

// WINUSER.H
#define WS_OVERLAPPED       0x00000000L

De altfel, desi ferestrele "tiled" nu mai exista, totusi stilul WS_TILED n-a fost definitiv sters cu radiera si are valoarea:

// WINUSER.H 
#define WS_TILED            WS_OVERLAPPED

Clar pana aici, cred. Se vorbeste intre programatorii Windows, se scrie prin manuale, despre ferestre overlapped, popup, si child. Care este deosebirea dintre ele?

Cel mai simplu, o luam de la coada la cap:

  • 3. Child - sunt ferestrele care au stilul WS_CHILD (sau sinonim, WS_CHILDWINDOW). Child sunt de cele mai multe ori controalele (buton, edit, listbox, etc). Principala lor proprietate este ca nu pot exista decat in zona client a unei ferestre parinte. Toate celelalte ferestre (care nu sunt child) se numesc ferestre top-level si pot exista oriunde in ecran.

  • 2. Popup - sunt ferestrele care nu au stilul WS_CHILD dar au stilul WS_POPUP; se foloseste de obicei pentru ferestre de mici dimensiuni si care exista pentru scurt timp. Exemple tipice de ferestre popup sunt dialogurile modale.

  • 1. Overlapped - raman ferestele care nu au nici stilul WS_CHILD nici stilul WS_POPUP. Acestea se folosesc de obicei ca fereastra principala a unei aplicatii. O caracteristica interesanta pentru ferestrele overlapped este ca la creare sistemul adauga automat un caption chiar daca stilul WS_CAPTION nu este mentionat in functia CreateWindow() sau CreateWindowEx(). Bineinteles, acesta poate fi eliminat mai tarziu scotind flag-ul WS_CAPTION cu ajutorul functiei SetWindowLong().

In practica, aceste stiluri principale sunt utilizate in combinatie cu alte stiluri WS_BORDER, WS_CAPTION, WS_SYSMENU, etc si exista chiar definite (in WINUSER.H) stiluri "compuse" cum ar fi de exemplu:

#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | 
                             WS_CAPTION        | 
                             WS_SYSMENU        | 
                             WS_THICKFRAME     | 
                             WS_MINIMIZEBOX    | 
                             WS_MAXIMIZEBOX) 

#define WS_POPUPWINDOW  (WS_POPUP          | 
                         WS_BORDER         | 
                         WS_SYSMENU)

Acum, sa revenind la stilul WS_OVERLAPPED (cel cu valoarea zero). O ciudatenie care ar trebui tinuta minte: o fereastra cu stilul WS_OVERLAPPED "curat", adica fara WS_CAPTION si WS_BORDER are totusi un caption si un border, probabil mostenire din mosi stramosi, de pe vremea cand Windows-ul purta pampersi...

A mai ramas de explicat termenul de fereastra owned. De foarte multe ori de foloseste in mod gresit termenul de child window in loc de owned window. Dupa cum am mai spus, o fereastra child are setat stilul WS_CHILD iar principala sa proprietate este ca nu poate exista decat in zona client a unei ferestre parinte. In schimb, o fereastra owned, cu toate ca depinde de o alta fereastra (owner), poate exista oriunde in ecran. Owned poate fi orice fereastra top-level (overlapped sau popup). Depinde de owner in sensul ca este distrusa cand este distrus ownerul si este ascunsa atunci cand ownerul este ascuns sau minimizat. De asemenea, este intotdeauna afisata in fata owner-ului.

[phpBB Debug] PHP Warning: in file [ROOT]/phpbb/db/driver/mysqli.php on line 317: mysqli_free_result(): Couldn't fetch mysqli_result