Posturi fereastra copil la fereastra părinte

În cazul în care administrația își schimbă starea, funcția de fereastra părinte primește un WM_COMMAND. Împreună cu mesajul procedura fereastra primește și informații suplimentare. Aceste opțiuni suplimentare au următoarele semnificații:

- identificator de copil-fereastră (tip UINT);

- Codul de notificare (tip UINT);

- mâner la fereastra copil (de tip HWND).

• ID-ul fereastra copil - această valoare este trecut la o funcție

CreateWindow, când creați fereastra de lucru.

• Mânerul fereastra copil - valoarea pe care Windows se întoarce apelul la CreateWindow.

• Codul de notificare - acesta este un cod suplimentar care utilizează fereastra copil la fereastra părinte pentru a informa informații mai precise despre mesajul.

Constante de identificare codurile de notificare diferite sunt definite în fișierele antet de Windows și au următoarele prefixele, respectiv: BN_ -

"Buton", en_ - "edita", LBN_ - "listbox", CBN_ - "combobox-ul" și SB_ - "scroll".

Luați în considerare fragmentul procedurii de fereastră a ferestrei părinte în care are loc prelucrarea la apăsarea butonului, un identificator de fereastră de copil

HWND hChild = (HWND) lParam; // mâner într-o fereastră de copil în cazul în care (idCtl == ID_buttoncode == BN_CLICKED)

// buton a fost apăsat

CloseWindow (hWnd); // închide părintele

Posturi fereastra părinte copil ferestre

Fereastra părinte poate trimite mesaje la ferestrele copil, ca răspuns la faptul că este o fereastră de copil va efectua o varietate de acțiuni. Pentru a face acest lucru, trebuie să știi mânerul ferestrei copilului.

• Trimiterea posibil ca mesaj obișnuite fereastră (e WM_ prefix) și specifice pentru fiecare tip de control

Constantele care identifică mesaje diferite pentru ferestrele de control al copilului sunt definite în fișierele antet de Windows și au următoarele prefixele, respectiv: BM_ - „buton“, EM_ - „Edit“, LB_ - „listbox“, CB_ - „combobox“.

Pentru a lucra cu „scroll“ ferestrele de clasă sunt folosite set special / Get-funcție

(.) Există două modalități de a trimite mesaje.

• Înregistrați un mesaj în coada de așteptare de aplicare. Ea se bazează pe utilizarea funcției

PostMessage. Această facilitate pune un mesaj în coada de mesaje pentru fereastra specificată în setările, și se întoarce imediat. înregistrate la

Funcția PostMessage ajutor este selectat și mesajul va fi procesat în bucla de mesaje.

• Transmiterea directă a funcției fereastră, care trece coada de mesaje. Această metodă este implementată funcția SendMessage. Spre deosebire de funcția funcția SendMessage PostMessage solicită funcția fereastră, și returnează numai după revenirea funcției fereastră, care transmite mesajul.

Fiecare fereastră de copil are un mâner fereastră (tip HWND) și un identificator de fereastră (tip UINT), care sunt unice, printre altele. Cunoașterea uneia dintre aceste elemente permite aplicației pentru a obține un altul.

• Dacă știți fereastra mâner hWndChild copil, puteți obține ID-ul său:

• Puteți utiliza, de asemenea, o altă funcție (deși o parte din „DLG“ numele funcției se referă la fereastra de dialog, de fapt, o funcție de scop general):

• Cunoașterea id fereastra copil Identificatorul, puteți obține un mâner: HWND hWndChild = GetDlgItem (hWndParent, id);

Luați în considerare mesajul ferestrei părinte hWnd fereastra copil Editare „edita“ clasa. C fereastra de editare descriptor hWndEdit transmis mesajul cu privire la stabilirea numărului maxim de caractere de intrare (5 caractere):

UINT ID_edit static = 3;

statică HWND hWndEdit;

Fiica ferestrei și focalizarea de intrare

Controalele pentru copii primesc focalizarea atunci când faceți clic pe ele.

În cazul în care cutia de control copil primește focusul de intrare, fereastra părinte își pierde;

toate de intrare tastatura este trimis la nu mai părinte fereastră, și o cutie de control filială.

• Această situație ridică o problemă evidentă: aplicația pierde controlul asupra prelucrarea mesajelor de la tastatură.

Un exemplu este faptul că o fereastră de suprapunere nu este în măsură să furnizeze utilizatorului trecerea de la control pentru a controla cu tastele săgeată și .

Soluția la această problemă este de a utiliza o tehnică numită crearea unei subclase a ferestrei (fereastra subclasarea, distribuiri în subclase, instalarea noii proceduri de fereastră).

• Subsidiarele procedura fereastra de control ferestrele amplasate în măruntaiele de Windows.

Cu toate acestea, este posibil să se obțină adresa procedurii ferestrei apelând

GetWindowLong, în care identificatorul este utilizat ca un parametru

Apelarea SetWindowLong funcție nu se poate obține numai adresa procedurii fereastra de control fereastra copil, dar, de asemenea, stabilit o nouă procedură de fereastră.

De exemplu, noi filiale fereastra control tratamente ferestrele atunci când primesc mesaje de taste și poate transfera pur și simplu de intrare de focalizare funcția setfocus următoare (sau anterior) controale fereastră de copil. Pentru prelucrare, acestea pot provoca, de asemenea, alte tipuri de mesaje vechea procedură fereastră ferestre de control folosind funcția CallWindowProc corespunzătoare.

Subsidiarele și fereastra de control de culoare

În cazul în care se suprapun alb fereastra de afișare a mai multor filiale de control Windows, inclusiv butoane de stiluri diferite, veți vedea că casetele de selectare de tip buton și cele de radio nu arata foarte atractiv - ele au același fundal gri, care nu este foarte frumos pe fundalul alb al ferestrei parinte . Acest lucru se întâmplă pentru că

cutie de control este destinat în principal pentru afișare în casetele de dialog,

și ei au de obicei o suprafață gri.

Pentru comenzile de copii ale ferestrei se uită atractiv, trebuie

• sau într-un fel schimba culoarea unei ferestre, coordonare cu culorile ferestrei de control;

• sau schimba fereastra de control al culorilor.

Schimbarea culorii unei ferestre

Să considerăm acum prima cale de a rezolva problema de culoare. Pre discuta despre modul în care Windows utilizează culorile de sistem (sistem de culori).

Windows acceptă 25 de culori de sistem, concepute pentru a desena diferitele elemente ale ecranului. Aplicația poate obține și seta valorile curente ale acestor culori (pentru sesiunea curentă Windows) cu ajutorul funcțiilor GetSysColor și identificatori SetSysColor și culori de sistem. culori de sistem Identificatorii prefixate COLOR_, sunt definite în fișierele antet Windows.

• De exemplu, COLOR_BTNFACE de culoare este culoarea principală a suprafeței butoanelor apăsate și culoarea de fundal rămase (aceeași culoare este folosită în casetele de dialog și mesaje). O culoare COLOR_WINDOWTEXT pentru steaguri și radiopereklyuchateley utilizate ca culoarea textului.

Pentru a determina clasa ferestrei părinte pentru culoarea spațiului de lucru de fundal, puteți utiliza sistemul, de exemplu COLOR_BTNFACE:

• Windows înțelege că în cazul în care valoarea câmpului hbrBackground atât de scăzut, de fapt, aceasta se referă la un sistem de culoare, nu un mâner real al periei. Pentru Windows, în acest caz, este necesar ca atunci când se utilizează identificatori de culori ale sistemului adăugat pentru a le 1 (la această valoare nu a fost egal

• Dacă textul de afișare pe ecran utilizând funcția TextOut, Windows pentru culoarea de fundal a textului (culoarea care estompează fundalul din spatele textului) și culoarea textului utilizează valorile definite în cadrul dispozitivului. Valoarea implicită este de culoare albă (fond) și negru (text) de culoare, indiferent de sistemul de culori și câmpurile hbrBackground structura ferestrei de clasă.

Pentru a schimba culoarea de fundal și textul afișat în zona de lucru a ferestrei părinte la culoare de sistem, este necesar, după primirea mânerului HDC contextul Dispozitiv pentru fereastra părinte a ferestrei pentru a apela funcția:

Ca urmare, culoarea de fond a zonei de lucru a ferestrei părinte, culoarea de fundal a textului și culoarea textului sunt aliniate cu butoanele de culoare.

Personaliza culoarea de control fereastra copil

În cazul în care cutia de control a copilului este pe cale de a atrage zona de operare, acesta trimite mesajul procedura fereastra mamă corespunzătoare

WM_CTLCOLOR ... (de exemplu, butonul trimite un mesaj WM_CTLCOLORBTN).

• fereastra părinte pe baza acestui mesaj poate schimba culorile,

care va folosi procedura fereastră a ferestrei copil atunci când desen.

• Fereastra părinte poate controla culorile copilului ferestrele sale. Că ferestrele cerere de procesare mesaj de informații subsidiare de culoare și există un al doilea mod de a rezolva problema de lipsa de coerență a culorilor.

Luați în considerare exemplul butoanelor de culoare. Când butonul va desena spațiul de lucru, acesta trimite un mesaj de procedura fereastra părinte WM_CTLCOLORBTN. fereastra părinte pe baza acestui mesaj poate schimba culorile care vor fi utilizate în procedura de fereastră atunci când desen butoane.