Thats ok, youre not an idiot at all - I wasnt sure how much info you wanted, so I just gave you a kinda general (and admittedly complex) example.
'_windowThread' is just the separate Thread I create to run the windows Form object in (_gameWindow). Its not necessary to keep hold of the thread, but I do because I abort it when my game is over (when the Mogre thread finishes).
The reason I create another thread in the first place is because winforms takes over the thread when you call Application.Run(). It also fires frame events like the mogre root does, but I didnt want to rewrite my whole program to depend on the winform, so I decided to put all the windows forms stuff in another thread (It also was pretty fun

)
Here is what happens in the code below:
1. (Not Shown) Declare a class that derives from Form (easy, right click on project, add windows form)
2. Create a new thread, then pass to that thread a (parameterless, void-return) method (ive used a lambda method in this case but you can use a normal method) that you want to run on the thread. What i've passed it is some commands that create my windows form, and then start executing it using Application.Run(). Note: on this thread, execution basically stops at that line, i.e. statements that come after Application.Run() wont get executed until the winform that it is running terminates.
3. After calling _windowThread.Start(), you have a thread running a pretty windows form. Now what you want to do is use the 'handle' of the
window as the render target mogre uses. What Ive done in the next little bit is a little loop that spin-waits (i.e. checks condition, then if true, waits for a bit, repeat) until the windows form is created. I do this because I was getting errors where it was trying to get the handle of the window before it was created (code was too fast or something).
4. So now that you know the windows form is created, we want to retrieve the handle from it. The key statement is this: "windowHandle = _gameWindow.Handle.ToString();". However you cannot just call that normally, as you will get an exception scolding you about screwing with another thread's business. To get around this, we
invoke that command on the winform we created, which will run that invocation on its thread. This is really important. We can do this because winforms provides the Invoke and BeginInvoke functions (as well as a few others - its a useful interface that windows forms implements) which makes it really easy for us to call commands on its thread. Im not sure if you know already how it works, so Ill just give you a quick rundown (its worth looking up). Invoke() takes a System.Windows.Forms.MethodInvoker delegate, which it then well...invokes

. You can see in the code how ive done it inline. You will use this alot in your program.
5. But anyway, now that we have the windowHandle (and we know we have it, because we used Invoke instead of BeginInvoke - look them up), we want to give it to Mogre. In the ogre documentation, look at Ogre::Root, and somewhere there they have a big list of all the parameters you can pass to Root.CreateRenderWindow() as settings. One of the settings is "externalWindowHandle", which is exactly what we want. After creating a NameValuePairList with the handle in it, we go ahead and create our RenderWindow object. You can see that ive passed 0s as the 'width' and 'height' of CreateRenderWindow - this is because mogre will now take all its dimensions from the window you have given it.
And there you have it, a nice window with all your fancy controls in it, rendering Mogre in the background!
Additional Notes: You can also use a Panel's handle to render in - which is how you create fancy movable viewports. but
Important: for MOIS input, you can only use the
window's handle.
Hope that helps - If you want me to create a simple example project, id be happy to
//Create a window using winforms, to embed mogre in
_gameWindow = null;
string windowHandle = null;
//_windowThread is actually declared as a class variable, but ive put 'Thread' here jsut so youre clear (its in System.Threading or something)
Thread _windowThread = new Thread(() =>
{
//GameWindow is a windows form class I made (just a plain window)
_gameWindow = new GameWindow();
Application.Run(_gameWindow);
});
_windowThread.Start();
while (_gameWindow == null || _gameWindow.Created == false) //spin wait
Thread.Sleep(10);
_gameWindow.Invoke((MethodInvoker)
delegate{ windowHandle = _gameWindow.Handle.ToString(); });
var settings = new NameValuePairList();
settings["externalWindowHandle"] = windowHandle;
_root.Initialise(false, WINDOW_TITLE);
_window = _root.CreateRenderWindow(WINDOW_TITLE, 0, 0, true, settings); //size of window taken from settings