Я нашел пример на MSDN, который показывает, как рисовать вещи в чистом win32.
Вы не должны вызывать Invalidate или Updatewindow в WM_PAINT, поскольку UpdateWindow отправляет новое WM_PAINT-событие, и недействительные данные накапливаются до события next wm_paint.
Вы должны разделить ваш код на две функции: одну для выполнения движения, а другую для рисования круга в текущем месте.
Ваша функция Mover может вызываться из любого места (возможно, в функции обработчика таймера?) И должна заканчиваться на
InvalidateRect (hWnd, NULL, TRUE);
UpdateWindow(hWnd);
Чтобы пометить свою клиентскую область для перерисовки и уведомить свое окно о перерисовке.
Ваша функция Draw () должна считывать положение, заданное с помощью функции перемещения, и просто рисовать окружность вокруг этого места.
(Sidenote: если вы хотите свести к минимуму мерцание и получить плавную анимацию, взгляните на двойную буферизацию , как только вы запустите базовую анимацию)
UPDATE
Вам не хватало команды UpdateWindow в вашей функции обновления
Ваша OnPaint-функция вызывается только тогда, когда ваше приложение получает сообщение WM_PAINT, поэтому вам необходимо отправить его.
UpdateWindow служит для этой цели
VOID update(HDC hdc,HWND hWnd)
{
sf++;
FillRect(hdc,rect,(HBRUSH)(COLOR_WINDOW+1));
InvalidateRect (hWnd, NULL, TRUE);
UpdateWindow(hWND);//<- This Line sends a wm_paint-message to your window in order to make it redraw itself
}
//i didn't do any changes to the onPaint functon but here is the code for it
VOID onPaint(HDC hdc)
{
Graphics graphics(hdc);
Pen pen(Color(255, 0, 0, 255));
graphics.DrawEllipse(&pen, sf , 0, 10, 10);
}
//here is the while loop
while(sd==1)
{ onPaint(hdc);
update(hdc,hWnd);
}