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

CMyDlg::KeyPressed(int nControlID, bool bPressed)
{
switch (bPressed)
{
case true:
for(int i = 0; i<LastPos; i++)
{
m_ProgressBar.SetPos(i);
// вот из этого цикла нужно выйти, если достигнут датчик (LastPos),
// или отпущена кнопка.
}
break;
case false:
//........
//........
}
}
Как это сделать, чтобы сообщение об отпускании кнопки не потерялось для обработки методом OnLButtonUp? Я вставлял в цикл в разных вариантах PeekMessage, DispatchMessage.
Получалось, что срабатывало через раз. То есть нажал кнопку, ProgressBar побежал,
отпустил — остановился. А в следующий раз по отпускании не останавливается.
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:
            //........
            //........
        }
    }
Re: Заплутал в трех соснах. Укажите путь, пожалуйста!
От: Vyacheslav Koltovich  
Дата: 19.08.02 11:46
Оценка:
Здравствуйте Vladimir_D, Вы писали:

Могу предложить два варианта
1) Вместо использования цикла запускать таймер и передвигать маркер по событию таймера
2) Организовать второй поток управления, в котором и запустить цикл. В этом случае первый поток сможет беспрепятственно получать сообщения.


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>отпустил — остановился. А в следующий раз по отпускании не останавливается.
Re[2]: Заплутал в трех соснах. Укажите путь, пожалуйста!
От: Vladimir_D  
Дата: 19.08.02 17:25
Оценка:
Спасибо! По таймеру — то, что нужно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.