[WorldWind学习]2.WorldWindow控件

首先查看WorldWindow 的构造函数,接着查看InitializeGraphics()函数。

 1 public WorldWindow()
 2         {
 3             this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
 4 
 5             // The m_Device3d can't be created unless the control is at least 1 x 1 pixels in size
 6             this.Size = new Size(1,1);
 7 
 8             try
 9             {
10                 // Now perform the rendering m_Device3d initialization
11                 // Skip DirectX initialization in design mode
12                 if(!IsInDesignMode())
13                     this.InitializeGraphics();//初始化设备Device
14 
15                 //Post m_Device3d creation initialization
16                 this.drawArgs = new DrawArgs(m_Device3d, this );
17                 this.m_RootWidget = new WorldWind.Widgets.RootWidget(this);
18                 this.m_NewRootWidget = new WorldWind.NewWidgets.RootWidget(this);
19 
20                 //this.m_RootWidget.ChildWidgets.Add(layerManager);
21                 DrawArgs.RootWidget = this.m_RootWidget;
22                 DrawArgs.NewRootWidget = this.m_NewRootWidget;
23 
24                 m_FpsTimer.Elapsed += new System.Timers.ElapsedEventHandler(m_FpsTimer_Elapsed);
25                 m_FpsTimer.Start();
26 
27                 TimeKeeper.Start();
28             //    WorldWind.Widgets.LayerManager layerManager = new WorldWind.Widgets.LayerManager();
29             //    m_RootWidget.ChildWidgets.Add(layerManager);
30 
31             }
32             catch (InvalidCallException caught)
33             {
34                 throw new InvalidCallException(
35                     "Unable to locate a compatible graphics adapter. Make sure you are running the latest version of DirectX.", caught );
36             }
37             catch (NotAvailableException caught)
38             {
39                 throw new NotAvailableException(
40                     "Unable to locate a compatible graphics adapter. Make sure you are running the latest version of DirectX.", caught );
41             }
42         }
View Code
 1 private void InitializeGraphics()
 2         {
 3             // Set up our presentation parameters
 4             m_presentParams = new PresentParameters();
 5 
 6             m_presentParams.Windowed = true;
 7             m_presentParams.SwapEffect = SwapEffect.Discard;
 8             m_presentParams.AutoDepthStencilFormat = DepthFormat.D16;
 9             m_presentParams.EnableAutoDepthStencil = true;
10             
11             if(!World.Settings.VSync)
12                 // Disable wait for vertical retrace (higher frame rate at the expense of tearing)
13                 m_presentParams.PresentationInterval = PresentInterval.Immediate;
14 
15             int adapterOrdinal = 0;
16             try
17             {
18                 // Store the default adapter
19                 adapterOrdinal = Manager.Adapters.Default.Adapter;
20             }
21             catch
22             {
23                 // User probably needs to upgrade DirectX or install a 3D capable graphics adapter
24                 throw new NotAvailableException();
25             }
26 
27             DeviceType dType = DeviceType.Hardware;
28 
29             foreach(AdapterInformation ai in Manager.Adapters)
30             {
31                 if(ai.Information.Description.IndexOf("NVPerfHUD") >= 0)
32                 {
33                     adapterOrdinal = ai.Adapter;
34                     dType = DeviceType.Reference;
35                 }
36             }
37             CreateFlags flags = CreateFlags.SoftwareVertexProcessing;
38 
39             // Check to see if we can use a pure hardware m_Device3d
40             Caps caps = Manager.GetDeviceCaps(adapterOrdinal, DeviceType.Hardware);
41 
42             // Do we support hardware vertex processing?
43             if(caps.DeviceCaps.SupportsHardwareTransformAndLight)
44                 //    // Replace the software vertex processing
45                 flags = CreateFlags.HardwareVertexProcessing;
46 
47             // Use multi-threading for now - TODO: See if the code can be changed such that this isn't necessary (Texture Loading for example)
48             flags |= CreateFlags.MultiThreaded | CreateFlags.FpuPreserve;
49 
50             try
51             {
52                 // Create our m_Device3d
53                 m_Device3d = new Device(adapterOrdinal, dType, this, flags, m_presentParams);
54             }
55             catch( Microsoft.DirectX.DirectXException    )
56             {
57                 throw new NotSupportedException("Unable to create the Direct3D m_Device3d.");
58             }
59 
60             // Hook the m_Device3d reset event
61             m_Device3d.DeviceReset += new EventHandler(OnDeviceReset);
62             m_Device3d.DeviceResizing += new CancelEventHandler(m_Device3d_DeviceResizing);
63             OnDeviceReset(m_Device3d, null);
64         }

控件重要的方法:

OnApplicationIdle函数定义:
public void OnApplicationIdle(object sender, EventArgs e)//The world render loop.实现世界的渲染循环
OnPaint函数定义:
protected override void OnPaint(PaintEventArgs e)    // Occurs when the control is redrawn and m_isRenderDisabled=true.
protected override void OnMouseWheel(MouseEventArgs e)  //处理鼠标滚轮事件
protected override void OnKeyDown(KeyEventArgs e)  //重载处理键盘按下的事件
protected override void OnKeyUp(KeyEventArgs e)     //重载处理键盘弹起事件
protected override void OnMouseDoubleClick(MouseEventArgs e)
protected override void OnMouseUp(MouseEventArgs e)

控件几个重要的属性和字段:

  private Device m_Device3d;
  private DrawArgs drawArgs;
  private World m_World;
  private Cache m_Cache;
  private Thread m_WorkerThread;

posted @ 2013-03-28 15:25  太一吾鱼水  阅读(498)  评论(0编辑  收藏  举报