Introducere în WinAPI

În cele din urmă! În cele din urmă! Astăzi vom începe să creeze o fereastră Windows complet. La revedere consola mizerabil.

Până acum, ar trebui să aveți deja o idee bună să cunoască sintaxa C ++, să fie capabil să lucreze cu ramuri și bucle, o bună înțelegere a funcțiilor de lucru. Dacă te descurci cu o luptă mare, puteți presupune că ai învățat toate astea.

notație maghiară

Toate codul, pe care o vom întâlni în WinAPI scrise în formă maghiară. Acesta este un acord cu privire la scrierea de cod.

În acest caz, numele variabilei este pus tipul inițial. Toate cuvintele din numele de variabile și funcții începe cu o literă de capital.

Iată câteva prefixe:

b - o variabilă de tip bool.
l - o variabilă de tip întreg lung.
w - din cuvânt (word) - 16 biți. O variabilă de tip scurt unsigned.
dw - de la dublu cuvânt (DWORD) - 32 de biți. O variabilă de tip unsigned long.
sz - se termină linia zero (șir terminat zero). Doar un șir obișnuit, pe care le sunt utilizate în mod constant.
p sau lp - pointer (de la indicatorul). lp (de la indicatorul lung) - date de indicatorul trecut din trecut. Acum, lp și p înseamnă același lucru.
h - un mâner (pe mâner).

De exemplu, indicatorul va fi numit ca aceasta:

Această formă de scriere folosit de Microsoft. Mulți critică această metodă de numire variabile. Dar astfel de lucruri (convenții de codificare) sunt vitale în companiile mari.

Permiteți-mi să vă reamintesc că constant de identificare, de obicei, constau doar din litere mari: WM_DESTROY. WM_DESTOY - este 2, constanta determinata prin defini.

Și un alt lucru pe care noi nu înțelegem. Semne de multe ori setat la NULL. Luați în considerare doar 0 și indicii care setate la NULL (zero), nu indică nici o locație de memorie.

API Windows (WinAPI)

Toate programele Windows folosesc o interfață specială de programare WinAPI. Acesta este un set de funcții și structuri ale limbajului C, datorită căreia programul devine compatibil cu Windows.

API Windows are mari oportunități de a lucra cu sistemul de operare. S-ar putea spune chiar - fără limite.

Noi nu considerăm nici măcar un procent din toate oportunitățile WinAPI. Inițial, am vrut să iau mai mult material, dar ar dura prea mult timp, și împotmolit în mlaștină WinAPI, DirectX'a până când am ajuns la câțiva ani. Descriere WinAPI ia două lecții (inclusiv acesta). În ele vom lua în considerare doar cadrul de aplicare pentru Windows.

Programul sub Windows, în același mod ca și programul de sub DOS, are funcția principală. Aici, o funcție numită WinMain.

program Windows este format din următoarele componente (toate acestea se întâmplă în interiorul WinMain):

Crearea și înregistrarea unei clase fereastră. A nu se confunda cu clasele de C ++. WinAPI scris în C, nu există clase în sensul obișnuit al cuvântului.
Crearea ferestrei programului.
Bucla principală în care sunt prelucrate mesaje.
Prelucrarea mesajelor programului în procedura fereastra. Procedura de fereastră este o caracteristică standard.
Aceste patru elemente - un program bazat pe Windows. În timpul acestei și lecția următoare ne vom uita la toate acestea în detaliu. Dacă rămâneți blocat în descrierea programului, apoi du-te înapoi la aceste puncte.

Acum, să ne examinăm totul în detaliu:

WinAPI: Structura WNDCLASS

În primul rând aveți nevoie pentru a crea și popula o variabilă structura WNDCLASS, și apoi pe baza acestuia să se înregistreze clasa ferestrei.

Iată această structură:


Structura WNDCLASS compus WinAPI definește proprietățile de bază ale noii ferestre: pictogramele, cursorul mouse-ului, dacă meniul fereastră, care va aparține fereastra aplicației.

După finalizarea structurii, bazată pe ea, vă puteți înregistra o clasă de fereastră. Noi nu vorbim despre aceste clase în C ++. Mai degrabă, se poate presupune că clasa ferestrei este un șablon pe care l-ați înregistrat în sistem, și puteți crea acum mai multe ferestre bazate pe acest șablon. Și toate aceste ferestre vor avea proprietățile pe care le-ați definit în variabila WNDCLASS structura.

WinAPI: Funcția CreateWindow

După înregistrarea clasa ferestrei, pe baza a creat aplicației principale (acum suntem angajat într-al doilea punct) fereastră. Acest lucru se face folosind funcția CreateWindow. Acesta are următorul prototip:


În cazul în care clasa ferestrei (structura WNDCLASS) sunt date proprietățile de bază ale ferestrei, aici - mai specifice pentru fiecare fereastră: dimensiunea ferestrei, locație.

Această funcție returnează un mâner la fereastra. Cu ajutorul unui mâner, puteți accesa fereastra, este vorba despre ca un identificator.

Vă rugăm să rețineți că există o mulțime de noi tipuri. De fapt, acestea sunt toate vechi, pur și simplu înlocuite. De exemplu: HWND - acest tip de redefinire MÂNER, care, la rândul său, este un PVOID suprascrie, care, la rândul său, este un vid suprascrie *. Cât de adânc îngropat adevărul! Cu toate acestea, de tip HWND - un pointer la anula.

Fereastra este format din mai multe părți. Practic, fiecare program se va vedea: bara de titlu, meniul de sistem (dacă faceți clic pe pictograma aplicației în colțul din stânga sus a ferestrei), trei butoane de sistem pentru a lucra cu fereastra: minimiza, maximiza la ecran complet și aproape. De asemenea, aproape întotdeauna prezintă în meniul aplicației. Asta e doar ultimul noi pur si simplu nu. Și, desigur, cea mai mare parte a ferestrei este ocupată de așa-numitul Zona client, care este de obicei în sus și să fie difuzate de către utilizator.

Atât de mult pentru modul stabilit. Destul de mult timp, vom practica cu DiectX în fereastra - nu va folosi modul ecran complet.

Mesajele de prelucrare (manipulare mesaj)

Diferența principală dintre toate programele noastre anterioare din programele sub Windows procesează mesaje.

De exemplu, atunci când utilizatorul apasă orice tastă de pe tastatură, un mesaj este generat faptul că cheia a fost apăsată. Acest mesaj este apoi furnizat la aplicația care a fost activ atunci când utilizatorul apasă o tastă.

Aici am un eveniment a avut loc (eveniment) - cheia a fost apăsată.

Un eveniment poate fi: Mutați cursorul mouse-ului, schimba focalizarea aplicație, apăsarea tastelor de pe tastatură, închide fereastra. Evenimente foarte mult. Foarte! Pentru al doilea zece evenimente pot apărea în sistemul de operare.

Deci, atunci când există un eveniment, sistemul de operare creează un mesaj: aceasta a fost apăsată o tastă, cursorul coordonatele de schimbare prin deschiderea unei noi ferestre.

Mesajele pot determina sistemul de operare și aplicații diferite.

Mesajul este o structură, și după cum urmează:


Observați modul în care folosirea structura redefinit typedef.

Pentru a crea această structură, puteți folosi următorul cod:

Totul. Apoi, puteți utiliza această structură ca de obicei.


Aici, câmpul, care conține codul mesajului (numele mesajului este comparat cu WM WM_DESTROY constantă -. Din Windows Message (Mesaj Windows) WM_DESTROY -. Este un mesaj care este generat atunci când fereastra este închisă (distruge - distruge).

Codurile de raportare determinate de constantele și prefixul sunt WM_: WM_CLOSE, WM_CREATE și colab.

Structura MSG întâlnește tip HWND - din fereastra de mâner (un mâner fereastră sau un mâner fereastră). Acesta este genul de lucru pe care „descrie“ fereastra. Este ceva de genul un identificator (nume de fereastră).

Amintiți-vă că un cuvânt - mâner (un mâner, mânerul). Pe Windows, acest termen este folosit foarte des. Aproape toate tipurile de Windows, începând cu H - descriptori: icoane descriptori, descriptor font, mânerul de aplicare instanță. Ei au fost de aproximativ treizeci de câte îmi amintesc.

Toate interacțiunea dintre aplicațiile în Windows sunt realizate cu ajutorul acestor ferestre mânere aceleași (hWnd).

Există un alt descriptor de important - aplicarea descriptor (HINSTANCE - primul parametru WinMain) - un identificator unic pentru aplicație, prin care sistemul de operare nu va fi capabil să se amestece două programe diferite. Este ca un cod de bare. Ne vom uita la ea mai târziu.

De fiecare dată când un utilizator efectuează o acțiune, creează și umple mesajul: specifică mânerul ferestrei pe care ar trebui să primească acest mesaj, ID-ul mesajului este setat, umplut cu parametrii completate in timp (curent) și identifică coordonatele cursorului mouse-ului (a se vedea structura).

După aceea, mesajul este adăugat în coadă de mesaje ale sistemului de operare. Când este vorba de toate mesajul nostru, acesta este trimis la fereastra corectă (ferestre știe ce fereastră pentru a trimite fiecare mesaj prin descriptori). Atunci când un mesaj vine în cerere, este coada de așteptare mesaje de aplicație. De îndată ce își dă seama de toate, este procesat.

Uite, între momentul în care utilizatorul a făcut nicio acțiune (evenimentul a avut loc și de a genera un mesaj) și momentul în care programul a răspuns la această acțiune (mesajul a fost procesat de către program), există mai multe evenimente. La urma urmei, la fel ca în Windows Mesaj și eșalonare în coada de așteptare de mesaje de aplicație poate fi o mulțime de mesaje. În primul caz putem vorbi despre sutele, în al doilea caz, cel puțin câteva.

Procedura fereastra (Procedura Window - WndProc)

Continuăm cu momentul în care mesajul primit la toate mesajele de aplicație. Odată ce-l de toate atins, acesta este procesat. Procedura de fereastră - pentru a procesa mesajele din fiecare program trebuie să existe funcție specială. De obicei, este numit WndProc (din procedura fereastra). Procedura de apel fereastră se află în ciclul principal și executat în timpul fiecărei iterație a buclei.

Mesajele (sub formă de variabile structurale MSG) se încadrează în această funcție ca parametri: un mâner fereastră, identificatorul de mesaj și doi parametri. Vă rugăm să rețineți că procedura de fereastră nu se transmite timp și câmp pt. Aceasta este, mesajul a fost deja „demontat“.

In interiorul procedura fereastra situată ramificare de comutare, în care există o verificare a ID-ul mesajului. Aici este un simplu tratamente fereastra (aceasta este de lucru complet):

Și, în sfârșit - bucla principală. Este foarte simplu. Fiecare iterație a buclei verifică mesajele de aplicație coadă. Dacă există un mesaj, acesta este tras din coadă în coada de mesaje. Apoi, în buclă este un apel procedura fereastra pentru a procesa preluat din coada de mesaje.

Aici, în general, este tot pentru ziua de azi. Deja este clar că un program este mult mai complicat program de WinAPI sub DOS. Așa cum am scris mai sus, în lecția următoare ne vom uita la programul de cod de rulare.

Ca un exercițiu, a crea un nou proiect. În fereastra New Project (proiect nou), selectați un șablon (șablon) - Win32Project (până în prezent am ales Win32 Console Application). Într-una din aceste ferestre nu pun caseta Proiect gol (proiect gol) si IDE genereaza programul piesei de prelucrat.

Dacă te uiți atent la codul de fișier imya_proekta.cpp, veți găsi toate lucrurile pe care le-am discutat: variabila structura de MSG, umplere structura WNDCLASS, creând o funcție fereastră de CreateWindow, bucla principală de program. În plus, fișierul definește o funcție WndProc. În ea există o prelucrare mai multe mesaje în ramurile comutator: WM_COMMAND, WM_PAINT, WM_DESTROY. Găsiți totul în fișierul.

Pe lângă faptul că am revizuit, programul conține o mulțime de cod suplimentar. În numărul următor ne vom uita la codul de program, care va fi tăiat toate inutile. Acesta va fi mult mai simplu și mai ușor de înțeles ceea ce generează IDE.

descriptor, antetul descriptor (antet) --- date care descrie ceva.
etc, iar această structură este WNDCLASS WAVEHDR, ceva care la începutul fișierelor BMP și au, informatii despre tine la Microsoft și Google ..

dB după cum urmează:
h - ID-ul, mânerul (pe mâner).

Sper că acum va exista o confuzie între numărul de identificare (cu mâner) și a datelor (descriptor)?

Cele mai recente de la bord

Gromova Anastasiya → Slot Machines pentru bani reali
Majoritatea fac parte din mașinile de joc cu un bob de sare! Se presupune ca toate aceste prostii, dle câștiga acolo.

Gromova Anastasiya → Licentiat Casino Online
Majoritatea fac parte din mașinile de joc cu un bob de sare! Se presupune ca toate aceste prostii, dle câștiga acolo.

Gromova Anastasiya → vulcan cazinou bani reali?
Majoritatea fac parte din mașinile de joc cu un bob de sare! Se presupune ca toate aceste prostii, dle câștiga acolo.

Gromova Anastasiya → Acesta este norocos mea!
Majoritatea fac parte din mașinile de joc cu un bob de sare! Se presupune ca toate aceste prostii, dle câștiga acolo.

Edvard007 → anonimatul online din profesioniști | prețuri accesibile
Stimați utilizatori. Nostru VPN-client la versiunea 1.6. Am reproiectat și îmbunătățit Def.

WapCash → Wap.cash - cea mai bună soluție pentru generarea de bani traficul mobil
Bună ziua, prieteni! Știm cu toții că marketingul situațională, în special pe baza luminos.

prietenii noștri