Hello Greg,
Concerning your first question, an EVENT_COMMIT should be sent to the graph control after the user finishes moving an annotation. Also, an EVENT_VAL_CHANGED is sent continuously while the annotation is being moved.
The main problem is how to distinguish which annotation was moved. Unfortunately, unlike graph cursors, events generated by annotations are not properly setting the eventdata1 parameter with the index of the annotation that caused the event. The fact that eventdata1 isn't set is considered buggy behavior and will be changing in the next version of CVI. Until it changes, there is a kludgy workaround you can use: assuming that your graph doesn't already have one or more graph cursors, if you create one graph cursor, and make it both transparent and disabled, so that it's effectively invisible and unintrusive, then when an annotation is moved, eventdata1 will contain the annotation index -- but you must subtract 1 from the value that is received (the 1 refers the cursor that you created). Keep in mind that this behavior will be changed on any version of CVI after 8.1.1 -- after it changes, you will no longer need to create a graph cursor, and you won't have to subtract anything (you can use the _CVI_ macro, to ensure that your code won't break when a new version of CVI is introduced).
As for your second question, although you have the ability to constrain individual annotations to always stay within the view (use SetAnnotationAttribute with ATTR_ANNOTATION_CAPTION_ALWAYS_IN_VIEW), there is no way to constrain it in Y but not in X. So your only recourse would be to manually capture the zoom events (EVENT_ZOOM) and then shift the annotations programmatically. (I know, it's kind of a pain when you have so many...)
Hope this helps,
Luis