Lucrul cu ferestre în delphi folosind api

Lucrul cu ferestre în DELPHI folosind API.

De ce este necesar acest lucru toate? exemplele prezentate în acest articol, da o idee despre modul în care aplicația bazată pe Windows, precum și pe cele mai importante concepte ale sistemului de operare. Acesta este atât un ghid de acțiune, precum și o trecere în revistă a caracteristicilor de bază ale API funcții. Exemplele prezentate aici demonstrează în mod clar secțiunile individuale ale lucrării, și poate servi drept bază, așa-numita bază pentru continuarea în continuare a studiului ideologiei Windows.

Acum încerc să explic ce va face acest program, dar numai atunci când ea face. În plus față de exemplul subdirectorul Ex01 avem nevoie de un alt proiect, cu doar o singură formă, numită „Form1“, peste acest proiect nu ar trebui să conțină nimic. Când ne-am lansat primul nostru program, veți vedea o formă de buton „Form2“ „Button1“,

Lucrul cu ferestre în delphi folosind api

clic pe asta, obținem:

Dacă vom descărca proiectul pentru a forma Form1, și apoi faceți clic pe Button1 forma Form2, vom primi răspunsul:

Acest lucru înseamnă că, atunci când apăsați butonul „BUTTON1“, un mesaj este afișat dacă fereastra este deschisă clasa, înregistrată în sistemul de operare ca „TForm1“, având antetul „Form1“. Pentru a găsi fereastra necesară folosim FindWindow. având doi parametri, prima - ferestrele, clasa a doua - numele lui, dar, în cazul în care titlul ferestrei dorit indiferentă, al doilea document, trebuie să setați zero. sau, dacă vă pasă de clasă, atunci ar trebui să fie setat zero. de exemplu: FindWindow (nil, winamp); În acest caz, funcția va căuta o fereastră cu numele de winamp, nu face nici o diferenta ce clasa este, și nu le pasă originea ferestrei, indiferent dacă acesta este un proiect DELPHI, sau Internet Explorer, sau Notepad. Funcția FindWindow returnează valoarea ca răspuns la tipul de HWND - o referire la fereastra găsit, sau null daca fereastra nu este găsit.

In exemplul nostru, definim o H variabilă, ca un HWND. pentru a echivala valoarea sa pentru funcția FindWindow. Trebuie remarcat faptul că numele formularului în cadrul proiectului DELPHI este important nu numai în timpul de proiectare, ci și în timpul aplicării. Dacă începeți un nou proiect, numit forma un nume foarte lung și compila proiectul și apoi comparați dimensiunea modulului compilate la dimensiunea primului proiect, vom vedea că a crescut - a crescut doar în detrimentul unui nume de clasă lungă. De asemenea, trebuie remarcat faptul că este de dorit să se forma apela diferite de valorile date în mod implicit DELPHI.

Fereastra poate. fără să se concentreze, să primească mesaje și să le răspundă. Un exemplu este o Ex02 subdirector
Procedura TForm2.FormMouseMove (Expeditor: TObject; Shift: TShiftState; X, Y: Integer);
începe
Legendă: = 'x =' + IntToStr (X) + 'y =' + IntToStr (Y)
se încheie;

Când se deplasează cursorul mouse-ului formează titlul de ieșire sale coordonatele.

Lucrul cu ferestre în delphi folosind api

Rularea două instanțe ale programului, observăm că cutia nu are focalizare, și anume inactiv, de asemenea, reacționează la mișcarea pointer pe suprafața sa, și ieșirile la antetul coordonatele curente ale cursorului în sistemul de coordonate dumneavoastră. Cu referire la fereastra, aplicația poate efectua cu totul (aproape) acțiunea prin trimiterea de mesaje către acesta. Procedura EX03 subdirector de presare modifică după cum urmează:
Procedura TForm2.Button1Click (Expeditor: TObject);
var
H. HWND;
începe
H: = FindWindow ( 'TForm1', 'Form1');
Dacă H <> 0 apoi SendMessage (H, WM_CLOSE, 0, 0)
se încheie;

În cazul în care există mai multe ferestre ale clasei „TForm1“. și necesitatea de a închide toate acestea în mod automat, acest lucru se face în ex04 urmează:
Procedura TForm2.Button1Click (Expeditor: TObject);
var
H. HWND;
începe
repeta
H: = FindWindow ( 'TForm1', 'Form1');
Dacă H <> 0 apoi SendMessage (H, WM_CLOSE, 0, 0)
Până la H = 0;
se încheie;

Cum de a lucra cu aplicații care clasa ferestrei nu este cunoscută, din moment ce nu au codul sursă? Pentru a rezolva aceste probleme este de utilitate Ws32. livrat cu DELPHI. Ar trebui, de asemenea, adăuga că, de exemplu, pentru a minimiza fereastra. Mesajul fereastra este trimis WM_SYSCOMMAND. corespunzătoare acțiunii „meniul de sistem fereastră de selecție.“ Al treilea parametru Funcția SendMessage este setată la SC_MINIMIZE. Un exemplu în acest sens este în Ex06.

De ce aplicatii DELPHI sunt mari? prelozhenie minimă creată în diferite versiuni ale DELPHI. Se poate ajunge de la 170 la 290 Kbytes. Dimensiunea mare a cererii compilate este un preț de a plăti pentru un design confort incredibil. cu condiția DELPHI. mediu de programare arhitectură complet nouă, RTTI, abordarea componente - toate acestea fac ca DELPHI într-un instrument extrem de puternic, dar nu au nevoie de aceste caracteristici puternice pentru aplicatii de gama medie. Modulul compilat conține toate elementele de interfață de cod de intrare-ieșire. Scapă de RTTI este imposibil de a rezolva radical problema numai prin faptul că nu utilizează DELPHI bibliotecă de clasă. și anume Programarea fără VCL.

Lista prezintă utilizează numai două module - Windows și mesaje - numai funcții API. astfel încât codul este atât de mult timp care seamănă cu limbajul C.

Concluzie cu GDI

Ex09 Subdirectorul poate fi examinat cu vechea forma Form2. dar cu un nou buton „dreptunghi“. cu procedura de cod de presare:
Procedura TForm2.Button2Click (Expeditor: TObject);
var
dc. HDC;
începe
dc: = GetDC (mâner);
Dreptunghi (dc, 10, 10, 110, 110);
ReleaseDC (mâner, dc);
DeleteDC (dc);
se încheie;

Executați aplicația și făcând clic pe butonul „dreptunghi“. obținem:

Lucrul cu ferestre în delphi folosind api

Fereastra cu valoarea de referință zero corespunde ferestrei desktop. Exemplul Ex11 arată cum să atragă un pătrat pe desktop, nu este nevoie să spun ce perspective ea înainte de noi este:
Procedura TForm2.Button2Click (Expeditor: TObject);
var
dc. HDC;
începe
dc: = GetDC (0);
Dreptunghi (dc, 10, 10, 110, 110);
ReleaseDC (mâner, dc);
DeleteDC (DC);
se încheie;
end.

Lucrul cu ferestre în delphi folosind api

În funcția de fereastra proiectului Ex12 program minim completat mesaje de procesare WM_PAINT. Concluzia este făcută între liniile cu un BeginPaint funcție de apel și EndPaint. primul dintre care returnează o referință la un context de dispozitiv, și anume valoare de tip HDC. necesară pentru funcțiile de ieșire GDI. După utilizarea link-urile trebuie să fie eliminate la sfârșitul lucrului - este necesar pentru funcționarea corectă a aplicației.

Lucrul cu ferestre în delphi folosind api

Proiectul Ex13 vom fi programate din nou fără VCL, provocarea este că, atunci când faceți dublu clic pe butonul stânga al mouse-ului afișează indicatorul poziția curentă. cs_DblClks constantă. astfel încât fereastra ar putea reacționa la un dublu-clic, și funcția fereastră reumplut procesare wm_LButtonDblClk comunicare în care coordonatele cursorului apar.

Proiectul EX14 creat handler acelorași mesaje în proiectul DELPHI tip convențional. Mesajul indică faptul că procedura este de a intercepta un mesaj, care indică un mnemonic pentru cuvântul. Deci, mesajul aici este interceptat „dublu-clic“.

EX15 creat handler OnDblClick evenimente

EX16 creat handler posturi WM_PAINT - vopsi fereastra. Liniile BeginPaint și EndPaint sunt prezente pentru funcționarea corectă a aplicației, atunci când sunt dezlipite, există un flicker neplăcut atunci când fereastra este redimensionată.

Lucrul cu timer-ul

În această secțiune, vom discuta despre modul de utilizare a timer-ul, doar pe baza funcțiilor API. Un exemplu în acest sens este proiectul EX17, care în timp se schimbă cercurile de culoare pictate. Primul lucru pe care observăm că constantele bloc descriu descrierea adăugată a identificatorul timer care poate lua orice număr întreg:
const
AppName = 'WinPaint';
id_Timer = 100; // identificator al cronometrului

Identificați timer-ul este necesară, deoarece aplicația pot exista mai multe. Pentru a activa funcția taymeraispolzuem API SetTimer. în care temporizatorul intervalul dorit este setat:
SetTimer (Window, id_Timer, 200, zero); // set timer

Dacă programul utilizează mai multe cronometre, trebuie să le separe de identificatori de valoare transmise în wParam. În acest exemplu, fiecare fereastră de 200 ms este redesenat prin apelarea funcției API InvalidRect. Culoare Mug vom schimba:
Perie: = CreateSolidBrush (RGB (aleator (255), aleatoriu (255), aleator (255)));

Ca de obicei în Windows, a crea obiecte trebuie să fie eliminate după utilizare, astfel încât să nu absoarbă resurse. Pentru a șterge o funcție de temporizator apel KillTimer posturi handler WM_DESTROY.
KillTimer (ferestre, id_Timer);

În această trecere în revistă a funcțiilor API lucra cu ferestre în DELPHI finalizate.