WM_PAINT的有关问题,如何会产生这个消息的循环?

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))