I had some thoughts about loading screens too.
In general, putting up a simple bitmap before starting loading is simple enough. And as slicer said, there's a couple of ways to do a loading bar.
Since I do my own loading, I have the following idea:
I assume that only 1 and only 1 loading screen will be shown at a time. This meant that I can stick it as a globally accessible property in my singleton interface class. So, to access the loading screen, I would do Interface::I().GetLoadingScreen(); - which would return me the main loading screen. From there, I can then proceed to set its properties like background image, percent loaded etc.
The good thing about this is that since I have my interface drawing setup, i don't have the worry about drawing the screen at all - it's automatically done by the interface. I just have to call a Show/Hide loading screen function to make it show / hide.
Having a loading screen like that also allows me to write code in the Interface to automatically disable all input whenever the loading screen is shown - so that's another thing I don't have to worry about when loading stuff, since it will be done when I tell the UI to show the loading screen.
The requirement for this, however, is that I must put all my loading into separate threads. The basic flow in my main thread (that handles drawing / updating / input) is like this:
1. User triggers loading
2. I start a new thread to do my loading, so I don't block the main thread.
And in the loading thread:
1. Set UI to show loading screen
2. Set the background graphic / initial percent loaded (usually 0%)
3. Do my loading here, while periodically updating the percent loaded based on what I'm loading
4. Set UI to hide the loading screen.
The UI will automatically handle displaying the loading screen, blocking all user input and updating the loading bar on the screen.
Normally with multi-threading you'd need to have a mutex on the values you're changing, but in this case, I think I can get away without any, since there's nothing critical there, and the UI will only read the values, while the loading thread will only write them.