WinAPI中的WM_计时器出错 intwmid,wmEvent; PAINTSTRUCT-ps; HDC-HDC; HBRUSH刷; HBRUSH-HBRUSH; HPEN-HPEN; 静态int-dX[3],dY[3]; 静态整数x[3],y[3],oldX[3],oldY[3]; 开关(信息) { 案例WM_创建: 设置计时器(hWnd,1,3,空); 嘟嘟声(750300); 对于(int i=0;i

WinAPI中的WM_计时器出错 intwmid,wmEvent; PAINTSTRUCT-ps; HDC-HDC; HBRUSH刷; HBRUSH-HBRUSH; HPEN-HPEN; 静态int-dX[3],dY[3]; 静态整数x[3],y[3],oldX[3],oldY[3]; 开关(信息) { 案例WM_创建: 设置计时器(hWnd,1,3,空); 嘟嘟声(750300); 对于(int i=0;i,winapi,win32gui,Winapi,Win32gui,如果我画>2圈。它模糊了后面的条纹,但我不想要它。请帮帮我。谢谢 以下是我的问题的图片: 第一次调用FillRect时,使用白色笔刷。但在随后的循环中,矩形是用灰色画笔绘制的,因此可以得到灰色条纹。我建议您在循环之前创建一个白色笔刷和一个灰色笔刷,只创建一次。然后在每次绘制之前选择所需的画笔。您的整个方法都被破坏了。你在错误的时间画画。您应该根据WM\u PAINT进行绘制。Win32的整个设计基于程序通过绘制自身来响应WM_PAINT。框架将删除背景,让程序绘制前景 可能需要重新绘制窗口的原因

如果我画>2圈。它模糊了后面的条纹,但我不想要它。请帮帮我。谢谢

以下是我的问题的图片:


第一次调用FillRect时,使用白色笔刷。但在随后的循环中,矩形是用灰色画笔绘制的,因此可以得到灰色条纹。我建议您在循环之前创建一个白色笔刷和一个灰色笔刷,只创建一次。然后在每次绘制之前选择所需的画笔。

您的整个方法都被破坏了。你在错误的时间画画。您应该根据
WM\u PAINT
进行绘制。Win32的整个设计基于程序通过绘制自身来响应
WM_PAINT
。框架将删除背景,让程序绘制前景

可能需要重新绘制窗口的原因有很多。您正专注于动画的常规脉冲。但是如果另一个程序被拖到你的上面呢

这样解决问题:

  • 将绘图代码移动到
    WM_PAINT
    处理程序
  • 通过调用
    BeginPaint
    获取设备上下文
  • 从计时器中调用
    invalidate
    ,将窗口标记为无效,从而强制绘制循环
    这个问题与
    WM\u定时器
    没有任何关系。无论是否由计时器触发,都会发生无法正确擦除背景的情况。你用椭圆画了这个物体,为什么不用同样的方法擦除呢?谢谢。你可以告诉我如何擦除椭圆。非常感谢这里没有擦除功能,只有绘图功能。@JonathanPotter,但使用白色画笔和钢笔绘图与擦除功能相同。@retired windows没有持久的画布。擦除最后绘制的内容不是解决方案。我将其分为两个循环,一个用于擦除所有项目,另一个用于绘制所有项目以最小化笔刷交换,但最终的区别相同。您可以告诉我如何处理圆之间的碰撞吗。非常感谢你
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HBRUSH brush;
    HBRUSH hBrush;
    HPEN hPen;
    
    static int dX[3] , dY[3] ;
    static int x[3], y[3], oldX[3], oldY[3];
    switch (message)
    {
    case WM_CREATE:
        SetTimer(hWnd, 1, 3, NULL);
        Beep(750, 300);
        for (int i = 0; i < 3; i++){
            dX[i] = rand() % 5 + 0;
            dY[i] = rand() % 5 + 0;
            x[i] = rand() % 5 + 0;
            y[i] = rand() % 5 + 0;
            oldX[i] = x[i];
            oldY[i] = y[i];
        }
        break;
    case WM_TIMER:
        hdc = GetDC(hWnd);
        brush = (HBRUSH)SelectObject(hdc, GetStockObject(WHITE_BRUSH));
    
        RECT temp[3];
        RECT rect;
        GetClientRect(hWnd, &rect);
        for (int i = 0; i <3; i++){
            temp[i].left = oldX[i];
            temp[i].top = oldY[i];
            temp[i].right = oldX[i] + 30;
            temp[i].bottom = oldY[i] + 30;
            FillRect(hdc, &temp[i], brush); 
            brush = (HBRUSH)SelectObject(hdc, GetStockObject(GRAY_BRUSH));
            Ellipse(hdc, x[i], y[i], 30 + x[i], 30 + y[i]);
            oldX[i] = x[i];
            oldY[i] = y[i];
    
            x[i] += dX[i];
            y[i] += dY[i];
    
    
            if (x[i] + 30 > rect.right || x[i] < 0)
            {
                dX[i] = -dX[i];
            }
            if (y[i] + 30 > rect.bottom || y[i] < 0)
            {
                dY[i] = -dY[i];
            }
        }
    
        SelectObject(hdc, brush);
    
        ReleaseDC(hWnd, hdc);
    
        break;