OnTimer и кадрирующая рамка.
От: Cherny  
Дата: 15.06.04 16:49
Оценка:
Написал MDI приложение на MFC. На каждое окно MDIChild положено окно, производное от CWnd ( работает как View ). Решил сделать инструмент Selection Frame ( кадрирующая рамка, т.е. бегущие муравьи ). Муравьи бегут, используя в окне CWnd таймер, т.е. обрабатывая OnTimer.
Есть одна проблема: если щёлкнуть мышью по заголовку окна MDIChild и удерживать кнопку нажатой, то муравьи всё равно бегут, а хочется, чтобы остановились. Например, в Photoshop в таком случае муравьи останавливаются. То есть если отпустить кнопку мыши, муравьи снова начинают бежать. Подскажите в чём дело, ведь в Photoshop муравьи останавливаются при нажатии на заголовок окна, хотя работают, наверное, тоже от обычного таймера.

P.S. Кстати, Selection Frame на русский переводится как "Кадрирующая рамка" или как-то по-другому?
Re: OnTimer и кадрирующая рамка.
От: rus blood Россия  
Дата: 16.06.04 07:21
Оценка:
Здравствуйте, 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(...)
{
    //  этот обработчик по прежнему вызывается.
}
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.