U trendu

Delphi – „Usidreni“ prozor

Verovatno ste već do sada imali prilike da vidite aplikacije čiji se prozori prosto „lepe“ za ivicu ekrana. Tipičan predstavnik ovakvog „ponašanja“ programa je poznati „WinAmp“. U ovom članku videćemo kako možemo da postignemo isti efekat. Naravno, u samom Windows API-ju nemamo ugrađenu mogućnost za izvođenje ovog efekta. Zato ćemo radi postizanja cilja iskoristiti Windows poruke (messages). Delphi čini iskorišćavanje ovih poruka vrlo lakim, preko obrade događaja. Obično se neki događaj generiše kao odgovor na Windows poruku, odaslatu aplikaciji. Iako veći deo ovih poruka obrađuje sam Delphi, neke od poruka ostaju nama, da ih mi obradimo. Na primer, znamo da ako je promenjena veličina forme sa Resize događajem – Delphi se upravlja porukom WM_SIZE, ali kako mi možemo da saznamo da li se forma recimo premestila? Delphi prihvata sve odaslate poruke, ali inicijalno ne čini ništa na njihovoj obradi.

Ukoliko korisnik premešta formu, Delphi-jevoj formi se šalje poruka WM_MOVING. Procesiranjem ove poruke, aplikacija može „očitavati“ veličinu i poziciju forme, i ako je potrebno može je premestiti, ili joj promeniti veličinu. Poruka WM_WINDOWPOSCHANGING se šalje prozoru (formi), kome su promenjeni veličina, pozicija ili redosled (npr. izazvani funkcijom SetWindowPos). U većini slučajeva sama poruka nije dovoljna, potrebni su nam i dodatni parametri. Na primer, WM_MOVE poruka nam govori da je formi promenjena pozicija, ali ovde nam parametar LPARAM daje X i Y koordinate. Sa porukom WM_WINDOWPOSCHANGING dobijamo samo jedan parametar – onaj koji ukazuje na WindowPos strukturu, koja sadrži informaciju o novoj veličini i poziciji forme. Evo kako izgleda WindowPos struktura:


TWindowPos = packed record
hwnd: HWND; {Identifikuje prozor.}
hwndInsertAfter: HWND; {Prozor iznad trenutnog}
x: Integer; {Levi ugao prozora}
y: Integer; {Desni ugao prozora}
cx: Integer; {Sirina prozora}
cy: Integer; {Visina prozora}
flags: UINT; {Opcije za pozicioniranje}
end;

U sledećem primeru, videćemo kako možemo da postignemo da se prozor naše aplikacije jednostavno „prilepi“ za ivicu ekrana, kada recimo prozor privučemo na nekih 20 piksela do ivice ekrana. Pokrenite novi projekt i na praznu formu dodajte jednu Label kontrolu, jednu Edit kontrolu i 4 polja za potvrdu (kao na slici). Promenite nazive poljima za potvrdu u chkLevo, chkDesnoEdit kontrolu ćemo koristiti za podešavanje udaljenosti od ivice ekrana, na kojoj će se najbliža ivica prozora primaći ivici ekrana. Jedina poruka koja nam treba je WM_WINDOWPOSCHANGING, ali treba nam i parametar SPI_GETWORKAREA koji će nam dati veličinu radnog prostora (desktopa). Sledi potreban Delphi kod:



private
procedure WMWINDOWPOSCHANGING
(Var Msg: TWMWINDOWPOSCHANGING);
message WM_WINDOWPOSCHANGING;

procedure TfrMain.WMWINDOWPOSCHANGING
(var Msg: TWMWINDOWPOSCHANGING);
const
Prilepljen: Boolean = FALSE;
var
rWorkArea: TRect;
Usidren : Word;
begin
Prilepi := StrToInt(Edit1.Text);

SystemParametersInfo
(SPI_GETWORKAREA, 0, @rWorkArea, 0);

with Msg.WindowPos^ do begin
if chkLevo.Checked then
if x <= rWorkArea.Left + Prilepi then begin
x := rWorkArea.Left;
Usidren := TRUE;
end;

if chkDesno.Checked then
if x + cx >= rWorkArea.Right – Prilepi then begin
x := rWorkArea.Right – cx;
Usidren := TRUE;
end;

if chkGore.Checked then
if y <= rWorkArea.Top + Prilepi then begin
y := rWorkArea.Top;
Usidren := TRUE;
end;

if chkDole.Checked then
if y + cy >= rWorkArea.Bottom – Prilepi then begin
y := rWorkArea.Bottom – cy;
Usidren := TRUE;
end;

if Usidren then begin
with rWorkArea do
begin
if x < Left then x := Left;
if x + cx > Right then x := Right – cx;
if y < Top then y := Top;
if y + cy > Bottom then y := Bottom – cy;
end;
end;
end;

inherited;
end;
end.

Pratite Krstaricu i preko mobilne aplikacije za Android i iPhone.