我在 MSDN 上找到了一个示例,展示了如何使用纯 Win32 绘制东西。
在 WM_PAINT 中不应调用 Invalidate 或 Updatewindow,因为 UpdateWindow 会发送新的 WM_PAINT 事件,并使无效变得积累,直到下一个 wm_paint 事件。
您应该将代码分成两个函数,一个执行移动操作,另一个在当前位置绘制圆形。
您的 Mover 函数可以从任何地方调用(也许是定时器处理程序函数?)并应以此结束
InvalidateRect (hWnd, NULL, TRUE);
UpdateWindow(hWnd);
为了标记您的客户区域以进行重绘并通知窗口重新绘制。
您的Draw()函数应读取使用移动函数设置的位置,并在该位置周围绘制一个圆圈。
(附注:如果您想最小化闪烁并获得流畅的动画,请在基本动画运行后查看双缓冲)
更新
您的Update函数中缺少UpdateWindow命令。
仅当应用程序接收到WM_PAINT消息时,才会调用您的OnPaint函数,因此您需要发送这些消息。
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);
}