![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Подскажите пожалуйста как определять Борландовские сообщения CM_MOUSEENTER и CM_MOUSELEAVE в API? Т.е. их аналог? Просто эти сообщения посылоются при использовании VCL, а если на чистом API? Как ловить эти события?
|
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
В винапи нет такого аналога.
И эти сообщения тоже не генерируются. Их создаёт TApplication искуственно - анализирует положение мышки при простое. |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
При каждом перемещении мышки WM_MOUSEMOVE проверяет положение курсора???
Добавлено @ 00:06 т.е. он находится над курсором или нет... я правильно понял? |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
имхо обрабатывать WM_MOUSEMOVE
Добавлено @ 00:07 да -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Нет. Он помнит последние координаты мыши.
Если в очереди нет сообщений, то Application включает холостой ход - занимается чем попало (OnIdle). В том числе проверяет, а не изменились ли координаты мыши, а тот же контрол под мышей или уже нет... Добавлено @ 00:16 Если анализировать WM_MOUSEMOVE, то не узнаешь, что мыш ушла за форму. Если мыша не над формой, то нет никаких сообщений. |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
Snowy, дык че если повесить свой обработчик на
мы не сможем определять место где находится мышь? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Если мышь ушла за форму, то нет - WM_MOUSEMOVE ты не получишь в данном случае.
|
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
дык в этом случае и
тоже не получишь ![]() -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Я же говорю, CM_MOUSEENTER и CM_MOUSELEAVE генерируются TApplication на основе анализа положения курсора, но не при отлове сообщений, а наборот - при их отсутствии.
Добавлено @ 00:31 Так сделано именно потому, что при уходе мыши, нам винда не шлёт никаких сообщений. Вот и определяем, где наша мыша, когда их нет. Это к тому же и систему не грузит. А на мусямове вешать - при движении мыши тормоза появятся. |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
А по какому сообщению тогда идет проверка? Я что-то не пойму...
|
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Если я непонятно объясняю - скажите, что не понятно.
А то я уже 4-й раз повторяю. Проверка идёт не по сообщению. Проверка идёт, когда сообщений нет! |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
TrackMouseEvent может лучше лучше будет использовать?
|
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Нужно ловить сообщения пиком, а не гетом.
Если работы нет - курим, проверяем.
|
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
||||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
А какой способ всеже лучше и менее грузит систему? Я конечно понимаю что это для современных компьютеров очень малые расходы, но все же я хотел бы узнать какой способ лучше и быстрее...
|
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Ну, если составлять рейтинг по нагрузке, то так (в порядке увеличения нагрузки):
1. TrackMouseEvent 2. OnIdle 8. WM_MOUSEMOVE |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Сделал я вот так:
С формой все отлично работает, ловятся в WindowProc сообщения CM_MOUSEENTER/CM_MOUSELEAVE при наведении и уходе курсора мышки с формы.. А что делать если тоже самое нужно сделать еще и с контролами? Т.е. со всеми CHILD-окнами, которые находятся на этой форме чтобы с них ловился уход курсора и наведение? |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Вобщем процедуру DoIdle я так реализовал:
|
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Вот такой вариант процедуры
Это сообщение отредактировал(а) bems - 26.11.2006, 05:20 -------------------- Обижено школьников: 8 |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Почти тоже самое, только без {$WRITEABLECONST ON} и {$WRITEABLECONST OFF} только вот что это значит я не знаю...
|
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Dmitry_177, sleep(200) убери
![]() Добавлено @ 05:47 {$WRITEABLECONST ON} разрешает запись в типизированные константы, как было в турбоПаскакали Глобально изменить можна в project/options/compiler/assignable typed constants const LastPointWnd:HWND=0; эта "константа" будет инициализирована нулем только при первом заходе в процедуру LastPointWnd:=PointWnd; после этого при следующем заходе в процедуру значение сохраниться измененным, а не 0 sleep(200); - погарячился, выкинь {$WRITEABLECONST OFF} возвращаем дефолтный запрет изменения констант Добавлено @ 05:50 это отследит и для дочерних окон -------------------- Обижено школьников: 8 |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
только SendMessage(LastPointWnd,CM_MOUSELEAVE,0,0) и SendMessage(PointWnd,CM_MOUSEENTER,0,0) лучше замени на прямые вызовы функций, а от сообщений тут нужно отказаться
-------------------- Обижено школьников: 8 |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Зачем вообще константы изменять? Ведь для этого переменные есть... Только тут придется глобальную переменную делать, но а чем они так плохи?
|
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
дело вкуса. Главное смысл ты понял
![]() -------------------- Обижено школьников: 8 |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Смысл то понял... но я не пойму никак всеже почему все говорят что глобальные переменные не рекомендуется использовать...
|
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
из-за опасности изменить где не надо. Если ты себя контролируешь, то все путем.
![]() Ну вообще это требование хорошего стиля - возможность изменить значение переменной должна быть там, где программер предусмотрел, что это будет нужно и больше нигде. Хоть запись в типизированые константы борланд и не рекомендует, но все же в делфи нет статических переменных... а это ОБЯЗАТЕЛЬНО не спрашивай, просто сделай, ок? ![]() -------------------- Обижено школьников: 8 |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Цитата(bems @ 26.11.2006, 06:19 )
только SendMessage(LastPointWnd,CM_MOUSELEAVE,0,0) и SendMessage(PointWnd,CM_MOUSEENTER,0,0) лучше замени на прямые вызовы функций, а от сообщений тут нужно отказаться а это ОБЯЗАТЕЛЬНО не спрашивай, просто сделай, ок? Я бы сделал так, но мне нужно вот как: в окне имеется несколько кнопок с моей отрисовкой, так вот каждой кнопке шлется сообщение CM_MOUSEENTER или CM_MOUSELEAVE и кнопка перерисовывается в зависимости от сообщения, т.е. "подсвечиваю" ее если курсор над ней или нет.. А вот как в одной функции для всех кнопок это сделать я что-то ума не приложу, вот и делаю через сообщения.. А еще я тут вот с чем столкнулся, если курсор находится над окном, а потом перемещается на кнопку которая находится в этом окне, то окну шлется CM_MOUSELEAVE а кнопке CM_MOUSEENTER, по идее все так и должно быть, но мне нужно чтобы не слалось окну CM_MOUSELEAVE в этом случае, если курсор над какой-то кнопкой, а чтоб слалось только тогда когда курсор вообще вышел за пределы окна.. Я вот думаю может константу LastPointWnd проверять на parent(это в VCL, а на API не знаю как) только что полученного значения PointWnd? и если это условие выполняется то слать только CM_MOUSEENTER.. Это все для того, что у меня форма при уходе курсора за ее пределы, т.е. в обработке CM_MOUSELEAVE становится полупрозрачной, а по сообщению CM_MOUSEENTER становится полностью видимой, а т.к. эти же сообщения нужны и для кнопок получается так, что если курсор зайдет в пределы кнопки то форма становится полупрозрачной.. |
|||
|
||||
bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
GetParent Но это поможет только если у тебя все кнопки прямо на окне (нет одного/несольких промежуточных контейнеров) -------------------- Обижено школьников: 8 |
||||
|
|||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Попробовал так, пока без RegisterWindowMessage:
CM_MOUSELEAVE правильно шлется, а CM_MOUSEENTER нет... Что-то я запутался с этими условиями...((( |
|||
|
||||
Dmitry_177 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Вот так работает, немного замороченно с условиями, но работает... Может можно и попроще сделать, не знаю...
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |