继《C#调用GoogleEarth Com API》,我又带给大家第二篇文章。这一篇文章在第一篇的基础上,展示如何调用Windows API隐藏GoogleEarth的界面,并将GoogleEarth的地图显示在自定义的窗体上。废话少说,直接上代码。
1、主窗口代码:
// 功能:GE实例(二)
// 描述:GE COM API 网址:http://earth.google.com/comapi/index.html
// 作者:温伟鹏
// 日期:2009-02-08
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using EARTHLib;
namespace GEDemo
{
public partial class Form2 : Form
{
/// < summary>
/// 用来关闭GoogleEarth的消息定义
/// < /summary>
static readonly Int32 WM_QUIT = 0x0012;
private IntPtr GEHWnd = (IntPtr)5;
private IntPtr GEHrender = (IntPtr)5;
private IntPtr GEParentHrender = (IntPtr)5;
/// < summary>
/// 定义GE应用程序类
/// < /summary>
private ApplicationGEClass GeApp;
public Form2()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!this.DesignMode)
{
GeApp = new ApplicationGEClass();
GEHWnd = (IntPtr)GeApp.GetMainHwnd();
NativeMethods.SetWindowPos(GEHWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0,
NativeMethods.SWP_NOSIZE + NativeMethods.SWP_HIDEWINDOW);
GEHrender = (IntPtr)GeApp.GetRenderHwnd();
GEParentHrender = (IntPtr)NativeMethods.GetParent(GEHrender);
NativeMethods.MoveWindow(GEHrender, 0, 0, this.Width, this.Height, true);
NativeMethods.SetParent(GEHrender, this.Handle);
}
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
NativeMethods.PostMessage(GeApp.GetMainHwnd(), WM_QUIT, 0, 0);
}
}
}
2、NativeMethods类定义:
// 功能:Windows API调用
// 描述:大家可以参照MSDN
// 作者:温伟鹏
// 日期:2009-02-08
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace GEDemo
{
public class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, UInt32 uflags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam);
#region 预定义
public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
public static readonly IntPtr HWND_TOP = new IntPtr(0);
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
public static readonly UInt32 SWP_NOSIZE = 1;
public static readonly UInt32 SWP_NOMOVE = 2;
public static readonly UInt32 SWP_NOZORDER = 4;
public static readonly UInt32 SWP_NOREDRAW = 8;
public static readonly UInt32 SWP_NOACTIVATE = 16;
public static readonly UInt32 SWP_FRAMECHANGED =32;
public static readonly UInt32 SWP_SHOWWINDOW = 64;
public static readonly UInt32 SWP_HIDEWINDOW = 128;
public static readonly UInt32 SWP_NOCOPYBITS = 256;
public static readonly UInt32 SWP_NOOWNERZORDER = 512;
public static readonly UInt32 SWP_NOSENDCHANGING = 1024;
#endregion
public delegate int EnumWindowsProc(IntPtr hwnd, int lParam);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static IntPtr GetParent(IntPtr hWnd);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);
public static int GW_CHILD = 5;
public static int GW_HWNDNEXT = 2;
}
}
3、执行效果:
现在,调用Windows API隐藏GoogleEarth界面的效果就达到了。
【编辑推荐】