繼《C#調用GoogleEarth Com API開發(一)》,我Neil又帶給大家第二篇文章。這一篇文章在第一篇 的基礎上,展示如何調用Windows API將GoogleEarth的界面隱藏掉,並將GoogleEarth的地圖顯示在自定 義的窗體上。廢話少說,直接上代碼。
1、主窗口代碼:
1: // 功能:GE實例(二)
2: // 描述:GE COM API 網址:http://earth.google.com/comapi/index.html
3: // 作者:溫偉鵬
4: // 日期:2009-02-08
5:
6: using System;
7: using System.Collections.Generic;
8: using System.ComponentModel;
9: using System.Data;
10: using System.Drawing;
11: using System.Text;
12: using System.Windows.Forms;
13: using EARTHLib;
14:
15: namespace GEDemo
16: {
17: public partial class Form2 : Form
18: {
19: /// <summary>
20: /// 用來關閉GoogleEarth的消息定義
21: /// </summary>
22: static readonly Int32 WM_QUIT = 0x0012;
23:
24: private IntPtr GEHWnd = (IntPtr)5;
25: private IntPtr GEHrender = (IntPtr)5;
26: private IntPtr GEParentHrender = (IntPtr)5;
27: /// <summary>
28: /// 定義GE應用程序類
29: /// </summary>
30: private ApplicationGEClass GeApp;
31:
32: public Form2()
33: {
34: InitializeComponent();
35: }
36:
37: protected override void OnLoad(EventArgs e)
38: {
39: base.OnLoad(e);
40:
41: if (!this.DesignMode)
42: {
43: GeApp = new ApplicationGEClass();
44:
45: GEHWnd = (IntPtr)GeApp.GetMainHwnd();
46:
47: NativeMethods.SetWindowPos(GEHWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0,
48: NativeMethods.SWP_NOSIZE + NativeMethods.SWP_HIDEWINDOW);
49:
50: GEHrender = (IntPtr)GeApp.GetRenderHwnd();
51: GEParentHrender = (IntPtr)NativeMethods.GetParent (GEHrender);
52:
53: NativeMethods.MoveWindow(GEHrender, 0, 0, this.Width, this.Height, true);
54:
55: NativeMethods.SetParent(GEHrender, this.Handle);
56: }
57: }
58:
59: protected override void OnClosing(CancelEventArgs e)
60: {
61: base.OnClosing(e);
62:
63: NativeMethods.PostMessage(GeApp.GetMainHwnd(), WM_QUIT, 0, 0);
64: }
65: }
66: }
2、NativeMethods類定義:
1: // 功能:Windows API調用
2: // 描述:大家可以參照MSDN
3: // 作者:溫偉鵬
4: // 日期:2009-02-08
5:
6: using System;
7: using System.Collections.Generic;
8: using System.Text;
9: using System.Runtime.InteropServices;
10:
11: namespace GEDemo
12: {
13: public class NativeMethods
14: {
15: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
16: public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, UInt32 uflags);
17:
18: [DllImport("user32.dll", CharSet = CharSet.Auto)]
19: public static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam);
20:
21: #region 預定義
22:
23: public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
24: public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
25: public static readonly IntPtr HWND_TOP = new IntPtr(0);
26: public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
27: public static readonly UInt32 SWP_NOSIZE = 1;
28: public static readonly UInt32 SWP_NOMOVE = 2;
29: public static readonly UInt32 SWP_NOZORDER = 4;
30: public static readonly UInt32 SWP_NOREDRAW = 8;
31: public static readonly UInt32 SWP_NOACTIVATE = 16;
32: public static readonly UInt32 SWP_FRAMECHANGED = 32;
33: public static readonly UInt32 SWP_SHOWWINDOW = 64;
34: public static readonly UInt32 SWP_HIDEWINDOW = 128;
35: public static readonly UInt32 SWP_NOCOPYBITS = 256;
36: public static readonly UInt32 SWP_NOOWNERZORDER = 512;
37: public static readonly UInt32 SWP_NOSENDCHANGING = 1024;
38:
39: #endregion
40:
41: public delegate int EnumWindowsProc(IntPtr hwnd, int lParam);
42:
43: [DllImport("user32", CharSet = CharSet.Auto)]
44: public extern static IntPtr GetParent(IntPtr hWnd);
45:
46: [DllImport("user32", CharSet = CharSet.Auto)]
47: public extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
48:
49: [DllImport("user32", CharSet = CharSet.Auto)]
50: public extern static IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
51:
52: [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
53: public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);
54:
55: public static int GW_CHILD = 5;
56: public static int GW_HWNDNEXT = 2;
57: }
58: }
3、執行效果: