Задача следующая. Мне нужно смоделировать на компе
устойство управления неким станком. Там стоит клавиатура,
жидкокристаллический дисплей и т.д. По нажатию
кнопки начинает двигаться некоторое устройство станка.
Оно движется, пока не будет достигнут датчик, ИЛИ пока
не будет отпущена кнопка.
Итак, на компьютере я создал класс, производный от 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: Заплутал в трех соснах. Укажите путь, пожалуйста!
Здравствуйте 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: Заплутал в трех соснах. Укажите путь, пожалуйста!
Могу предложить два варианта
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]: Заплутал в трех соснах. Укажите путь, пожалуйста!