Re: Заплутал в трех соснах. Укажите путь, пожалуйста!
От: migel  
Дата: 18.08.02 17:59
Оценка:
Здравствуйте Vladimir_D, Вы писали:

VD>Задача следующая. Мне нужно смоделировать на компе

VD>устойство управления неким станком. Там стоит клавиатура,
VD>жидкокристаллический дисплей и т.д. По нажатию
VD>кнопки начинает двигаться некоторое устройство станка.
VD>Оно движется, пока не будет достигнут датчик, ИЛИ пока
VD>не будет отпущена кнопка.
VD>Итак, на компьютере я создал класс, производный от CBitmapButton,
VD>добавил обработчики OnLButtonDown и OnLButtonUp.
VD>Из них вызывается метод диалога, куда передается ControlId кнопки,
VD>и состояние true/false. Пока все нормально. Затем нужно
VD>симитировать перемещение. Для простоты я попробовал это
VD>сделать ProgressBar'ом.
VD>То есть (для простоты предположим, что кнопка только одна)

VD>CMyDlg::KeyPressed(int nControlID, bool bPressed)

VD> {
VD> switch (bPressed)
VD> {
VD> case true:
VD> for(int i = 0; i<LastPos; i++)
VD> {
VD> m_ProgressBar.SetPos(i);
VD> // вот из этого цикла нужно выйти, если достигнут датчик (LastPos),
VD> // или отпущена кнопка.
VD> }
VD> break;
VD> case false:
VD> //........
VD> //........
VD> }
VD> }
VD>Как это сделать, чтобы сообщение об отпускании кнопки не потерялось для обработки методом OnLButtonUp? Я вставлял в цикл в разных вариантах PeekMessage, DispatchMessage.
VD>Получалось, что срабатывало через раз. То есть нажал кнопку, ProgressBar побежал,
VD>отпустил — остановился. А в следующий раз по отпускании не останавливается.

Что то вроде такого
CMyDlg::KeyPressed(int nControlID, bool bPressed)
            {
    switch (bPressed)
        {
        case true:
                 for(int i = 0; i<LastPos; i++)
                            {
                        m_ProgressBar.SetPos(i);
            // вот из этого цикла нужно выйти, если достигнут датчик (LastPos),
            // или отпущена кнопка.
                                    MSG msg;
                                    while (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
                                    {
                                        TranslateMessage(&msg);
                                        DispatchMessage(&msg);
                                    }
                                    if (!m_bPressed) // 
                                        break;
            }
                 break;
        case false:
            //........
            //........
        }
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.