WorldWind源码剖析系列:窗口定制控件类WorldWindow

在WorldWindow定制控件是从Control类派生出来的,需要自己操纵GDI+绘制所需要的界面效果,比较耗费精力(区别于用户控件UserControl,也叫组合控件,大多是对.NET工具箱提供的默认基础控件进行的组合和轻量级的改变,实现起来比较简单)。为了明确定制控件Control和用户控件UserControl之间的体系关系,此处给出了Control类继承层次结构(源自MSDN)以及WorldWindow类的类图:

 WorldWind源码剖析系列:窗口定制控件类WorldWindow     WorldWind源码剖析系列:窗口定制控件类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类的函数,当窗口需要重新绘制时被调用。

你可能感兴趣的:(window)