visual GDI Animation c++不能正常工作

visual GDI Animation C++ not working properly

本文关键字:工作 常工作 GDI Animation c++ 不能 visual      更新时间:2023-10-16

我试图动画一些正方形,使用这些对象的类。当调用MoveSquare方法时,方块只移动一步,然后停止。

当我尝试使用rand()%50而不是STEP返回的值时,则方块移动。

谁能告诉我是什么问题?为什么每次收到WM_TIMER消息时它们不移动?下面是我的代码:

#include "Square.h"
#define STEP 10
void Square::DrawSquare(HDC hdc,int rx,int ry, int lx, int ly) {
    Rectangle(hdc,x+rx,y+ry,x+lx,y+ly);
}

void Square::MoveSquare(HWND hwnd_ ,int mod_x_Size,int mod_y_Size) {
       x=x+STEP;
       y=y+STEP;
       InvalidateRect(hwnd_,NULL,TRUE);
}

Square::Square(void) {
    x=0;
    y=0; 
}
Square::~Square(void) {
} 

接收和响应系统消息的函数

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
    PAINTSTRUCT ps;
    HDC hdc;
    Square square[NUMARUL_DE_FIGURI];
       HBRUSH shapeColor;
    switch (msg) {

case WM_SIZE :       
        mod_x_Size = LOWORD (lparam) ;
        mod_y_Size = HIWORD (lparam) ;
        break ;
case WM_TIMER:
     for (int i=0;i<NUMARUL_DE_FIGURI;i++) {
            square[i].MoveSquare(hwnd,mod_x_Size,mod_y_Size);
     }
case WM_PAINT: 
    hdc = BeginPaint(hwnd, &ps);
    hdc = GetDC(hwnd);
   for (int i=0;i<NUMARUL_DE_FIGURI;i++) {
        shapeColor = (HBRUSH)SelectObject(hdc, CreateSolidBrush(RGB(255,255,255)));
        square[i].DrawSquare(hdc,(mod_x_Size/2)-((i*60)+60),(mod_y_Size/2)-((i*60)+60),(mod_x_Size/2)-((i*60)+120),(mod_y_Size/2)-((i*60)+120)); 
    }
    ReleaseDC(hwnd,hdc);
    EndPaint(hwnd, &ps);
    break;
case WM_DESTROY:
       KillTimer(hwnd,1);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wparam, lparam);
    }
    return 0;
}

i set timer in main function

  1. WM_TIMER事件中呼叫InvalideRectUpdateWindow。在WM_TIMER事件的末尾添加一个break;。如果没有真正的WM_PAINT消息,进入WM_PAINT的处理程序将不起作用。

  2. WM_PAINT的handler中,使用BeginPaint返回的HDC。当处理WM_PAINT时,调用GetDC

编辑-
squareWndProc的局部变量,每次调用WndProc时,它都会初始化为(0,0)。您可以更改为static

试试能不能解决这个问题

如果你想在每个WM_TIMER事件中重新绘制"正方形",那么仅仅调用InvalidateRect是不够的,因为这只会标记一个需要重新绘制的区域。调用UpdateWindow来强制一个新的WM_PAINT事件