WinAPI中的WM_TIMER出错

时间:2014-07-13 02:04:58

标签: winapi win32gui

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;

如果我画&gt; 2圈。它模糊背后的条纹,但我不想要它。请帮我 。感谢

以下是我的问题图片:

enter image description here

2 个答案:

答案 0 :(得分:2)

你的整个方法都被打破了。你在错误的时间画画。您应该根据WM_PAINT执行绘画。 Win32的整个设计基于通过绘制自己来响应WM_PAINT的程序。框架将擦除背景,让程序绘制前景。

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

解决这个问题:

  1. 将绘图代码移动到WM_PAINT处理程序。
  2. 通过调用BeginPaint获取设备上下文。
  3. 从计时器调用InvalidateRect将窗口标记为无效,从而强制进行绘制循环。

答案 1 :(得分:1)

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