Najčešći način pomicanja prozora je povlačenje po naslovnoj traci. Čitajte dalje kako biste saznali kako možete pružiti mogućnosti povlačenja za Delphobrasci su bez naslovne trake, tako da korisnik može premjestiti obrazac klikom bilo gdje na području klijenta.
Na primjer, razmotrite slučaj a Windows aplikacija koja nema naslovnu traku, kako možemo pomaknuti takav prozor? Zapravo je moguće stvoriti prozore sa nestandardnim naslovnim trakama, pa čak i ne pravokutnim oblicima. Kako bi u tom slučaju Windows mogao znati gdje su granice i uglovi prozora?
WM_NCHitTest Windows poruka
Windows operativni sustav jako se temelji rukovanje porukama. Na primjer, kada kliknete na prozor ili neku kontrolu, Windows mu pošalje poruku wm_LButtonDown, s dodatnim informacijama o tome gdje se nalazi pokazivač miša i koji se trenutno nalaze upravljačke tipke pritisnut. Zvuči poznato? Da, ovo je ništa drugo do događaj OnMouseDown u Delfima.
Slično tome, Windows šalje wm_NCHitTest poruku kad god događaj miša događa se, tj. kada se kursor pomiče ili kada se pritisne ili otpusti tipka miša.
Kod za unos
Ako možemo natjerati Windows da misli da korisnik vuče (kliknuo je) naslovnu traku, a ne područje klijenta, tada bi korisnik mogao povući prozor klikom na područje klijenta. Najlakši način za to je "prevariti" Windows da misli da zapravo kliknete naslovnu traku obrasca. Evo što morate učiniti:
1. Umetnite sljedeći redak u odjeljak "Privatne izjave" obrasca (izjava o postupanju s porukama):
postupak WMNCHitTest (var Msg: TWMNCHitTest); poruka WM_NCHitTest;
2. Dodajte sljedeći kôd u odjeljak "implementacija" jedinice obrasca (gdje je Form1 pretpostavljeni naziv obrasca):
postupak TForm1.WMNCHitTest (var Msg: TWMNCHitTest);
početi
naslijedio;
ako Por. Rezultat = htClient zatim Por. Rezultat: = htCaption;
kraj;
Prvi redak koda u alatu za poruke poziva naslijeđenu metodu radi dobivanja zadanog rukovanja za wm_NCHitTest poruku. Ako dio u postupku presreće i promijeni ponašanje vašeg prozora. Ovo se zapravo događa: kada operativni sustav pošalje wm_NCHitTest poruku prozoru, zajedno s koordinatama miša, prozor vraća kôd koji navodi koji dio samog sebe ima bio pogođen. Važan podatak, za naš zadatak, je vrijednost Msg. Polje rezultata. U ovom trenutku imamo priliku za izmjenu rezultata poruke.
To je ono što radimo: ako je korisnik kliknuo na klijentskom području obrasca, tjeramo Windows da misli da je korisnik kliknuo naslovnu traku. U Objekt Pascal "riječi": ako je vrijednost za povrat poruke HTCLIENT, jednostavno je mijenjamo u HTCAPTION.
Nema više događaja s mišem
Promjenom zadanog ponašanja naših obrazaca uklanjamo mogućnost sustava Windows da vas obavještava kada miš prelazi područje klijenta. Jedna od nuspojava ovog trika je da vaš oblik više neće generirati događaji za miša poruke.
Prozor bez natpisa bez granica
Ako želite prozor bez obruba bez natpisa, sličan plutajućoj alatnoj traci, postavite naslov obrasca na prazan niz, onemogućite sve BorderIcons i postavite BorderStyle na bsNone.
Obrazac se može mijenjati na različite načine primjenom prilagođenog koda u metodi CreateParams.
Više WM_NCHitTest trikova
Ako pažljivije pogledate poruku wm_NCHitTest, vidjet ćete da povratna vrijednost funkcije označava položaj vruće točke pokazivača. To nam omogućuje da se još malo poigramo s porukom kako bismo stvorili čudne rezultate.
Sljedeći fragment koda onemogućit će korisnicima da zatvore obrasce klikom na gumb Zatvori.
ako Por. Rezultat = htClose zatim Por. Rezultat: = htNowhere;
Ako korisnik pokušava premjestiti obrazac klikom na traku opisa i povlačenjem, kod zamjenjuje rezultat poruke rezultatom koji označava da je korisnik kliknuo područje klijenta. To sprečava korisnika da pomiče prozor mišem (suprotno onome što smo radili u prosjačenju članka).
ako Por. Rezultat = htCaption zatim Por. Rezultat: = htClient;
Imajući komponente na obrascu
U većini slučajeva imat ćemo neke komponente na obrascu. Recimo, na primjer, da se jedan objekt Panel nalazi na obrascu. Ako je svojstvo Poravnanje panela postavljeno na alClient, Panel ispunjava cijelo područje klijenta tako da nije moguće odabrati roditeljski obrazac klikom na njega. Gornji kod neće raditi - zašto? To je zato što miš uvijek prelazi preko komponente Panel, a ne preko forme.
Da bismo premjestili naš obrazac povlačenjem ploče na obrazac, moramo dodati nekoliko redaka koda u postupak događaja OnMouseDown za komponentu panela:
postupak TForm1.Panel1MouseDown
(Pošiljatelj: TObject; Gumb: TMouseButton;
Shift: TShiftState; X, Y: Integer);
početi
ReleaseCapture;
SendMessage (Form1.Handle, WM_SYSCOMMAND, 61458, 0);
kraj;
Bilješka: Ovaj kôd neće raditi s kontrolama bez prozora kao što su TLabel komponente.