Introducere în programare sub ferestre

Nu contează cât de dorit, și nu a putut evita subiectul.

Unele terminologie. Consultați acest articol în introducerea Win32 ar fi greșit - o aplicație consolă pe Windows este același cu drepturi depline aplicația Win32. Ce este o aplicație consolă? Oh, da - Da ce se confruntă în mod regulat cu astfel de programe - cum ar fi manager de dosarul meu favorit FAR este o aplicație completă consolă Win32. Punctul de intrare pentru aplicația consola este aceeași ca și în programul de dos în C - este principala funcție (). Categoric divizat aplicație Windows și consola, de asemenea, cred că, nu ar fi corect - programul este utilizat ca punct de intrare în programul WinMain (), așa cum poate părea, nu poate crea o fereastră, și chiar organizarea lor provocare consola AllocConsole (!) (), și o consolă aplicație poate crea o fereastră fără probleme. Există doar o singură întrebare rezonabilă: de ce este necesar? ;) Aplicatii consola sunt bune de auto-suficiență - acestea sunt ideale pentru instrumente de linie de comandă. Pe fondul ferestrei de aplicație, voi spune nu - chiar mai jos vom merge direct la ferestrele de aplicații în Windows.

Ei bine, asta - trece la crearea de aplicații desktop? Așa cum am spus deja punctul de intrare WinMain () aplicații Windows. Da - Aproape am uitat - exemplul și codul sursă sunt AICI. Apendicele ușurință absolută - nu se aștepta nimic neobișnuit la el. Scopul nostru este de a înțelege ideea generală.

Deci, WinMain (). Să ne ocupăm definiția sa. Ei bine, ce funcția returnează int, este clar (de altfel, ea revine mereu - pentru a trece peste valoarea returnată să zicem, în vid nu va funcționa - compilatorul va genera o eroare) - dar asta e ceea ce WinAPI? Un cititor experimentat a avut deja (în cazul în care se confruntă cu o structură similară) de căutare prin intermediul antetele * fișierele .h la Windows ( „antete“) în macro căutare WinAPI. Determinarea este în windef.h. WinAPI Într-adevăr, care este substituit, depinde de platforma (OS) și versiunea de compilator. Deci, ce este? Această funcție convenție de asteptare. Ce este? Cert este că orice program de nivel înalt (desigur, vorbim despre compilatoare și interpreții nu sunt), difuzate în compilarea compilații coduri de înțeles de către procesor. Acum aveți nevoie de un minim de cunoștințe Intel IA-32 arhitectura (suficient chiar mai devreme) procesoare. În limbaj de asamblare (limba în care o echipa este comparabil cu un comando cod mașină - în, același cod general de mașină, dar ușor de înțeles pentru forma umană) nu este un apel de funcție cu parametri, precum și returnează rezultatul - dar există o stivă, registre, un salt necondiționat JMP și subrutina apel. Ce cod generează un compilator - depinde de el - nu voi atinge pe acest subiect vast - cu excepția să spun că există o serie de acorduri prin care compilatorul generează un cod pentru a apela funcții - aici sunt unele dintre ele (calea - un program scris în limbaj de asamblare de mână să nu adere neapărat la orice acorduri și de ce programator poate utiliza cu ușurință registrele necesare pentru a-l -.? pentru că el scrie funcția în sine este o altă problemă atunci când utilizează unele biblioteci standard, -. acum API caietul de sarcini limitate utilizate pentru a le):

* __stdcall - parametrii transmiși pe stivă - de la dreapta la stânga (în ordine inversă - primul argument se bazează pe stiva ultima). procedură numită „returnează“ stiva ESP indicatorul „pe loc“. Cele mai multe funcții Win32 folosesc aceste acorduri.

* __cdecl - parametrii transmiși pe stivă de la dreapta la stânga. Apelantul (cel de la care a fost inițiat apelul) „reguli“ stivă. Clasic provocare în Xi.

* __pascal - parametrii trecut pe stivă, de la stânga la dreapta. Stivă „exclus“ procedura numită. acord tipic solicită „Pascal“.
thiscall - parametrii transmiși pe stiva de la dreapta la stânga, plus ECX înregistra într-un pointer la un C ++ acest lucru. Apelant „dreapta“ stivă. Apelarea C ++.
  • __fastcall - primul și al doilea parametrii sunt trecute la o pereche de ECX și EDX înregistrează, restul - prin stiva de la dreapta la stânga, funcția numită „Reguli“ stivă. Acordul Borland (care are Inprise lung;) pentru fiecare Inprise Delphi și C ++ Builder'ov.

    Pentru o înțelegere completă, voi da un exemplu de modul de asamblare cel mai probabil apela funcția următoare folosind un acord __cdecl:

    ParseString ( "E doar un șir de caractere!", 0x12);

    Și acum textul de asamblare:

    Atât de mult pentru acordurile - WinAPI - determinată de unul dintre aceste tipuri (nu toate, desigur, - dintr-o pereche de trei), în funcție, după cum am spus, de pe platforma, sau compilatorul utilizat. Parametrii în WinMain ():

    * HInstance - acest identificator exemplu aplicație. Nu-ți fie frică de tip HINSTANCE. Aceasta este, probabil, unele unsigned int. Fiecare cerere este atribuit un număr unic, care apelează ciot citește GetModuleHandle (), și apoi trimite-l la tine. Dacă se va citi în anexa la această funcție ID-ul aplicației - veți vedea că acesta coincide cu faptul că ați transferat la WinMain (). Acest identificator este util pentru noi pentru atât de multe scopuri.

    * HPrevInstance - acesta este identificatorul instanței anterioare cererii. Sub Win32, este întotdeauna NULL. Aici este pentru tine de a decide - să lucreze sau nu - în exemplul meu, eu de fapt refuza să lucreze în cazul în care al doilea parametru este non-NULL. Apropo - dezasamblează Quake1, quake2 și Quake3 - vedeți același lucru.

    * LpCmdLine - un pointer la linia de comandă - fără diviziune în parametri - o singură linie monolitică.

    * NCmdShow - Acest parametru descrie steagurile pentru fereastra - modul în care este afișat pe ecran pentru a crea. De obicei, această opțiune este trecut la ShowWindow () apel. În cererea sa, eu nu-l folosesc, ci pur și simplu transferat la ShowWindow () caseta SW_SHOW.

    Tu nu va crede, rămâne cel mai simplu - înregistrare clasa de aplicare și de a crea fereastra și începe bucla mesajului. Știți deja că Windows „bazată pe evenimente“ sistem de operare (în original sună mai succint - Event-driven). Acest lucru înseamnă că fiecare aplicație (sau mai degrabă fereastra sa) a trimis niște coduri de mesaje pentru care o aplicație poate răspunde. Ei bine, de exemplu, aplicația trimite mesajul WM_CREATE atunci când se creează o fereastră, dar înainte de a fi afișat pe ecran. WM_KEYDOWN sau când este apăsată tasta (e) și fereastra are focalizarea. Cu toate acestea, acest lucru nu înseamnă că toate posturile pe care le ai să se ocupe - deloc. Acum să ne întoarcem la înregistrarea de clasă de aplicare:

    Această bucată de cod este responsabil pentru înregistrarea clasa fereastra - da, exact - mai degrabă, este chiar o clasă de fereastră.

    În acest articol am să comentați acest cod pentru a nu să-și petreacă o mulțime de timp descrie acțiunea și atât de ușor de înțeles. rezervări cuplu - Resource Identifier - o constantă care descrie numărul resursei - în cererea mea nu au resursele lor - în cazul în care acestea au fost - le-ar putea folosi - specificând când descărcarea de un identificator de exemplu aplicație, al doilea - un identificator de resurse. Continuăm?

    Notă - acesta este apelarea CreateWindow (Ex) în Windows pentru a crea toate controalele standard - de la butoane, finisare ListBox'ami. Pentru ei, există nume predefinite de clasă, unele posturi suplimentare pentru tratamente fereastra lor, stiluri, etc. Ce? Rămâne pentru noi pentru a începe bucla mesaj:

    Apelați getMessage () returnează 0 (adică, „false“) numai atunci când primiți un mesaj de WM_QUIT - solicitarea de a închide. Primul parametru - un pointer la o structură care va fi umplut cu date despre un mesaj - o parte din numărul și alte informații utile.

    Al doilea parametru este ID-ul ferestrei (HWND) - care trece NULE cer să proceseze mesaje pentru toate aplicațiile Windows - deoarece acestea ar putea fi mult. Ultimele două cifre - un filtru de mesaje în curs de procesare - valorile minime și maxime ale mesajului. Eu nu folosesc un filtru - și, prin urmare, să treacă zerouri. GetMessage () - blochează funcția - ceea ce înseamnă că până când mesajul care satisface filtrul sau WM_QUIT nu a primit - execuție este continuată. Pentru jocuri și alte aplicații este inacceptabil - în acest caz, este mai bine să se utilizeze o structură mesaj buclă diferite - de exemplu, unul care l-am folosit în exemplele de Direct3D. După acceptarea mesajului, acesta trebuie să fie tradus (TranslateMessage) și dedicat procedurii ferestrei (DispatchMessage). În cazul în care este, eroul de ocazie?

    Țineți cont de faptul că acest program exemplu, am scris, procedând în mod exclusiv de la MS Visual C, care nu este utilizat de alte compilatoare. Cu toate acestea, cred că problemele nu ar trebui să apară. Poate că acest lucru este suficient pentru a începe cu - acum este doar pentru tine. Succes "Hunt"!

    articole similare