Napsauta ja vedä Delphi-lomake ilman otsikkopalkkia

click fraud protection

Yleisin tapa siirtää ikkunaa on vetää sitä otsikkopalkista. Lue lisätietoja siitä, kuinka voit tarjota vetämisominaisuuksia delphi muodostaa ilman otsikkopalkkia, joten käyttäjä voi siirtää lomaketta napsauttamalla mitä tahansa asiakasalueen kohtaa.

Tarkastellaan esimerkiksi a: n tapausta Windows-sovellus jolla ei ole otsikkopalkkia, miten voimme siirtää tällaista ikkunaa? Itse asiassa on mahdollista luoda ikkunoita epästandardilla otsikkopalkilla ja jopa ei-suorakulmaisilla muodoilla. Kuinka Windows voisi tässä tapauksessa tietää missä ikkunan reunat ja kulmat ovat?

WM_NCHitTest Windows -viesti

Windows-käyttöjärjestelmä perustuu vahvasti viestien käsittely. Esimerkiksi kun napsautat ikkunaa tai ohjainta, Windows lähettää sille wm_LButtonDown-viestin, sisältää lisätietoja siitä, missä hiiren kohdistin on ja mitkä ohjausnäppäimet ovat tällä hetkellä painettuna. Kuulostaa tutulta? Kyllä, tämä ei ole muuta kuin OnMouseDown-tapahtuma Delphissä.

Samoin Windows lähettää wm_NCHitTest-viestin aina kun

instagram viewer
hiiretapahtuma tapahtuu, ts. kun kohdistin liikkuu tai kun hiiren painiketta painetaan tai vapautetaan.

Syöttökoodi

Jos voimme saada Windowsin ajattelemaan, että käyttäjä vetää (on napsauttanut) otsikkopalkkia asiakasalueen sijasta, niin käyttäjä voi vetää ikkunan napsauttamalla asiakasaluetta. Helpoin tapa tehdä tämä on "huijata" Windows ajattelemaan, että napsautat tosiasiallisesti lomakkeen otsikkopalkkia. Tässä on mitä sinun täytyy tehdä:

1. Lisää seuraava rivi lomakkeen "Yksityiset ilmoitukset" -osaan (sanomankäsittelymenettelyn ilmoitus):

menettely WMNCHitTest (var Msg: TWMNCHitTest); viesti WM_NCHitTest; 

2. Lisää seuraava koodi lomakkeen yksikön "toteutus" -osaan (missä Lomake1 on oletettu lomakkeen nimi):

menettely TForm1.WMNCHitTest (var Msg: TWMNCHitTest);

alkaa

peritty;

jos Msg. Tulos = htClient sitten Msg. Tulos: = htCaption;

pää; 

Viestinkäsittelijän ensimmäinen koodirivi kutsuu perinnöllistä menetelmää wm_NCHitTest-viestin oletuskäsittelyn saamiseksi. Menettelyn If-osa sieppaa ja muuttaa ikkunasi käyttäytymistä. Näin tapahtuu: kun käyttöjärjestelmä lähettää wm_NCHitTest-viestin ikkunaan, yhdessä hiiren koordinaattien kanssa ikkuna palauttaa koodin, joka kertoo minkä osan itsessään on on osunut. Tärkeät tiedot tehtävästämme ovat viestin arvo. Tuloskenttä. Tässä vaiheessa meillä on mahdollisuus muokata viestin tulosta.

Näin teemme: jos käyttäjä on napsauttanut lomakkeen asiakasaluetta, saamme Windowsin ajattelemaan käyttäjän napsauttaneen otsikkopalkkia. Sisään Kohde Pascal "sanat": jos viestin palautusarvo on HTCLIENT, me vain vaihdamme sen HTCAPTION-arvoon.

Ei enää hiiri-tapahtumia

Muuttamalla lomakkeidemme oletuskäyttäytymistä poistamme Windowsin mahdollisuuden ilmoittaa sinulle, kun hiiri on asiakasalueen yläpuolella. Tämän tempun yhtenä sivuvaikutuksena on, että lomakkeesi ei enää tuota tapahtumia hiirelle viestejä.

Tekstityksetön reunaton ikkuna

Jos haluat leimaamattoman reunattoman ikkunan, joka muistuttaa kelluvaa työkaluriviä, aseta lomakkeen kuvateksti tyhjään merkkijonoon, poista kaikki BorderIconit käytöstä ja aseta BorderStyle-asetukseksi bsNone.

Lomaketta voidaan muuttaa monin tavoin käyttämällä mukautettua koodia CreateParams-menetelmässä.

Lisää WM_NCHitTest-temppuja

Jos tarkastelet tarkemmin wm_NCHitTest-viestiä, huomaat, että funktion paluuarvo osoittaa kohdistimen kuuman pisteen sijainnin. Tämän avulla voimme pelata viestiä vielä jonkin verran omituisten tulosten luomiseksi.

Seuraava koodifragmentti estää käyttäjiä sulkemasta lomakkeitasi napsauttamalla Sulje-painiketta.

jos Msg. Tulos = htSulje sitten Msg. Tulos: = htNowhere; 

Jos käyttäjä yrittää siirtää lomaketta napsauttamalla otsikkopalkkia ja vetämällä, koodi korvaa viestin tuloksen tuloksella, joka osoittaa käyttäjän napsauttaneen asiakasaluetta. Tämä estää käyttäjää liikuttamasta ikkunaa hiirellä (vastapäätä sitä, mitä teimme artikkelin alussa).

jos Msg. Tulos = htCaption sitten Msg. Tulos: = htClient; 

Komponenttien ottaminen lomakkeeseen

Useimmissa tapauksissa meillä on lomakkeessa joitain komponentteja. Oletetaan esimerkiksi, että yksi paneeliobjekti on lomakkeella. Jos paneelin Align-ominaisuuden arvoksi on asetettu alClient, paneeli täyttää koko asiakasalueen siten, että vanhempaa lomaketta ei voida valita napsauttamalla sitä. Yllä oleva koodi ei toimi - miksi? Se johtuu siitä, että hiiri liikkuu aina Paneelikomponentin, ei muodon.

Jos haluat siirtää lomaketta vetämällä paneelia lomakkeelle, meidän on lisättävä muutama koodirivi OnMouseDown-tapahtumamenettelyyn paneelikomponentille:

menettely TForm1.Panel1MouseDown

(Lähettäjä: TObject; Painike: TMouseButton;
Vaihto: TShiftState; X, Y: kokonaisluku);
alkaa

 ReleaseCapture;

 Lähetä viesti (lomake1.Käsittely, WM_SYSCOMMAND, 61458, 0);

pää; 

Huomautus: Tämä koodi ei toimi muiden kuin ikkunoiden ohjaimien, kuten TLabel-komponentit.

instagram story viewer