Reapelări
Funcția EnumWindowsProc (Hw: hWnd; lp: lParam): Boolean; stdcall; EnumWindows () de exemplu, utilizarea funcției este dată în proiectul Back.dpr Call, al cărui cod este prezentat în Exemplul 6.9.
Listarea 6.9. MainForm.pas - Exemplul callback
Ferestre, Mesaje, SysUtils, Clase, grafică, controale,
Formulare, Dialoguri, StdCtrls, ComCtrls;
WindowName, // nume fereastră
WindowClass: String; // numele clasei a ferestrei
= Class template (TForm) lbWinInfo: TListBox; btnGetWinInfo: TButton; hdWinInfo: THeaderControl;
Procedura btnGetWinInfoClick (Expeditor: TObject);
Procedura FormDestroy (Expeditor: TObject);
Procedura lbWinInfoDrawItem (Control: TWinControl;
Index: Integer; RECT: TRect; Stat: TOwnerDrawState);
THeaderControl; Secțiunea: THeaderSection);
Funcția EnumWindowsProc (Hw: hWnd;
AMainForm: template): Boolean; stdcall;
înregistrează ferestrele active în sistem.>
WinName, CName: array [0..144] de char;
ferestre neterminate registru.>
Rezultat: = Adevărat; GetWindowText (Hw, WinName, 144); // Ia textul ferestrei curente
GetClassName (Hw, CName, 144); // Ia numele clasei ferestrei
umplut cu valori de ferestre și numele ferestrelor de nume de clasă. atunci
acest obiect este adăugat la matrice de obiecte lista ListBox1.
Ulterior, aceste valori sunt afișate în caseta listă.>
cu WindowInfo do începe
Procedura TMainForm.btnGetWinInfoClick (Expeditor: TObject);
Acesta a solicitat pentru fiecare fereastră.>
Procedura TMainForm.FormDestroy (Expeditor: TObject);
pentru i: = 0 până la lbWinInfo.Items.Count - 1 do
Procedura TMainForm.lbWinInfoDrawItem (Control: TWinControl;
Index: Integer; RECT: TRect; Stat: TOwnerDrawState);
Indicele sub numărul. Poziția de ieșire a fiecărei linii sunt determinate
cu TWindowInfo (lbWinInfo.Items.Objects [Index]) nu începe
Lungime (WindowName), Rect, dt_Left sau dt_VCenter);
HeaderControl1 pentru a determina poziția de ieșire a următoarei
Rect.Left: = Rect.Left + hdWinInfo.Sections [0] .Width;
Lungime (WindowClass), Rect, dt_Left sau dt_VCenter);
Procedura TMainForm.hdWinInfoSectionResize (HeaderControl: THeaderControl; Secțiunea: THeaderSection);
lbWinInfo.Invalidate; // Redesenați la ListBox1.
În această funcție EnumWindows aplicație () este utilizată pentru a obține numele tuturor ferestrelor de nivel superior, precum și numele claselor lor, și apoi plasat într-o listă de egalitate non-standard de obiecte în formă principală. Forma principală folosește această listă remiză non-standard pentru a afișa numele ferestrei și numele clasei ferestrei coloane separate. Dar, înainte de a înțelege modul de a crea liste personalizate cu coloane, ia în considerare metodele de utilizare a funcției de apel invers.
Utilizarea de apel invers
Listarea 6.9 arată procedura de definire a EnumWindowsProc (), în care primul parametru este mânerul ferestrei. Al doilea parametru date AUC legătură, care permite transmiterea orice valoare, dimensiunea care este echivalentă cu dimensiunea tipului de date întreg definit de utilizator.
Reamintim că, în tratare a evenimentului OnDestroy forma principală trebuie să fie eliberată de către toate instanțele TWindowInfo de clasă.
Executați aplicația, și făcând clic pe butonul în formă, puteți vedea podea
chennuyu din fiecare fereastră de informații furnizate sub forma unei liste.
Afișarea unei liste personalizate
Nume de ferestre și nume de clase de toate ferestrele de nivel superior sunt afișate într-o coloană separată în obiectul numit lbWinInfo. Acesta este - un exemplu de TListBox, în cazul în care proprietatea Style este setată la lbOwnerDraw. Dacă alegeți acest stil eveniment TListBox.OnDrawItem este generat de fiecare dată când o componentă în TListBox req Dimo afișa următorul element de date. Întreaga responsabilitate pentru datele cartografice este atribuit programator, ceea ce îi permite să aleagă metoda de depunere.