下面这段代码是要让一些球在窗体上跳来跳去。在WM_PAINT的处理中,仅仅是改变了每个球的位置,也就是说要不断地产生WM_PAINT消息并处理它,才能实现。问题是,在代码中我并没有不断的产生WM_PAINT消息阿,那么是什么函数隐式的完成了这个消息的循环?代码大致如下:
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
//create some pens to use for drawing
static HPEN BluePen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
static HPEN OldPen = NULL; //create a solid brush
static HBRUSH RedBrush = CreateSolidBrush(RGB(255, 0, 0));
static HBRUSH OldBrush = NULL;
//these hold the dimensions of the client window area
static int cxClient, cyClient;
//create some balls
static SBall* balls = new SBall[NUM_BALLS]; switch (msg)
{
case WM_CREATE:
{这里是初始化的一些操作; }
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint (hwnd, &ps);
OldPen = (HPEN)SelectObject(ps.hdc, BluePen);
OldBrush = (HBRUSH)SelectObject(ps.hdc, RedBrush); for (int i=0; i<NUM_BALLS; ++i)
{
if ( (balls[i].posX >= cxClient) || (balls[i].posX <0))
{
balls[i].velX = -balls[i].velX;
} if ( (balls[i].posY >= cyClient) || (balls[i].posY <0))
{
balls[i].velY = -balls[i].velY;
} balls[i].posX += balls[i].velX;
balls[i].posY += balls[i].velY
Ellipse(ps.hdc,
balls[i].posX - RADIUS,
balls[i].posY - RADIUS,
balls[i].posX + RADIUS,
balls[i].posY + RADIUS);
}//endfor
SelectObject(ps.hdc, OldPen);
SelectObject(ps.hdc, OldBrush);
EndPaint (hwnd, &ps); Sleep(10); }break;//endcase
case WM_DESTROY:
{... }
break; }//end switch return DefWindowProc (hwnd, msg, wParam, lParam);//缺省处理
}
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
//create some pens to use for drawing
static HPEN BluePen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
static HPEN OldPen = NULL; //create a solid brush
static HBRUSH RedBrush = CreateSolidBrush(RGB(255, 0, 0));
static HBRUSH OldBrush = NULL;
//these hold the dimensions of the client window area
static int cxClient, cyClient;
//create some balls
static SBall* balls = new SBall[NUM_BALLS]; switch (msg)
{
case WM_CREATE:
{这里是初始化的一些操作; }
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint (hwnd, &ps);
OldPen = (HPEN)SelectObject(ps.hdc, BluePen);
OldBrush = (HBRUSH)SelectObject(ps.hdc, RedBrush); for (int i=0; i<NUM_BALLS; ++i)
{
if ( (balls[i].posX >= cxClient) || (balls[i].posX <0))
{
balls[i].velX = -balls[i].velX;
} if ( (balls[i].posY >= cyClient) || (balls[i].posY <0))
{
balls[i].velY = -balls[i].velY;
} balls[i].posX += balls[i].velX;
balls[i].posY += balls[i].velY
Ellipse(ps.hdc,
balls[i].posX - RADIUS,
balls[i].posY - RADIUS,
balls[i].posX + RADIUS,
balls[i].posY + RADIUS);
}//endfor
SelectObject(ps.hdc, OldPen);
SelectObject(ps.hdc, OldBrush);
EndPaint (hwnd, &ps); Sleep(10); }break;//endcase
case WM_DESTROY:
{... }
break; }//end switch return DefWindowProc (hwnd, msg, wParam, lParam);//缺省处理
}
球的跳来跳出,应该是你代码中的循环所致。
仔细查看源代码,发现在消息循环的部分还有其它的处理。:)
再次感谢各位!!