Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];

Вниз

Каким образом можно узнать, что форму начали двигать?   Найти похожие ветки 

 
Pavel   (2011-02-12 14:22) [0]

Здравствуйте. Поясню вопрос.
Есть форма и TEdit на ней. Каким образом из оконной процедуры TEdit-а можно узнать, что форма поменяла позицию, только без использования таймера?

Ответ, который не устраивает:
Оповещать все контролы каким-нибудь сообщением из оконной процедуры формы или же перекрытием Resize или реагированием на событие OnResize формы.

Может есть какие-нибудь способы подписаться на конкретное событие/сообщение у какого-либо окна?

Задался этим вопросом, после того, как увидел, что TEdit получает специальное сообщение как только форму начинаешь двигать, но только если при этом показывается подсказка по типу "Здесь можно вводить только цифры" при свойстве NumbersOnly или же "пароль нельзя копировать" при использовании парольного символа и операции копирования. Так вот, как форму начинаешь двигать, то окно подсказки закрывается, а закрывается оно, потому что TEdit получает некое сообщение под номером $1504, а перед показом подсказки TEdit посылает сообщение $1503. Отсюда и возник вопрос, может действительно как-то можно разово подписаться на сообщение или событие определенного окна без вмешательства в его оконную процедуру.


 
clickmaker ©   (2011-02-12 14:38) [1]

> Каким образом можно узнать, что форму начали двигать?

из дочернего окна в общем случае никак.
Винда иногда может даже не посылать сообщение о перерисовке, так как перемещение области осуществляется на уровне драйвера видяхи или даже аппаратно


 
Smile   (2011-02-12 14:41) [2]

Уважаемый, расскажи нам какой именно TEdit выдает такие "умные" сообщения как:
- "Здесь можно вводить только цифры";
- "Пароль нельзя копировать"


 
Pavel   (2011-02-12 14:48) [3]


> clickmaker ©

Я тоже так думаю, но факт, который я описал с подсказками TEdit-а, исправно работает. Неужели для этого в MS пользуются какими-либо внутренними механизмами?


> Smile

Самый обычный TEdit начиная с Win2k и Delphi 2007-XE. Если к примеру выставить свойство NumbersOnly в TEdit в True, то при попытке ввода букв, будет всплывать подсказка о том, что тут можно вводить только цифры (на данный в момент в win7 именно так и выдается).


 
clickmaker ©   (2011-02-12 14:54) [4]

> но факт, который я описал с подсказками TEdit-а, исправно
> работает

хинты могут срабатывать при потере фокуса


 
Pavel   (2011-02-12 15:03) [5]


> clickmaker ©

Нет, эти хинты не забирают фокус, тоже такая мысль была, но они показываются с помощью SetWindowPos(... SWP_NOACTIVATE or SWP_SHOWWINDOW), так что это исключено. Да и Spy++ не находит WM_KILLFOCUS у этих окон.

Я даже перекрывал сообщения $1503 и $1504, чтобы точно выявить что это именно в них дело. Только остается найти источник этих сообщений, но это явно не сама форма.
Я уже подумывал, что возможно как-то используется MsgWaitForMultipleObjects с флагом QS_INPUT или что-то вроде того. Было бы логично при любом взаимодействии пользователя с окном отправлять сообщение TEdit-у чтобы он закрыл окно подсказки. Ну в общем не знаю даже. Вот подумал может есть народ, который в этой теме знает глубже.


 
Pavel   (2011-02-12 15:50) [6]

Глубоко порыл на эту тему инет, в итоге кроме установки хуков, других вариантов кажись нет. Печаль.


 
Leonid Troyanovsky ©   (2011-02-12 16:02) [7]


> Pavel   (12.02.11 14:22)  

> Может есть какие-нибудь способы подписаться на конкретное
> событие/сообщение у какого-либо окна?

Печалься, кроме хуков, считай, что нет.

--
Regards, LVT.


 
QAZ   (2011-02-13 16:55) [8]

а в чем проблема что тултип пропадает при изменении фокуса и тд, это егостандартное поведение


 
ComponentsForEver   (2011-02-13 17:49) [9]

Сделай компонент, который, при помещении на форму, будет устанавливать для формы свой WindowProc() (впрочем, не забудь потом удалять). В этом WindowProc() отлавливай сообщения перемещения формы, и, по факту, перебирай в цикле контролы на форме, и, если контрол является TEdit, посылай ему свое (любое) сообщение (с любыми параметрами). В общем, компонент такой - на полчаса-час работы. Причем, путем кидания/удаления компонента, легко управлять этой твоей некоей дополнительной функциональностью, которую ты хочешь прикрутить к TEdit. То есть, если хочешь дополнительный функционал - просто кинул этот компонентик на форму, и все работает. Не хочешь дополнительного функционала - убрал компонентик с формы.

>Pavel   (12.02.11 14:22) Ответ, который не устраивает: Оповещать все контролы каким-нибудь сообщением из оконной процедуры формы или же перекрытием Resize или реагированием на событие OnResize формы.

Ну извини...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
6-1237314496
ID_23587A5E
2009-03-17 21:28
2011.05.22
Unit WinInet , проблема с InternetCloseHandle


2-1297759890
Scott Storch
2011-02-15 11:51
2011.05.22
как обойти ограничение в 2 Гб. для стримов?


15-1296854977
Юрий
2011-02-05 00:29
2011.05.22
С днем рождения ! 5 февраля 2011 суббота


2-1297442025
Token
2011-02-11 19:33
2011.05.22
TTreeView и галочки


15-1296655266
Инна
2011-02-02 17:01
2011.05.22
помощь в создании информационной базы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский