Привет, я пытаюсь сделать так, чтобы небольшое растровое изображение НЛО (рисование / рисование уже позаботились) можно перетаскивать по экрану. Кажется, я не могу обновить положение НЛО, а затем многократно перерисовывать его из функции MouseButtonDown () (упрощенный код для обработчика событий мыши). Любые предложения по обнаружению перетаскивания и перерисовки соответственно? Код ниже для соответствующих функций:
void MouseButtonDown(int x, int y, BOOL bLeft)
{
if (bLeft)
{
while(_bMouseMoving == true && _bMouseDragRelease == false) {
_iSaucerX = x - (_pSaucer->GetWidth() / 2);
_iSaucerY = y - (_pSaucer->GetHeight() / 2);
InvalidateRect(_pGame->GetWindow(), NULL, FALSE);
}
// Set the saucer position to the mouse position
_iSaucerX = x - (_pSaucer->GetWidth() / 2);
_iSaucerY = y - (_pSaucer->GetHeight() / 2);
}
else
{
// Stop the saucer
_iSpeedX = 0;
_iSpeedY = 0;
}
}
void MouseButtonUp(int x, int y, BOOL bLeft)
{
_bMouseDragRelease = true;
}
void MouseMove(int x, int y)
{
_bMouseMoving = true;
}
Чтобы уточнить, что сказал Крис, вы получите сообщение WM_xBUTTONDOWN только один раз, и вам нужно будет использовать его для переключения состояния перетаскивания, которое вы можете запросить при получении сообщения WM_MOUSEMOVE.
Когда вы получите сообщение о перемещении мыши во время состояния перетаскивания, вы захотите сделать недействительным прямоугольник, окружающий НЛО, и прямоугольник, окружающий его.
При аннулировании прямоугольника появляются сообщения WM_PAINT, в которых вы перерисовываете все, что было позади НЛО, и НЛО на новом месте.
Или вы можете обмануть и сделать НЛО курсором при перетаскивании 🙂
Других решений пока нет …