Dažniausias lango perkėlimo būdas yra vilkti jį pagal pavadinimo juostą. Skaitykite toliau ir sužinokite, kaip galite suteikti vilkimo galimybes DelfasAš formuoju be pavadinimo juostos, todėl vartotojas gali perkelti formą spustelėdamas bet kurią kliento srities vietą.
Pavyzdžiui, apsvarstykite atvejį a „Windows“ programa kurioje nėra pavadinimo juostos, kaip mes galime perkelti tokį langą? Tiesą sakant, galima sukurti langus su nestandartine pavadinimų juosta ir net ne stačiakampėmis formomis. Kaip tokiu atveju „Windows“ galėtų žinoti, kur yra sienos ir lango kampai?
„WM_NCHitTest“ „Windows“ žinutė
„Windows“ operacinė sistema labai remiasi pranešimų tvarkymas. Pvz., Kai spustelite langą ar valdiklį, „Windows“ siunčia jam „wm_LButtonDown“ pranešimą, su papildoma informacija apie tai, kur yra pelės žymeklis ir kokie valdymo klavišai yra šiuo metu prispaustas. Skamba pažįstamai? Taip, tai yra ne kas kita, kaip „OnMouseDown“ įvykis Delfuose.
Panašiai „Windows“ siunčia wm_NCHitTest pranešimą, kai
pelės įvykis įvyksta, tai yra, kai žymeklis juda arba kai paspaudžiamas arba atleidžiamas pelės mygtukas.Įvesties kodas
Jei galime priversti „Windows“ galvoti, kad vartotojas tempia (spustelėjo) pavadinimo juostą, o ne kliento sritį, tada vartotojas gali vilkti langą spustelėdamas kliento sritį. Paprasčiausias būdas tai padaryti yra „apgauti“ „Windows“ galvojant, kad iš tikrųjų spustelite formos pavadinimo juostą. Štai ką turite padaryti:
1. Įrašykite šią eilutę į savo formos skiltį „Asmeninės deklaracijos“ (pranešimo tvarkymo procedūros deklaracija):
procedūra „WMNCHitTest“ (var Msg: TWMNCHitTest); žinutė WM_NCHitTest;
2. Pridėkite šį kodą į savo formos vieneto skiltį „Įgyvendinimas“ (kur 1 forma yra tariamas formos pavadinimas):
procedūra TForm1.WMNCHitTest (var Msg: TWMNCHitTest);
prasideda
paveldėtas;
jei Msg. Rezultatas = htClient tada Msg. Rezultatas: = htCaption;
galas;
Pirma kodo eilutė pranešimų tvarkyklėje iškviečia paveldėtą metodą, kad būtų gautas numatytasis pranešimo wm_NCHitTest tvarkymas. Procedūros dalis „If“ perima ir keičia jūsų lango elgesį. Tai iš tikrųjų atsitinka: kai operacinė sistema siunčia wm_NCHitTest pranešimą į langą, kartu su pelės koordinatėmis langas pateikia kodą, kuriame nurodoma, kurią dalį ji turi buvo nukentėjęs. Mūsų užduočiai svarbi informacija yra pranešimo vertė. Rezultato laukas. Šiuo metu turime galimybę pakeisti pranešimo rezultatą.
Tai mes darome: jei vartotojas spustelėjo formos kliento srityje, mes verčiame „Windows“ galvoti, kad vartotojas spustelėjo pavadinimo juostą. Į Objektas Paskalis „žodžiai“: jei pranešimo grąžinimo vertė yra „HTCLIENT“, mes tiesiog pakeisime ją į „HTCAPTION“.
Daugiau jokių pelių įvykių
Pakeitę numatytąją mūsų formų elgseną, pašaliname „Windows“ galimybę pranešti jums, kai pelė yra virš kliento srities. Vienas šalutinis šio triuko poveikis yra tas, kad jūsų forma nebebus sugeneruota įvykiai pelėms žinutes.
Langas be paraščių be paraščių
Jei norite, kad langas be paraščių būtų panašus į plūduriuojančią įrankių juostą, nustatykite formos antraštę į tuščią eilutę, išjunkite visas „BorderIcons“ ir nustatykite „BorderStyle“ į „bsNone“.
Formą galima įvairiais būdais pakeisti pritaikant kodą „CreateParams“ metodu.
Daugiau WM_NCHitTest gudrybių
Jei atidžiau pažiūrėsite į „wm_NCHitTest“ pranešimą, pamatysite, kad funkcijos grįžtamoji vertė rodo žymiklio vietą. Tai leidžia mums dar šiek tiek atkurti žinią, kad galėtume sukurti keistus rezultatus.
Šis kodo fragmentas neleis vartotojams uždaryti jūsų formų spustelėjus mygtuką Uždaryti.
jei Msg. Rezultatas = htUždaryti tada Msg. Rezultatas: = htNowhere;
Jei vartotojas bando perkelti formą spustelėdamas antraštės juostą ir tempdamas, kodas pranešimo rezultatą pakeičia rezultatu, kuris nurodo, kad vartotojas spustelėjo kliento sritį. Tai neleidžia vartotojui judinti lango su pele (priešingai tam, ką mes darėme pradėdami straipsnį).
jei Msg. Rezultatas = htCaption tada Msg. Rezultatas: = htClient;
Komponentų turėjimas formoje
Daugeliu atvejų kai kuriuos formos elementus turėsime. Tarkime, pavyzdžiui, kad vienas skydelio objektas yra formoje. Jei skydelio „Align“ savybė „Align“ yra lygi „AlClient“, skydas užpildo visą kliento sritį, kad paspaudus ant jos neįmanoma pasirinkti pirminės formos. Aukščiau pateiktas kodas neveiks - kodėl? Taip yra todėl, kad pelė visada juda per skydelio komponentą, o ne formą.
Norėdami perkelti savo formą, vilkdami formos skydelį, „OnMouseDown“ įvykio procedūroje skydelio komponentui turime pridėti keletą kodo eilučių:
procedūra „TForm1.Panel1MouseDown“
(Siuntėjas: TObject; Mygtukas: „TMouseButton“;
„Shift“: „TShiftState“; X, Y: sveikasis skaičius);
prasideda
„ReleaseCapture“;
„SendMessage“ („Form1.Handle“, WM_SYSCOMMAND, 61458, 0);
galas;
Pastaba: Šis kodas neveiks naudojant ne langų valdiklius, pvz., TLabel komponentai.