Кликнете и плъзнете формуляр Delphi без лентата с надписи

click fraud protection

Най-често срещаният начин за преместване на прозорец е да го плъзнете по заглавната му лента. Прочетете, за да разберете как можете да осигурите възможности за влачене Delphформирам без заглавна лента, така че потребителят може да премести формуляр, като кликне навсякъде в клиентската зона.

Например, помислете за случая с a Приложение за Windows която няма заглавна лента, как можем да преместим такъв прозорец? Всъщност е възможно да се създадат прозорци с нестандартна заглавна лента и дори не правоъгълни форми. В този случай как Windows може да знае къде са границите и ъглите на прозореца?

WM_NCHitTest Windows съобщение

Най- Операционна система Windows се основава силно на боравене със съобщения. Например, когато щракнете върху прозорец или елемент за управление, Windows му изпраща съобщение wm_LButtonDown, с допълнителна информация за това къде се намира курсорът на мишката и кои контролни клавиши са в момента натиснат. Звучи ми познато? Да, това не е нищо повече от събитие OnMouseDown в Delphi.

instagram viewer

По подобен начин Windows изпраща wm_NCHitTest съобщение, когато a събитие с мишка възниква, тоест когато курсорът се движи или когато бутонът на мишката е натиснат или освободен.

Код за въвеждане

Ако можем да накараме Windows да мисли, че потребителят влачи (е щракнал върху) заглавната лента, а не клиентската област, тогава потребителят може да плъзне прозореца, като кликне в клиентската област. Най-лесният начин да направите това е да "заблудите" Windows да мисли, че всъщност кликвате върху заглавната лента на формуляр. Ето какво трябва да направите:

1. Вмъкнете следния ред в секцията „Лични декларации“ на вашата форма (декларация за процедура за обработка на съобщения):

процедура WMNCHitTest (Var Msg: TWMNCHitTest); съобщение WM_NCHitTest; 

2. Добавете следния код в секцията "изпълнение" на единицата на формуляра (където Form1 е предполагаемото име на формуляра):

процедура TForm1.WMNCHitTest (Var Msg: TWMNCHitTest);

започвам

наследен;

ако Съобщ. Резултат = htClient тогава Съобщ. Резултат: = htCaption;

край; 

Първият ред код в обработващия съобщения извиква наследствения метод, за да получи обработката по подразбиране за wm_NCHitTest съобщението. Ако част от процедурата прихваща и променя поведението на вашия прозорец. Това всъщност се случва: когато операционната система изпрати wm_NCHitTest съобщение до прозореца, заедно с координатите на мишката прозорецът връща код, който посочва коя част от себе си има беше ударен. Важната информация за нашата задача е в стойността на Msg. Поле за резултат. В този момент имаме възможност да модифицираме резултата от съобщението.

Това правим: ако потребителят е кликнал в клиентската зона на формата, караме Windows да мисли, че потребителят е щракнал върху заглавната лента. в Обект Паскал "думи": ако стойността за връщане на съобщението е HTCLIENT, ние просто я променяме на HTCAPTION.

Няма повече събития с мишка

Променяйки поведението по подразбиране на нашите формуляри, ние премахваме способността на Windows да ви известява, когато мишката е над клиентската зона. Един страничен ефект от този трик е, че формата ви вече няма да генерира събития за мишка съобщения.

Прозорец без надписи

Ако искате прозорец без полета без надписи, подобен на плаваща лента с инструменти, задайте надписа на формуляра на празен низ, деактивирайте всички BorderIcons и задайте BorderStyle на bsNone.

Формата може да бъде променена по различни начини чрез прилагане на персонализиран код в метода CreateParams.

Още WM_NCHitTest трикове

Ако погледнете по-внимателно съобщението wm_NCHitTest, ще видите, че връщащата се стойност на функцията показва позицията на горещата точка на курсора. Това ни позволява да играем още с посланието, за да създадем странни резултати.

Следният фрагмент от код ще попречи на потребителите да затворят вашите формуляри, като кликнат върху бутона Затвори.

ако Съобщ. Резултат = htClose тогава Съобщ. Резултат: = htNowhere; 

Ако потребителят се опитва да премести формата чрез щракване върху лентата с надписи и плъзгане, кодът замества резултата от съобщението с резултат, който показва, че потребителят е кликнал върху клиентската област. Това не позволява на потребителя да движи прозореца с мишката (обратно на това, което правехме при просенето на статията).

ако Съобщ. Резултат = htCaption тогава Съобщ. Резултат: = htClient; 

Съставяне на компоненти във формуляр

В повечето случаи ще имаме някои компоненти във формуляр. Да приемем например, че един обект на панел е във формуляр. Ако свойството Align of a panel е настроено на alClient, Panel запълва цялата клиентска област, така че е невъзможно да изберете родителската форма, като щракнете върху нея. Кодът по-горе няма да работи - защо? Това е така, защото мишката винаги се движи над компонента на панела, а не върху формата.

За да преместим формата си чрез плъзгане на панел върху формата, трябва да добавим няколко реда код в процедурата на събитието OnMouseDown за компонента на панела:

процедура TForm1.Panel1MouseDown

(Подател: TObject; Бутон: TMouseButton;
Shift: TShiftState; X, Y: цяло число);
започвам

 ReleaseCapture;

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

край; 

Забележка: Този код няма да работи с контроли без прозорец като TLabel компоненти.

instagram story viewer