Написал MDI приложение на MFC. На каждое окно MDIChild положено окно, производное от CWnd ( работает как View ). Решил сделать инструмент Selection Frame ( кадрирующая рамка, т.е. бегущие муравьи ). Муравьи бегут, используя в окне CWnd таймер, т.е. обрабатывая OnTimer.
Есть одна проблема: если щёлкнуть мышью по заголовку окна MDIChild и удерживать кнопку нажатой, то муравьи всё равно бегут, а хочется, чтобы остановились. Например, в Photoshop в таком случае муравьи останавливаются. То есть если отпустить кнопку мыши, муравьи снова начинают бежать. Подскажите в чём дело, ведь в Photoshop муравьи останавливаются при нажатии на заголовок окна, хотя работают, наверное, тоже от обычного таймера.
P.S. Кстати, Selection Frame на русский переводится как "Кадрирующая рамка" или как-то по-другому?
Здравствуйте, Cherny, Вы писали:
C>Написал MDI приложение на MFC. На каждое окно MDIChild положено окно, производное от CWnd ( работает как View ). Решил сделать инструмент Selection Frame ( кадрирующая рамка, т.е. бегущие муравьи ). Муравьи бегут, используя в окне CWnd таймер, т.е. обрабатывая OnTimer.
C>Есть одна проблема: если щёлкнуть мышью по заголовку окна MDIChild и удерживать кнопку нажатой, то муравьи всё равно бегут, а хочется, чтобы остановились. Например, в Photoshop в таком случае муравьи останавливаются. То есть если отпустить кнопку мыши, муравьи снова начинают бежать. Подскажите в чём дело, ведь в Photoshop муравьи останавливаются при нажатии на заголовок окна, хотя работают, наверное, тоже от обычного таймера.
Когда нажимается кнопка на заголовке окна, система в своем обработчике этого события закручивает свой цикл, и начинает отслеживать перемещение мыши, пока кнопка не будет отпущена. При этом, из своего цикла система продолжает вызывать DispatchMessage и отдавать все сообщения в окно. Поэтому обработчик WM_TIMER вызывается.
Но если ты сделаешь обработку таймера из своего цикла сообщений, то получишь то, что хочешь.
while (GetMessage(&msg, NULL, 0, 0))
{
if (WM_TIMER == msg.message)
{
// это место НЕ вызывается если кнопка нажата на заголовке
}
.....
}
....
CMyWnd::OnTimer(...)
{
// этот обработчик по прежнему вызывается.
}