在WorldWindow定制控件是从Control类派生出来的,需要自己操纵GDI+绘制所需要的界面效果,比较耗费精力(区别于用户控件UserControl,也叫组合控件,大多是对.NET工具箱提供的默认基础控件进行的组合和轻量级的改变,实现起来比较简单)。为了明确定制控件Control和用户控件UserControl之间的体系关系,此处给出了Control类继承层次结构(源自MSDN)以及WorldWindow类的类图:
需要特别说明的是:在WorldWindow中星球球体的渲染和经纬网格的渲染时分别绘制的,星球由类World表示,经纬网格由类LatLongGrid表示。
WorldWindow定制控件的主要字段、方法和属性有:
private Device m_Device3d;//定制窗口绑定的绘制设备
private PresentParameters m_presentParams;//Direct3D绘制呈现参数
private DrawArgs drawArgs; //绘制参数
private World m_World; //定制窗口中需要绘制的星球
private Cache m_Cache;// //定制窗口中需要绘制的星球的缓冲区
private Thread m_WorkerThread;//后台工作线程
private bool showDiagnosticInfo; //是否显示诊断信息
private string _caption = "";//标题
private long lastFpsUpdateTime; //最后一次Fps的更新时间
private int frameCounter; //帧数
private float fps;//每秒渲染的帧速率
private string saveScreenShotFilePath; //保存截屏文件路径
private ImageFileFormat saveScreenShotImageFileFormat = ImageFileFormat.Bmp; //保存截屏文件格式
private bool m_WorkerThreadRunning;//判断工作线程是否正在运行
private LayerManagerButton layerManagerButton; //图层管理器按钮
private MenuBar _menuBar = new MenuBar(MenuAnchor.Top, 90);
private bool m_isRenderDisabled; // True when WW isn't active - CPU saver
private bool isMouseDragging; //是否正在用鼠标拖拽场景
private Point mouseDownStartPosition = Point.Empty; //鼠标按下时的起始位置
private bool renderWireFrame; //是否以线框模式渲染
private System.Timers.Timer m_FpsTimer = new System.Timers.Timer(250);
public void Goto( WorldWind.Net.WorldWindUri uri )转到URI连接。
public void GotoLatLon(double latitude, double longitude, double heading, double altitude, double perpendicularViewRange, double tilt)移动到指定的经纬度位置,内部实际是通过调用this.drawArgs.WorldCamera.SetPosition(latitude, longitude, heading, altitude, tilt);函数实现具体功能。
public void SaveScreenshot(string filePath)对当前场景截屏保存为图片文件。
public void OnApplicationIdle(object sender, EventArgs e)星球的消息循环,在WorldWind.cs文件的主函数static void Main(string[] args)中被调用。其内部调用了WorldWindow类的Render()函数。
private static bool IsAppStillIdle判断程序是否空闲,如果控件返回真。
protected override void OnPaint(PaintEventArgs e),任何继承自Control类的定制控件均需要重载Control类的函数,当窗口需要重新绘制时被调用。