Question: I'm just curious as to to how to implement multi-threading without using a Windows API WaitFor\* function that stops the program until the thread has returned. What's the point of using threads if they stop the main application from being resized or moved etc.?

Is there any form of windows messaging with threading, which will allow me to call my thread function and then return, and handle the return values of the thread when it finishes running?

Answer: 
You can use `MsgWaitForMultipleObjectsEx` to wait for the thread to finish and also process messages at the same time.
Have a look at std::thread, boost::thread, just::thread, for multithreading in general for c++.

But about Windows messaging win32 and MFC, the MSDN states **explicitely** that **it is not multithread, it is monothread**. ( Undefined behaviour is to be expected if multithreading is used)

For asynchronous message emited in other thread than the main application window thread, you should use ::PostMessage(), that will insert message events in the monothread message pump of the mono threaded window.