学习WorldWind有很长时间了,理论学习算是基本完成了。我体会是WW的学习主要分为两大步:WW框架体系学习和WW插件学习。学习WW插件逐步深入后,必然要首先学习Direct3D编程,这也算是我的经验之谈吧。今天Virtual Earth插件学习完成,也标志着我可以从WW理论转向WW实践啦。虽然我总结介绍的是Virtual Earth插件,但是希望网友阅读下面的内容前,最好能够先深入学习Direct3D编程、BMNG和Globe Icon插件的底层渲染,这些都是学习Virtual Earth的基础。
Virtual Earth插件包括以下几个类:
VirtualEarthForm 窗体类
VirtualEarthPlugin插件类,继承自Plugin(重要)
VeReprojectTilesLayer 渲染对象类,继承自Renderable Object(重要)
VeTile 瓦片对象类(真正实现大部分功能的)(重要)
Projection投影变换类(重要)
Search类
PushPin类
我们先看看VirtualEarthPlugin,所有的插件类必须继承自Plugin.cs,必须重写Load()和Unload()方法。这两个方法分别实现插件的加载和卸载。
Load()方法一般是实现添加菜单和添加工具按钮,跟前面介绍插件都很类似的,自己开发插件时模仿着这套路写就行。
public override void Load()
{
try
{
//判断当前World为Earth(注:其他星体可通过名字判断)
if (ParentApplication.WorldWindow.CurrentWorld.IsEarth)
{ //初始化VE插件控制窗体
m_Form = new VirtualEarthForm(ParentApplication);
m_Form.Owner = ParentApplication;
//添加VE插件菜单
m_MenuItem = new MenuItem("MicroSoft VirtualEarth");
m_MenuItem.Click += new EventHandler(menuItemClicked);
ParentApplication.PluginsMenu.MenuItems.Add(m_MenuItem);
//#if DEBUG
string imgPath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + "\\Plugins\\VirtualEarth\\VirtualEarthPlugin.png";
//#else
// _pluginDir = this.PluginDirectory;
// string imgPath = this.PluginDirectory + @"\VirtualEarthPlugin.png";
//#endif
if (File.Exists(imgPath) == false)
{
Utility.Log.Write(new Exception("imgPath not found " + imgPath));
}
//添加工具按钮,会出现工具栏里
m_ToolbarItem = new WorldWind.WindowsControlMenuButton(
"MicroSoft VirtualEarth",
imgPath,
m_Form);
ParentApplication.WorldWindow.MenuBar.AddToolsMenuButton(m_ToolbarItem);
base.Load();
}
}
catch (Exception ex)
{
Utility.Log.Write(ex);
throw;
}
}