I have been playing with the source with partial print on to try to solve my problem of corrupted video when minimizing/maximizing and moving across monitors.
Here is what I found:
I added a flag into graphicst (if I remember correctly) to force a full render for one frame. I set the flag in the WM_PAINT event. (There are tons of ways to hook it, I just chose PAINT because it was simple.) This should be very portable to Mac/Linux. I couldn't find an event for moving the window across screens. The only way I could solve that problem is to enumerate the list of screens, and check the window moved event to see if the new/old window position intersects with 2 of the screens.
If you could redraw every frame without a speed loss, you eliminate all of these problems. If you want maximum compatibility, you are stuck with immediate mode with opengl. The default opengl that comes with windows only supports GL_WIN_swap_hint, GL_EXT_bgra, and GL_EXT_paletted_texture extensions, which are all useless to you.
The best way I can think to keep opengl and run fast is to render the changes to texture, then render that texture every frame on one large quad. If the user has any video card from the turn of the millennium, you can use
http://developer.nvidia.com/object/gdc_oglrtt.html . If the card doesn't support WGL_ARB_render_texture, you can fall back to glCopyTexSubImage methods. This is only two rendering paths, and should ensure compatibility and maximum possible speed.
This would also free you up to do more interesting things later on with opengl. You could render the play field and gui to their own textures, allowing independent work on each. (Render the play field, then the gui with clear alpha where the play area is.) You could have smoke and steam partially obstruct the view using alpha on another texture.
There are a great number of possibilities that come to mind.