[ Pobierz całość w formacie PDF ]
.Create;with WindowInfo dobeginSetLength(WindowName, strlen(WinName));SetLength(WindowClass, StrLen(CName));WindowName := StrPas(WinName);WindowClass := StrPas(CName);end;MainForm.lbWinInfo.Items.AddObject('', WindowInfo);end;procedure TMainForm.btnGetWinInfoClick(Sender: TObject);begin{ Wykonaj enumerację po wszystkich oknach głównych, wykorzystującfunkcję EnumWindowsProc() w charakterze funkcji zwrotnej}EnumWindows(@EnumWindowsProc, 0);end;procedure TMainForm.FormDestroy(Sender: TObject);vari: integer;begin{ zwolnij wszystkie obiekty TWindowInfo }for i := 0 to lbWinInfo.Items.Count - 1 doTWindowInfo(lbWinInfo.Items.Objects[i]).Freeend;procedure TMainForm.lbWinInfoDrawItem(Control: TWinControl; Index: Integer;Rect: TRect; State: TOwnerDrawState);begin{ wyczyść obszar płótna, na którym wypisywana będzie informacja }lbWinInfo.Canvas.FillRect(Rect);{ wypisz informację zawartą w rekordzie TWindowInfo zawartym w liścieListBox1 na pozycji "index".Szerokość poszczególnych kolumn określająseparatory w nagłówku HeaderControl1}with TWindowInfo(lbWinInfo.Items.Objects[Index]) dobeginDrawText(lbWinInfo.Canvas.Handle, PChar(WindowName),Length(WindowName), Rect,dt_Left or dt_VCenter);{ dostosuj położenie i szerokość wyświetlanej informacji do rubrykiokreślonej przez nagłówek}Rect.Left := Rect.Left + hdWinInfo.Sections[0].Width;DrawText(lbWinInfo.Canvas.Handle, PChar(WindowClass),Length(WindowClass), Rect, dt_Left or dt_VCenter);end;end;procedure TMainForm.hdWinInfoSectionResize(HeaderControl:THeaderControl; Section: THeaderSection);beginlbWinInfo.Invalidate; // wyświetl ponownie zawartość listyend;end.Funkcja zwrotna, wywoływana w kontekście konkretnego okna, pobiera jego tytuł oraz nazwę jego klasy i zapisuje te informacje w obiekcie TWindowInfo, dodawanym następnie do listy wyświetlanej na formularzu.Ponieważ postać wyświetlanej informacji musi być dostosowana do układu kolumnowego narzuconego przez komponent THeaderControl, jest ona wypisywana w sposób specyficzny dla listy (owner drawing) w ramach zdarzenia OnDrawItem.Zajmiemy się najpierw działaniem samej funkcji zwrotnej, następnie wyjaśnimy szczegóły wspomnianego rysowania specyficznego.Działanie funkcji zwrotnejFunkcja zwrotna nosi nazwę EnumWindowsProc() i posiada dwa parametry.Pierwszy parametr jest uchwytem okna, którego dotyczy wywołanie, drugi natomiast ma wartość 0 i nie jest do niczego wykorzystywany; wartość ta przekazywana jest jako drugi parametr wywołania funkcji EnumWindows().Jak każda funkcja zwrotna, funkcja EnumWindows() stosuje standardową dla Win32 konwencję wywołania stdcall.Na podstawie otrzymanego uchwytu okna funkcja pobiera jego tytuł oraz nazwę klasy i zapisuje te informacje w nowo tworzonym obiekcie klasy TWindowInfo.Wskaźnik tego obiektu jest następnie dodawany do tablicy Objects listy lbWinInfo, służącej do wyświetlania informacji na formularzu głównym.Zwróć uwagę na ważny fakt, iż destruktor listy TListBox nie zwalnia obiektów wskazywanych przez jego tablicę Objects i użytkownik musi dokonać tego zwolnienia w sposób jawny; w naszym przypadku zwolnienie to odbywa się w ramach zdarzenia OnDestroy formularza
[ Pobierz całość w formacie PDF ]