Here's a few pointers that will hopefully help you on your journeys with MFD coding. Treat this as a "pay it forward" thing ... i.e. your turn to do the same for the next batch of coders in 5 years time!
1. IDE. Use a new Visual Studio Community edition (e.g. VS2015 or VS2017). This gives you the best set of features to work from - e.g. direct GitHub integration, C++ 11 support (all those threading libraries for when your code gets fancy!), and just a nice environemtn to work in.
2. GitHub. Most people have come across various types of online source code control, but VS2015 and VS2017 Community Edition makes GitHub.com a super-easy target for you to protect your source code and to allow it to live even if/when you abandon it. One of the saddest things you see on Orbiter is an awesome addon for say Orbiter 2006 with no source anywhere, and the author has left the community. Put a little GPL-3.0.txt or similar file into your source code directory, and push your code to your own public GitHub.com repo, and it will live for ever. (Inside VS2015 or VS2017, once you set up the connection to the GitHub repo .. you commit changes locally, and then sync and push it to the GitHub.com main repo, and it takes maybe 20 seconds to do. It's a life-saver if your hard drive fails, or if you need to retrace your steps back to code you had 2 weeks ago!)
3. Property Pages. Use them religiously. Have a search in this forum for how to set these up, but they make things very easy for you to switch from one version of Orbiter (e.g. O2010) to the other (e.g. O2016), and drop in debug or release settings. If you need, I'll do a play by play on how to set this up.
4. Persistence. The biggest thing to think about with an MFD is how you want to handle persistence. Let me explain: any time you change vessel, or press F8 to change cockpit view, or resize your ExtMFD, your MFD will get destroyed and recreated. If you are only calculating things in the instant you are called from the Orbiter core, then this is OK, but if you are monitoring trends (e.g. calculating rates of change), or writing files, etc, then you need a data structure that can float in memory and persist around these issues. In the general case, you could have a "global core" (persisting anything that you use across your whole MFD), a "vessel core" (persisting for each vessel that ever displays your MFD), and a "local core" (persisting local settings for your vessel and your specific MFD panel - e.g. left panel - so that page settings persist as you F3 through vessels). Fortunately - a lot of this code can be reused from other MFD's, so if you need ideas or samples, then please shout!
5. Debugs. I wished somebody told me you could debug your MFD right out of Visual Studio when I was doing my first MFD or two! I figured that the best you could get was oapiDebugString() (which writes debug data on the bottom line of your Orbiter screen), or writing diagnostic files. Don;t get me wrong - these are still great techniques, and important if you want to run things in real time, but it is great to know that you can compile in Debug mode, copy the DLL to the right modules\plugin folder, then launch Orbiter right from Visual Studio debug, and then set breakpoints, etc, in your code, and be dropped right into your code, despite not having any source code for Orbiter.exe. Who knew?! It was a revelation for me!!
6. Miscellaneous. There's awesome stuff available from Enjo (mainly) and me ... Enjo's MFD button library is awesome - allowing you to really simply set up MFD buttons, MFD page selection, continuously firing buttons and so on. Awesome stuff. Enjo also did a HUDhooking "hack" to draw graphics on the main screen (e.g. see his LaunchMFD or my RV Orientation for exploits of it). Enjo and I worked on a ModuleMessagingExt library for message passing between MFDs... e.g. to pass targeting data between MFDs or to chain together commands across a set of simpler MFD microservices. So if you want to get target data from BaseSync, TransX, Glideslope, RV Orientation, LaunchMFD, etc ... there's a way to do this and to grow the feeling of integration across MFDs. (P.s. vessel guys - you can also expose data through this mechanism, or allow programmatic interaction with your vessel if you would like.)
7. Packaging and releasing things. Obviously you will be using OrbitHangar.com, right? You just need to be very careful to set up your .zip file so that when people do a right-mouse Extract All... and select c:\Orbiter (etc...), then your zip folder structure unpacks over the top of the Orbiter distribution just nicely. It takes a few times to get this right, but it makes a big difference. Oh - talking about releasing things ... you need to make sure never to release a Debug .dll file (why? because it'll break for anyone without Visual Studio installed). You also need to think about whether to release a statically-linked runtimes .DLL (VC runtimes burnt into it), or dynamically linked (with people asking what versions of VCRUNTIME.EXE to run to install your runtime support, or complaining of error 126 in Orbiter.log, etc). Such is the life of a dev here!
8. Ask questions! This is a friendly forum, and we all want to encourage new developers to join the crew. Odds are, if you are trying to work out how to find something, then one of us has also been in your exact shoes. At least that's how I learnt from the best here, so if I can help, I'd be glad to share some knowledge.