Hey, James, thanks for looking into it!
MajorTom,
I may have found a little bug. In DGIV, safe mode, power and hud turned off. HUD refuses to turn on. If the mission is saved with HUD on, every thing works fine. Can someone confirm this.
I can

. Yes, that's a bug and I already know why it happens. Right now you can simply switch to another vessel, then switch back and it should reapeear.
Enjo,
And please tell me how you get on with Launch MFD - if its compass gets disabled.
The funniest part is that it's not a complete suppression but rather a 50/50 probability. And the explanation is quite long:
Back during development I came up to a conflict with LaunchMFD. Vel_hud appeared to work fine just until I switch focus to another vessel, and then switch back to the first one. The debugger pops up with a stack overflow exception inside launchmfd.dll. What the hell??
I realized, that apparently I'm not alone that clever, and LaunchMFD does the hijacking too in order to draw its launch compass on the HUD. And as far as I could guess (I didn't know that LaunchMFD sources were available up until recently), the LaunchMFD does exactly the same thing as my addon - patches a new focus vessel's VMT in opcFocusChanged() while returning back the original address for the vessel that loses the focus.
It appears, Orbiter manages its addons by putting them in a kind of a list. When a simulation event happens, like the user changes ships, Orbiter calls opcFocusChanged() sequentially for all addons in the list. And the order of the sequence doesn't change.
So here's what happens (let's assume that opcFocusChanged() for LaunchMFD was called first):
1. LaunchMFD hijacks vessel's clbkDrawHUD() and replaces it with an impostor, saving the original address somewhere.
2. vel_hud hijacks LaunchMFD's impostor from the vessels VMT (thinking it's the original functions) and replaces it with its own impostor, saving the old value somewhere.
2.5. Orbiter calls vessel->clbkDrawHUD(). It calls into the vel_hud's impostor who calls the LaunchMFD's impostor (thinking it's the original) and LaunchMFD calls the actual original clbkDrawHUD().
2.9. All's fine until
3. user changes ships.
4. LaunchMFD returns the original address of clbkDrawHUD() to the old vessel's VMT.
5. vel_hud returns the LaunchMFD's impostor to the old vessel's VMT, happily thinking that it patches back the original function address. (This is because the opcFocusChanged() is called for each addon every time in the same order.)
6-9. User plays with a new vessel then
10. switches back to the old vessel.
11. LaunchMFD hijacks clbkDrawHUD(), but it's not real clbkDrawHUD(), it's already an impostor. And if you recall p.5, it's no one other than LaunchMFD's impostor! So it saves the impostor's address as the original.
12. vel_hud hijacks LaunchMFD's impostor and replaces it with its own impostor.
12.5. Orbiter calls vessel->clbkDrawHUD(). It calls into the vel_hud's impostor which in turn calls the LaunchMFD's impostor (thinking it's the original) and LaunchMFD tries to call the original clbkDrawHUD() through previously saved pointer. Except that now the saved pointer points to LaunchMFD's own impostor saved in p.11. Oops, infinite recursion(tm).
12.9. Oribiter crashes and burns with a stack overflow in LaunchMFD.
I repeated the experiment, but this time I put vel_hud on top of the list in orbiter.cfg, and voila! I got a HUD to disappear completely, narrowly avoiding the stack overflow just because I already had a simple check in place that tested for the recursion before restoring the VMT pointer and calling original function.
I resolved the issue by adding more kludges, like constant patching in opcPostStep() and re-patching back in vel_hud's clbkDrawHUD(). As we can see, it's not 100% perfect. If the HUD isn't drawn this frame for some (legitimate) reason -- things happen exactly as MajorTom described: no more HUDs.
Oh, and that 50/50 comes from the order in which the addons' opcFocusChanged() functions are called: the last one to hijack the VMT entry 11 gets everything.
So right now I'm trying to invent another "clever" hack that could solve the compatibility problem with LaunchMFD.