• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

EmbeddingGoogleEarthinaC#Application(转载)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
By Joseph Armbruster | 8 Dec 2008
How to embed the Google Earth scene in a C# application.
 

Introduction

If you're interested in utilizing the Google Earth viewer as a control in a custom application, then continue reading. There are quite a few links around the Internet that provide information as to how to add references to your project, create a ApplicationGE, and control the Google Earth application. However, most of these tutorials do not focus on the details of embedding Google Earth in an application. That's what I will focus on here. From now on, GE means Google Earth.

The Code

You'll probably start off on your embedding adventure much like I did, with:

Copy Code
new ApplicationGEClass();

If the GE process already exists, we will obtain a reference to it; if not, a new process will be created, and you would see the GE logo flash on the screen while loading. You will then see the main Google Earth screen with the embedded viewer. Since we are interested in embedding GE, we are not interested in having the main screen around, so we hide it!

Copy Code
0);

For all intensive purposes, we now have an empty screen. What we'd like to do next is embed the scene that GE renders into our application. We accomplish this by setting the render Hwnds parent to that of the window we would like to render to:

Copy Code
this.Handle.ToInt32());

In the example above, 'this' is a Windows Form. The end result, if you perform these same steps, should look similar to the image below, although I do warn that results may vary :-)

You will notice that resizing the window has no effect on the scene. If you plan on embedding GE in an application for any useful purposes, you'll most likely need it to respond to resizing. I spent a bit of time sniffing into the events that were passed to the scene when I performed re-size of the main GE application window. This led me to a special event, WM_QT_PAINT, in addition to a sequence of others. It took a bit of tinkering to get it all right, but this appeared to work for me:

Copy Code
0);
PostMessage(ge.GetMainHwnd(), WM_QT_PAINT, 0, 0);
SetWindowPos( ge.GetMainHwnd(), HWND_TOP, 0, 0, (int)this.Width, 
             (int)this.Height, SWP_FRAMECHANGED);
SendMessage(ge.GetRenderHwnd(), WM_COMMAND, WM_SIZE, 0);

This should allow the scene to adjust according to the parent form's size. I bundled this up into a method named "ResizeGoogleControl", and called it after SetParent and within my Form_Resize event. The results are illustrated in this image:

The Example

I slapped together a test app that you are welcome to use for reference. If you have any comments or suggestions, be sure to send me an email or add a comment. Create a new C# project in Visual Studio and replace the Form1.cs code with this:

Copy Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

using EARTHLib;

namespace resize_google_earth
{

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    private static extern int SetParent(
    int hWndChild,
    int hWndParent);

    [DllImport("user32.dll")]
    private static extern bool ShowWindowAsync(
    int hWnd,
    int nCmdShow);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool PostMessage(
    int hWnd,
    uint Msg,
    int wParam,
    int lParam);

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    private static extern bool SetWindowPos(
    int hWnd,
    int hWndInsertAfter,
    int X,
    int Y,
    int cx,
    int cy,
    uint uFlags);

    [DllImport("user32.dll")]
    private static extern int SendMessage(
    int hWnd,
    uint Msg,
    int wParam,
    int lParam);

    private const int HWND_TOP = 0x0;
    private const int WM_COMMAND = 0x0112;
    private const int WM_QT_PAINT = 0xC2DC;
    private const int WM_PAINT = 0x000F;
    private const int WM_SIZE = 0x0005;
    private const int SWP_FRAMECHANGED = 0x0020;

    public Form1()
    {
        InitializeComponent();

        ge = new ApplicationGEClass();

        ShowWindowAsync(ge.GetMainHwnd(), 0);
        SetParent(ge.GetRenderHwnd(), this.Handle.ToInt32());
        ResizeGoogleControl();
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        ResizeGoogleControl();
    }

    private void ResizeGoogleControl()
    {
        SendMessage(ge.GetMainHwnd(), WM_COMMAND, WM_PAINT, 0);
        PostMessage(ge.GetMainHwnd(), WM_QT_PAINT, 0, 0);

        SetWindowPos(
        ge.GetMainHwnd(),
        HWND_TOP,
        0,
        0,
        (int)this.Width,
        (int)this.Height,
        SWP_FRAMECHANGED);

        SendMessage(ge.GetRenderHwnd(), WM_COMMAND, WM_SIZE, 0);
    }

    private EARTHLib.ApplicationGE ge = null;
}
}
 
转载自:http://www.codeproject.com/KB/miscctrl/google_earth_embed.aspx

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c#中Dictionary、ArrayList、Hashtable和数组Array的区别是什么?发布时间:2022-07-13
下一篇:
C#中字符串的加密发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap