I think the problem here is that you are waiting for the wrong stuff. You are waiting for an event to arrive. Under normal event-driven circumstances, that is the correct thing to do. However, your application is supposed to be constantly doing something, that is, animating the ball.
So, instead of waiting for an event to arrive, you should be waiting for the display refresh instead. Within that period, you iterate through the messages that have arrived at your port and perform any display updates that are required. There are a number of ways of doing this depending on whether or not you are running windowed, fullscreen or fullscreen with multibuffering.
For most fullscreen game applications, buffering is the norm since you don't want the user to ever see the items being drawn. There is a method of waiting using a "safe to switch buffers" message port that doesn't busy loop, unlike the somewhat simpler WaitBOVP() call (the latter doesn't always busy wait, in my experience, depends on the hardware it's running on).
Anyway, there is an example of how to use this type of buffering in the RKM on the developer CD that you have purchased.