WM_PAINT的问题,怎么会产生这个消息的循环??
下面这段代码是要让一些球在窗体上跳来跳去。在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);//缺省处理
}
[解决办法]
用定时器,然后用Invalidate触发.
[解决办法]
Invalidate可产生WM_PAINT消息
[解决办法]
自已处理了wm_paint消息就反回return 0,如果你不反回系统会继续处理wm_paint消息
[解决办法]
check out MTGDI and MTMDI samples in MSDN
[解决办法]
上面的代码肯定自己产生不了WM_PAINT消息的,应该在别的地方;
球的跳来跳出,应该是你代码中的循环所致。
[解决办法]
在你的程序的WinMain里面找