Noklikšķiniet un velciet Delphi veidlapu bez parakstu joslas

Visizplatītākais loga pārvietošanas veids ir vilkt to pa nosaukuma joslu. Lasiet tālāk, lai uzzinātu, kā varat nodrošināt vilkšanas iespējas Delfsi veidlapas bez nosaukuma joslas, tāpēc lietotājs var pārvietot veidlapu, noklikšķinot uz jebkuras vietas klienta apgabalā.

Piemēram, apsveriet gadījumu a Windows lietojumprogramma kam nav virsrakstjoslas, kā mēs varam pārvietot šādu logu? Faktiski ir iespējams izveidot logus ar nestandarta nosaukumjoslu un pat ar taisnstūrveida formām. Kā šajā gadījumā Windows varētu zināt, kur ir robežas un loga stūri?

Windows ziņojums WM_NCHitTest

Windows operētājsistēma ir stipri balstīta uz ziņojumu apstrāde. Piemēram, kad jūs noklikšķiniet uz loga vai vadības ierīces, Windows nosūta tai wm_LButtonDown ziņojumu, ar papildu informāciju par to, kur atrodas peles kursors un kādi vadības taustiņi atrodas pašlaik nospiests. Izklausās pazīstami? Jā, tas nav nekas vairāk kā OnMouseDown notikums Delfos.

Tāpat Windows ikreiz nosūta wm_NCHitTest ziņojumu peles pasākums notiek, tas ir, kad kursors pārvietojas vai kad tiek nospiesta vai atbrīvota peles poga.

instagram viewer

Ievades kods

Ja mēs varam likt Windows domāt, ka lietotājs velk (ir noklikšķinājis) virsrakstjoslu, nevis klienta apgabalu, tad lietotājs var vilkt logu, noklikšķinot uz klienta apgabala. Vienkāršākais veids, kā to izdarīt, ir "apmānīt" Windows, domājot, ka jūs faktiski noklikšķināt uz veidlapas virsrakstjoslas. Lūk, kas jums jādara:

1. Veidlapas sadaļā “Privātās deklarācijas” (ziņojumu apstrādes procedūras deklarācija) ievietojiet šo rindu:

procedūra WMNCHitTest (var Msg: TWMNCHitTest); ziņa WM_NCHitTest; 

2. Pievienojiet šādu kodu savas formas vienības sadaļā "Īstenošana" (kur 1. veidlapa ir pieņemtais formas nosaukums):

procedūra TForm1.WMNCHitTest (var Msg: TWMNCHitTest);

sākt

mantots;

ja Ziņojums Rezultāts = htClient tad Ziņojums Rezultāts: = htCaption;

beigas; 

Pirmā koda rindiņa ziņojumu apstrādātājā izsauc iedzimto metodi, lai iegūtu wm_NCHitTest ziņojuma noklusējuma apstrādi. Procedūras daļa pārtver un maina jūsu loga uzvedību. Tas notiek tieši tā: kad operētājsistēma uz logu nosūta wm_NCHitTest ziņojumu, kopā ar peles koordinātām logs atgriež kodu, kurā norādīts, kura pati daļa ir ir notriekts. Svarīga informācija mūsu uzdevumam ir ziņojuma vērtībā. Rezultāta lauks. Šajā brīdī mums ir iespēja mainīt ziņojuma rezultātu.

Tas ir tas, ko mēs darām: ja lietotājs ir noklikšķinājis uz formas klienta apgabalu, mēs piespiežam Windows domāt, ka lietotājs noklikšķināja uz virsrakstjoslas. Iekšā Objekts Paskāls "vārdi": ja ziņojuma atgriešanas vērtība ir HTCLIENT, mēs to vienkārši nomainīsim uz HTCAPTION.

Vairs nav notikumu ar peli

Mainot mūsu veidlapu noklusējuma izturēšanos, mēs novēršam Windows iespēju jūs informēt, kad pele atrodas virs klienta zonas. Viena no šī trika blakusparādībām ir tāda, ka jūsu veidlapa vairs neveidosies notikumi pelei ziņas.

Logs bez parakstiem bez apmalēm

Ja vēlaties logu bez parakstiem bez apmalēm, kas līdzīgs peldošajai rīkjoslai, iestatiet veidlapas parakstu uz tukšu virkni, atspējojiet visus BorderIcons un iestatiet BorderStyle uz bsNone.

Veidlapu var mainīt dažādos veidos, izmantojot pielāgoto kodu CreateParams metodē.

Vairāk WM_NCHitTest triku

Ja rūpīgāk izpētīsit ziņojumu wm_NCHitTest, redzēsit, ka funkcijas atgriešanās vērtība norāda kursora karsto vietu. Tas ļauj mums vēl vairāk spēlēt ar ziņu, lai radītu dīvainus rezultātus.

Šis koda fragments neļaus lietotājiem aizvērt jūsu veidlapas, noklikšķinot uz pogas Aizvērt.

ja Ziņojums Rezultāts = htAizvērt tad Ziņojums Rezultāts: = htNowhere; 

Ja lietotājs mēģina pārvietot veidlapu, noklikšķinot uz parakstu joslas un velkot, kods ziņojuma rezultātu aizstāj ar rezultātu, kas norāda, ka lietotājs noklikšķināja uz klienta apgabala. Tas neļauj lietotājam pārvietot logu ar peli (pretēji tam, ko mēs darījām raksta iesākumā).

ja Ziņojums Rezultāts = htCaption tad Ziņojums Rezultāts: = htClient; 

Kam ir komponenti veidlapā

Vairumā gadījumu veidlapā būs daži komponenti. Teiksim, piemēram, ka viens paneļa objekts atrodas veidlapā. Ja paneļa Align rekvizīts ir iestatīts uz alClient, panelis aizpilda visu klienta zonu tā, ka nav iespējams atlasīt vecāku formu, noklikšķinot uz tās. Iepriekš minētais kods nedarbosies - kāpēc? Tas ir tāpēc, ka pele vienmēr pārvietojas pa paneļa komponentu, nevis formu.

Lai pārvietotu savu formu, velkot veidlapas paneli, OnMouseDown notikuma procedūrā paneļa komponentam ir jāpievieno dažas koda rindiņas:

procedūra TForm1.Panel1MouseDown

(Sūtītājs: TObject; Poga: TMouseButton;
Shift: TShiftState; X, Y: vesels skaitlis);
sākt

 ReleaseCapture;

 SendMessage (Form1.Handle, WM_SYSCOMMAND, 61458, 0);

beigas; 

Piezīme: Šis kods nedarbosies ar tādām vadīklām kā logi, piemēram, TLabel komponenti.

instagram story viewer