在应用程序的集成过程中,有时候需要WinForm应用程序和Javascript程序进行交互。比如说:应用程序是一个综合调度系统,在整个综合调度系统中,要实现定位,显示地图。综合调度平台的大部分功能都是使用WinForm实现的;但是定位和地图部分都不是自己开发的需要使用第三方接口,实现地图的展示,而第三方的接口使用的是Javascript实现的。这种情况有一下两种方法解决:

    1,浏览器显示地图,WinForm实现综合调度台的其他功能,使用socket通信方式或者其他方式实现web浏览器和综合调度台之间的一种交互。

    2,使用WinFormJS之间的直接交互。

    以上两种方法:第一种方法明显的缺点就是整个综合调度台的风格不一致,而且在开发过程中,调试麻烦,调试过程受网络的影响较大。第二种方法却从根本上克服了以上所有缺点。

    如何实现WinFormJavascript之间的交互成为解决这个问题的核心问题。所谓交互就是WinForm的应用程序能够调用Javascript的程序接口,同时JS的程序也能够调用WinForm的应用程序接口。

这里用百度地图API做个例子:

(1)首先创建一个网页命名为:myMap.html  假设该网页的路径为:D://myMap.html

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    
<title>百度地图的Hello, World</title>
    
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.2&services=true"></script>
</head>
<body>
    
<div style="width: 600px; height: 400px" id="container"></div>
</body>
</html>
<script type="text/javascript">   
    
function myMap(x,y) {
        
var map = new BMap.Map("container"); // 创建Map实例
        var point = new BMap.Point(x, y);// 创建点坐标
        map.centerAndZoom(point, 15);   // 初始化地图,设置中心点坐标和地图级别。
    }
</script>

   

    (2)创建一个WinForm应用程序,在应用程序窗体上添加一个浏览器控件:webBrowser1 

    (3)WinForm的窗体Form1中添加一个button按钮。Button1用来测试调用JS事件。

         后台代码如下:

注意: 类定义前需要加上下面两行,否则调用失败!并且要在project中添加System.Security的引用

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]

[System.Runtime.InteropServices.ComVisibleAttribute(true)]

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using System.Security.Permissions;
10 
11 namespace WindowsFormsApplication1
12 {
13     [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
14     [System.Runtime.InteropServices.ComVisibleAttribute(true)]
15 
16     public partial class Form1 : Form
17     {
18         public Form1()
19         {
20             InitializeComponent();
21             this.webBrowser1.Url = new Uri(@"D:\myMap.htm");
22             webBrowser1.ObjectForScripting = this;
23         }
24 
25         private void button1_Click(object sender, EventArgs e)
26         {
27             webBrowser1.Document.InvokeScript("myMap"new object[]{ 121.479922,31.2391 });
28         }
29     }
30 }

 

 

 

 

 

 

posted on 2011-08-02 17:14  赤色彗星  阅读(1314)  评论(0编辑  收藏  举报