Klõpsake ja lohistage Delphi vorm ilma tiitliribata

Kõige tavalisem viis akna teisaldamiseks on lohistada seda tiitliribal. Lugege edasi, et teada saada, kuidas saate lohistamisvõimalusi pakkuda Delphi vormid ilma tiitliribata, nii et kasutaja saab vormi teisaldada, klõpsates igal pool kliendi piirkonnas.

Vaatleme näiteks juhtumit a Windowsi rakendus millel pole tiitliriba, kuidas saaksime sellist akent teisaldada? Tegelikult on võimalik luua aknaid ebastandardse tiitliriba ja isegi mitte ristkülikukujuliste vormidega. Kuidas saaks Windows sel juhul teada, kus on akna piirid ja nurgad?

WM_NCHitTest Windowsi teade

Windowsi opsüsteem põhineb tugevalt sõnumite käsitlemine. Näiteks kui klõpsate aknal või juhtnupul, saadab Windows sellele wm_LButtonDown sõnumi, koos lisateabega hiirekursori asukoha ja juhtnuppude kohta pressitud. Kõlab tuttavalt? Jah, see pole midagi muud kui OnMouseDown sündmus Delphis.

Samamoodi saadab Windows wm_NCHitTest sõnumi alati, kui a hiire sündmus toimub siis, kui kursor liigub või hiirenuppu vajutatakse või vabastatakse.

instagram viewer

Sisendkood

Kui suudame panna Windows arvama, et kasutaja lohistab (on klõpsanud) tiitliriba, mitte kliendi ala, siis saab kasutaja akna lohistada, klõpsates kliendialal. Lihtsaim viis selleks on "Windowsi" lollitamine mõtlema, et klõpsate tegelikult vormi tiitliribal. Mida peate tegema:

1. Sisestage järgmine rida oma vormi jaotisesse „Eradeklaratsioonid” (teadete töötlemise protseduuri deklaratsioon):

protseduur WMNCHitTest (var Msg: TWMNCHitTest); sõnum WM_NCHitTest; 

2. Lisage järgmine kood oma vormi ühiku jaotisse "rakendamine" (kus vormi1 eeldatav nimi on vorm1):

protseduur TForm1.WMNCHitTest (var Msg: TWMNCHitTest);

alustada

päritud;

kui Msg. Tulemus = htClient siis Msg. Tulemus: = htCaption;

lõpp; 

Sõnumikäitleja esimene koodirida kutsub päritud meetodit, et saada sõnumi wm_NCHitTest vaikekäsitlus. Protseduuri osa If pealtkuulab ja muudab teie akna käitumist. See juhtub tegelikult: kui opsüsteem saadab aknasse wm_NCHitTest sõnumi, koos hiire koordinaatidega tagastab aken koodi, mis ütleb, milline osa tal endal on on löödud. Meie ülesande jaoks oluline teave on sõnumi väärtuses. Tulemusväli. Sel hetkel on meil võimalus sõnumi tulemust muuta.

Seda me teeme: kui kasutaja on klõpsanud vormi kliendi piirkonnas, paneme Windows arvama, et kasutaja klõpsas tiitliribal. Sisse Objekt Pascal "sõnad": kui sõnumi tagasiväärtus on HTCLIENT, siis muudame selle lihtsalt HTCAPTIONiks.

Enam pole hiireüritusi

Meie vormide vaikekäitumise muutmisega eemaldame Windowsi võimaluse teid teavitada, kui hiir asub kliendi piirkonnas. Selle triki üks kõrvalmõju on see, et teie vormi enam ei genereerita sündmused hiire jaoks sõnumid.

Tiitriteta ääristeta aken

Kui soovite hõljuva tööriistaribaga sarnast tiitriteta ääristeta akent, määrake vormi pealdiseks tühi string, keelake kõik BorderIconid ja seadke BorderStyle väärtuseks bsNone.

Vormi saab muuta mitmel viisil, rakendades kohandatud koodi meetodil CreateParams.

Veel WM_NCHitTesti trikke

Kui vaatate sõnumit wm_NCHitTest hoolikamalt, näete, et funktsiooni tagastusväärtus näitab kursori kuuma punkti asukohta. See võimaldab meil veel pisut sõnumiga mängida, et luua kummalisi tulemusi.

Järgmine koodifragment takistab kasutajatel teie vorme sulgemast, klõpsates nuppu Sule.

kui Msg. Tulemus = htSulge siis Msg. Tulemus: = htNowhere; 

Kui kasutaja proovib vormi teisaldada, klõpsates tiitliribale ja lohistades, asendab kood sõnumi tulemuse tulemusega, mis näitab, et kasutaja klõpsas kliendi piirkonnas. See takistab kasutajal akna liigutamist hiirega (vastupidiselt sellele, mida tegime artikli alguses).

kui Msg. Tulemus = htCaption siis Msg. Tulemus: = htClient; 

Komponentide omamine vormil

Enamikul juhtudel on vormil mõned komponendid. Ütleme näiteks, et üks paneeliobjekt on vormil. Kui paneeli Align atribuudiks on seatud alClient, täidab paneel kogu kliendi ala, nii et sellel klõpsates pole vanemvormi võimalik valida. Ülaltoodud kood ei tööta - miks? Selle põhjuseks on asjaolu, et hiir liigub alati paneeli komponendi, mitte vormi kohal.

Vormi teisaldamiseks vormi paneeli lohistades peame paneeli komponendi OnMouseDown sündmuse protseduuril lisama paar koodirida:

protseduur TForm1.Panel1MouseDown

(Saatja: TObject; Nupp: TMouseButton;
Shift: TShiftState; X, Y: täisarv);
alustada

 ReleaseCapture;

 SendMessage (vorm1.Käepide, WM_SYSCOMMAND, 61458, 0);

lõpp; 

Märge: See kood ei tööta selliste aknaväliste juhtelementide korral nagu TLabeli komponendid.

instagram story viewer