![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Mapa3M |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.3.2007 Репутация: нет Всего: нет |
сабж. Хочу нажать на кнопку и перетащить ее в другую часть окна. Но, когда зажимаю левую кнопку мыши и перетаскиваю, окну приходят только WM_CTLCOLORBTN. А нужное мне WM_MOUSEMOVE, как показывает Spy++ приходят кнопке (тоесть когда ставлю хук на кнопку - ловлю, а когда на окно - нет)
Я буквально только-что начал знакомится с Win API, не судите строго. Расскажите пожалуйста, как поймать WM_MOUSEMOVE? Возможно ли создать, если да то как, отдельную CALLBACK для кнопки ? Это сообщение отредактировал(а) Mapa3M - 29.8.2008, 03:08 |
|||
|
||||
BorisVorontsov |
|
|||
![]() Thinker ![]() ![]() Профиль Группа: Комодератор Сообщений: 714 Регистрация: 3.11.2005 Где: Молдавия, г. Киши нёв Репутация: 4 Всего: 10 |
ReleaseCapture?
-------------------- [code=cpp] const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out); for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; [/code] |
|||
|
||||
Mapa3M |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.3.2007 Репутация: нет Всего: нет |
||||
|
||||
Mapa3M |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.3.2007 Репутация: нет Всего: нет |
Кстати, чегото неполучается поставить SetCapture по сообщению WM_PARENTNOTIFY.
По другим сообщениям получается, здесь чота никак не срабатывает. Сообщение приходит что каптча поставлена на кнопку, хотя я ставлю на окно. Как так? Это сообщение отредактировал(а) Mapa3M - 30.8.2008, 04:46 |
|||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
|
|||
|
||||
Mapa3M |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.3.2007 Репутация: нет Всего: нет |
586, Спасиб, то что надо! Буду пробовать...
|
|||
|
||||
Mapa3M |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.3.2007 Репутация: нет Всего: нет |
вот это просто феерично! Я как настоящий герой, непонимая этой части кода, сналача закоментировал его. Пытался двигать контрол вместе с мышкой. Убивался сложностью получаения относительных координат, тормознутостью прерисовки. А тут вот как значит... Кстати, откуда 0xF012? В MSDNе ниче не нашел. |
|||
|
||||
586 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Это народный метод. Работает только для левой кнопки. Написал здесь просто для примера - твой вопрос же был, как перехватить оконную процедуру. Если хорошенько подумать, то можно и с координатами:
Это сообщение отредактировал(а) 586 - 30.8.2008, 16:24 |
||||
|
|||||
GremlinProg |
|
||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
мда уж, не думал, что тема до такого марадерства дойдет...
Mapa3M, сообщение мыши приходят в окно, над которым она находится, т.е., если ты кликаешь на кнопку, то WM_LBUTTONDOWN и придет в кнопку, т.е. в процедуре диалога оно само не объявится. чтобы перехватить процедуру окна любого контрола, необходимо воспользоваться специально предназначенного для этого API, вот пример такого перехвата (корректная версия с поддержкой w64):
версия с включенной поддержкой w64, это 32-битная версия, (стандартная ошибка локализации, на x64 работать не будет!):
версия с выключенной поддержкой w64 (без ошибок и без x64):
NewWndProc - это процедура кнопки, которая после такого будет вызываться вместо стандартной (OldWndProc) стратегия NewWndProc должна составлять хотя бы такой минимум:
такой перехват нужно делать сразу после инициализации диалога, например в WM_INITDIALOG если нужен перехват WM_LBUTTONDOWN, то это можно сделать так:
вариант#1: перемещение кнопки нужно сопрягать по крайней мере с тремя сообщениями мыши: 1. WM_LBUTTONDOWN 2. WM_MOUSEMOVE 3. WM_LBUTTONUP в первом нужно запомнить позицию мыши относительно левого-верхнего угла кнопки (sx,sy) = (x - left,y - top) и включить флаг переноса во втором нужно тестировать флаг переноса, и если он включен, переместить кнопку в позицию (x - sx,y - sy) в третьем нужно сбросить флаг переноса флаг переноса - просто любая глобальная переменная, изначально проинициализированная нулем вариант#2: корректное перемещение включает еще дополнительное сообщение: 4. WM_CAPTURECHANGED при этом, на WM_LBUTTONDOWN нужно еще вызвать SetCapture, а на WM_LBUTTONUP вызвать ReleaseCapture, флаг переноса сбрасывать уже не на WM_LBUTTONUP, а в сообщении WM_CAPTURECHANGED, остальное - так же как в первом варианте. попробуй оба варианта, разницу сам увидишь тебе как нужно кнопку двигать? зажатую или не зажатую, или это не важно? если не зажатую, то во время перехвата WM_LBUTTONDOWN, не выполняй стандартную обработку окна, т.е. вместо break вызови return 0 этим ты предотвратишь стандартную инициализацию механизма нажатия (в том числе и SetCapture), но тогда уже и нажиматься кнопка не будет. Это сообщение отредактировал(а) GremlinProg - 30.8.2008, 16:53 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||||
|
|||||||||||
Mapa3M |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 26.3.2007 Репутация: нет Всего: нет |
586, О, гуру, открой мне источник своей мудрости! (Не хочу по два дня ковырять ивзращенный код того, что делается в две строчки еще и лучше) =))
З.Ы. извиняюсь, подскажите книжку... хм, учту. Метод понравился, спасибо. вот примерно так я и делал. Только с координатами помучался, ибо GetParent функции не знал, и без SetCapture. Зачем он в таком коде? Чтоб с другими обектами конфуз не вышел? GremlinProg, спасибо за подробный разбор полетов. Это сообщение отредактировал(а) Mapa3M - 30.8.2008, 18:53 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |