Најчешћи начин померања прозора је превлачење по насловној траци. Прочитајте даље како бисте сазнали како можете да пружите могућности повлачења за Делпхформирам без насловне траке, тако да корисник може преместити образац кликом било где на клијентском подручју.
На пример, размотрите случај а Виндовс апликација која нема насловну траку, како да померимо такав прозор? У ствари, могуће је креирати прозоре са нестандардном насловном траком, па чак и са не правокутним облицима. Како би Виндовс у том случају могао знати где су границе и углови прозора?
ВМ_НЦХитТест Виндовс порука
Тхе Виндовс оперативни систем се заснива на великој основи руковање порукама. На пример, када кликнете на прозор или неку контролу, Виндовс му шаље поруку вм_ЛБуттонДовн, са додатним информацијама о томе где се налази курсор миша и који су тренутно контролни тастери притиснуто. Звучи познато? Да, ово је ништа друго до догађај ОнМоусеДовн у Делфима.
Слично томе, Виндовс шаље вм_НЦХитТест поруку кад год догађај миша догађа се, тј. када се курсор креће, или када се тастер миша притисне или отпусти.
Код за унос
Ако можемо да натерамо Виндовс да мисли да корисник повлачи (кликнуо је) насловну траку, а не подручје клијента, тада би корисник могао да превуче прозор кликом на подручје клијента. Најлакши начин за то је да "преварите" Виндовс да мисли да заправо кликнете насловну траку обрасца. Ево шта треба да урадите:
1. Унесите у следећи ред у одељак „Приватне изјаве“ обрасца (декларација о поступању са порукама):
процедура ВМНЦХитТест (вар Мсг: ТВМНЦХитТест); порука ВМ_НЦХитТест;
2. Додајте следећи код у одељак „имплементација“ јединице вашег обрасца (где је Форм1 претпостављено име обрасца):
процедура ТФорм1.ВМНЦХитТест (вар Мсг: ТВМНЦХитТест);
започети
наслеђено;
ако Мсг. Резултат = хтЦлиент онда Мсг. Резултат: = хтЦаптион;
крај;
Прва линија кода у руковаоцу порука позива наслеђену методу ради добијања подразумеваног руковања за вм_НЦХитТест поруку. Ако део у процедури пресреће и промени понашање вашег прозора. Ово се заправо догађа: када оперативни систем пошаље вм_НЦХитТест поруку прозору, заједно са координатама миша, прозор враћа код који наводи који део самог себе има био погођен. Важан податак за наш задатак је вредност Мсг. Поље резултата. У овом тренутку, имамо прилику да изменимо резултат поруке.
То је оно што радимо: ако је корисник кликнуо у пољу клијента обрасца, натераћемо Виндовс да мисли да је корисник кликнуо на насловној траци. Ин Објект Пасцал "речи": ако је вредност повратне поруке ХТЦЛИЕНТ, једноставно је мењамо у ХТЦАПТИОН.
Нема више догађаја са мишем
Променом подразумеваног понашања наших образаца уклањамо могућност Виндовс-а да вас обавештава када миш пређе преко подручја клијента. Једна од нуспојава овог трика је да ваш образац више неће генерисати догађаји за миша поруке.
Прозор без натписа без граница
Ако желите прозор без обруба без натписа сличан плутајућој траци са алаткама, поставите натпис обрасца на празан низ, онемогућите све БордерИцонс и поставите БордерСтиле на бсНоне.
Образац се може мењати на различите начине применом прилагођеног кода у методи ЦреатеПарамс.
Још ВМ_НЦХитТест трикова
Ако пажљивије погледате поруку вм_НЦХитТест, видећете да повратна вредност функције указује на положај вруће тачке курсора. То нам омогућава да се још мало поиграмо с поруком како бисмо створили чудне резултате.
Следећи фрагмент кода спречаваће кориснике да затворе обрасце кликом на дугме Затвори.
ако Мсг. Резултат = хтЦлосе онда Мсг. Резултат: = хтНовхере;
Ако корисник покушава преместити образац кликом на траку с натписима и превлачењем, код замењује резултат поруке резултатом који означава да је корисник кликнуо на подручје клијента. Ово спречава корисника да помера прозор мишем (супротно ономе што смо радили у просјачењу чланка).
ако Мсг. Резултат = хтЦаптион онда Мсг. Резултат: = хтЦлиент;
Имати компоненте на обрасцу
У већини случајева имаћемо неке компоненте на обрасцу. Рецимо, на пример, да се један објект Панел налази на обрасцу. Ако је својство Поравнање панела постављено на алЦлиент, Панел испуњава целокупно подручје клијента тако да није могуће одабрати родитељски образац кликом на њега. Горњи код неће радити - зашто? То је зато што се миш увек помера преко компоненте „Панел“, а не преко форме.
Да бисмо померили наш образац повлачењем панела по обрасцу, морамо додати неколико редака кода у процедури догађаја ОнМоусеДовн за компоненту панела:
процедура ТФорм1.Панел1МоусеДовн
(Пошиљалац: ТОбјецт; Дугме: ТМоусеБуттон;
Схифт: ТСхифтСтате; Кс, И: Интегер);
започети
РелеасеЦаптуре;
СендМессаге (Форм1.Хандле, ВМ_СИСЦОММАНД, 61458, 0);
крај;
Белешка: Овај код неће радити са контролама без прозора као што су ТЛабел компоненте.