WPF/ArcGIS Engine三维开发和EVC3/4升级到VS项目建议(转)
系统环境:Windows 7 专业版,Visual Studio 2010,ArcGIS Engine 9.3
1.创建项目
创建一个WPF的项目,必须选择.Net framework 3.5(AE9.3不支持.Net4.0),添加引用:
ESRI.ArcGIS.3DAnalyst
ESRI.ArcGIS.AxControls
ESRI.ArcGIS.Carto
ESRI.ArcGIS.Controls
ESRI.ArcGIS.Display
ESRI.ArcGIS.Geometry
ESRI.ArcGIS.GlobeCore
ESRI.ArcGIS.Output
ESRI.ArcGIS.System
ESRI.ArcGIS.SystemUI
VS08可以在.Net选项卡下面找到所有引用,但10则只能去ESRI安装目录下找
2.界面
把缺省标题MainWindow改掉,分割主窗体中的Grid为左右两部分,两边各放置一个WindowsFormsHost,用于承载AE的控件。
打开XAML视图,
在顶部引入AE控件的命名空间,名字随意
xmlns:esri="clr-namespace:ESRI.ArcGIS.Controls;assembly=ESRI.ArcGIS.AxControls"
编辑两个WindowsFormsHost,添加两个控件
<WindowsFormsHost Margin="10" >
<esri:AxTOCControl x:Name="toc" Dock="Fill" />
</WindowsFormsHost><WindowsFormsHost Grid.Column="1" Margin="10" >
<esri:AxSceneControl x:Name="scene" Dock="Fill" />
</WindowsFormsHost>

3.代码
AE的程序需要Liscene才能启动,通常的办法是在窗体上放置一个LicenseControl。但对于WPF,这个办法行不通。
在App.xaml.cs,App类下建一个构造方法
public App(){AoInitialize aoi = new AoInitializeClass();//Additional license choices can be included here.esriLicenseProductCode productCode =esriLicenseProductCode.esriLicenseProductCodeEngine;if (aoi.IsProductCodeAvailable(productCode) ==esriLicenseStatus.esriLicenseAvailable){aoi.Initialize(productCode);}}
程序启动后,绑定TOC到Scene,并加载地图
private void Window_Loaded(object sender, RoutedEventArgs e){this.toc.SetBuddyControl(this.scene);//绑定Toc到Scenethis.scene.LoadSxFile("******");//加载场景this.scene.Navigate = true;//启用Navigatethis.scene.Update();}
OK,F5启动看下效果 
最后,请同样装了64位Windows的朋友们,再做下面一个步骤:项目->WpfScene属性->生成,把目标平台设置成x86。只因为AE还没有支持64位,令人失望的是,最新的ArcGIS 10依然没有。 
EVC3/4项目升级到Visual Studio项目的一些建议
大家都在忙着研究WP7了,每天在园子里有好多精彩的文章出现。这几天受朋友的委托,帮忙把他手头的一个项目进行升级。情况大概是这样的:项目是用EVC
3来开发的,一开始运行在PocketPC 2002上(估计是很久以前的事情了),随着操作系统版本的更新,该程序已经不能运行在Windows
Mobile 6.5平台上了。其实,按照微软官方的说法,EVC 4已经不能开发Windows Mobile
6.0以上的应用程序了,取而代之的是使用Visual Studio 2005/2008。自己的电脑上已经安装了Visual Studio
2008,所以就用这个工具来升级项目吧。下面就记录一下我升级的过程,其中碰到的问题,以及解决的方法,希望能够给后来人留下点信息,少走点弯路。
1. 使用Visual Studio 2008自动升级项目
点击EVC项目中的.vcp文件,Visual Studio 2008就会弹出对话框,然后进行升级,如下图所示:


一路Next以后,升级完成,并给出升级报告,会有Errors或者是Warnings,

2. 处理error C2440: 'static_cast' : cannot convert from 'void (**)(WPARAM,LPARAM)' to 'LRESULT (** )(WPARAM,LPARAM)
这个错误比较常见,处理方法也可以在其中找到提示,只要找到对应的afx_msg
void (**)(WPARAM,LPARAM),改成:afx_msg LRESULT (**
)(WPARAM,LPARAM)就可以了。注意的是要在头文件和.cpp文件中都进行修改,使得其一致。同时,在函数体中,进行return相应的值。
因为需要返回LRESULT值。
3. 处理编译错误error C2065: 'i' : undeclared identifier
原因:是由于存在以下的代码段:
for (int i = 0; i < MAX_LEN; i ++)
{
//……
}
for (i = 0; i < MAX_NUM; i ++)
{
//……
}
对于evc离开循环后,循环变量仍然有效,并且仍可以使用,但是在VS2005下是不行的,由此可见VS2005对变量的定义与审查更为严格,还有就是对数组越界问题也比EVC来的强。
解决方法:(不能完全相信编译器,也不能把所有的语法检查都丢给编译器)
int i = 0;
for (i = 0; i < MAX_LEN; i ++)
{
//……
}
for (i = 0; i < MAX_NUM; i ++)
{
//……
}
4. 处理fatal error RC1015: cannot open include file 'wceres.rc'.
这个错误可以进行如下处理:右击项目资源 (RC) 文件,选择“查看代码”,然后注释掉以下行: //#include "wceres.rc"

5. 处理Unable to Start Program ‘*****’
编译通过,想下载调试的时候,出现这个问题。解决方法:在工程属性—〉General—〉Project Defaults –〉Use MFC
中,把Use MFC in a shared DLL 改为 Use MFC in a static DLL ,如下图所示:

6. 处理Unhandled Expection at ***:Access Violation reading location***

这类错误只能仔细逐步调试,准确定位以后,才能解决。以我为例,这个异常出现在winmain.cpp中,

原因是InitInstance()返回不成功,于是我再进入InitInstance函数查看。发现里面的domodal模式对话框居然返回失败。

这让我感觉有点摸不着头脑了,不过收获就是定位到了建立模式对话框出错这里。继续查找资料,起初是怀疑类似dll加载是否有问题,但是项目里面并没有加载
相应的dll。因此这个可能排除掉了。后来在msdn英文论坛上找到了一些蛛丝马迹,还是在项目的资源文件上出了问题,默认情况下,Embedded
Visual C++ 4.0 版会将 MFC Pocket PC 应用程序的对话框样式设置为 DS_MODALFRAME,但是MFC 8.0 不支持此样式。解决方法,打开项目资源文件:**.rc,定位到对话框资源,对风格进行修改:

WPF/ArcGIS Engine三维开发和EVC3/4升级到VS项目建议(转)的更多相关文章
- WPF & ArcGIS Engine三维开发入门攻略
原文 http://www.cnblogs.com/Realh/archive/2010/12/14/1906112.html 前些日子在做ESRI的开发大赛,从刚开始接触ArcGIS Engine( ...
- ArcGIS Engine三维动画开发 来自:http://www.iarcgis.com/?p=826
ArcGIS Engine 三维开发 来自:http://www.iarcgis.com/?p=826 在三维中,经常使用的一个功能就是播放动画,也就是我们要对一条动画轨迹进行播放,而在ArcGIS ...
- wpf arcgis engine 当前没有或未启用Spatial Analyst许可解决办法
用wpf 在做叠加分析时 遇到了一个错误:“ERROR 010096:当前没有或未启用Spatial Analyst许可”:在环境中把这个Spatial Analyst扩展功能给勾了也不能解决,现在把 ...
- ArcGIS Engine开发前基础知识(4)
ArcGIS不同开发方式的比较 关于GIS应用软件的开发,通常有三种方式:C/S架构.网络GIS和移动GIS.ArcGIS平台提供了对三种开发方式的支持,对于采用从C/S架构的大多数开发者来讲,首先想 ...
- 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发
原文 http://blog.csdn.net/flexmapserver/article/details/5868882 用Windows Form进行ArcGIS Engine二次开发时常见的形式 ...
- VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统
一.前言 众所周知,二维GIS技术发展了近四十年,伴随着计算机软硬件以及关系型数据库的飞速发展,二维GIS技术已日臻完善.在对地理信息的分析功能上有着无可比拟的优势.一些宏观的地理信息,一维的地理信息 ...
- VS2010下WPF开发ARCGIS ENGINE 10的带Ribbon控件项目
原文 http://blog.sina.com.cn/s/blog_47522f7f0100nq5t.html 题目好长,但是集目前最新的工具于一身..VS是最新的2010版,不过用的是.net3.5 ...
- ArcGIS Engine开发前基础知识(1)
ArcGIS二次开发是当前gis领域的一项重要必不可少的技能.下面介绍它的基本功能 一.ArcGIS Engine功能 在使用之前首先安装和部署arcgis sdk,(在这里不在赘述相关知识)可以实现 ...
- 如何在WPF程序中使用ArcGIS Engine的控件
原文 http://www.gisall.com/html/47/122747-4038.html WPF(Windows Presentation Foundation)是美国微软公司推出.NET ...
随机推荐
- 转:SVN 出现This client is too old to work with working copy...错误
本地进行SVN客户端版本更新,但是之前一些代码是用的旧svn客户端提交的,这时候进行代码更新或者提交代码可能会出现错误,我这边是NetBeans中提交代码就出现了以下错误:This client is ...
- Cracking the coding interview 第一章问题及解答
Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...
- Java宝典(二)
--String s = "a" + "b" + "c" + "d"; 一共创建了多少个对象? --对于如下代码: St ...
- 【转载】C代码优化方案
C代码优化方案 1.选择合适的算法和数据结构2.使用尽量小的数据类型3.减少运算的强度 (1)查表(游戏程序员必修课) (2)求余运算 (3)平方运算 (4)用移位实现乘除法运算 (5)避免不必要的整 ...
- spring3 jsp页面使用<form:form modelAttribute="xxxx" action="xxxx">报错,附连接数据库的spring MVC annotation 案例
在写一个使用spring3 的form标签的例子时,一直报错,错误信息为:java.lang.IllegalStateException: Neither BindingResult nor plai ...
- python 给lambda命名(网友处学习)
from os import * def set_name(**k): assert len(k)==1 name,obj=k.items()[0] obj.func_name=name return ...
- JS 点击复制Copy插件--Zero Clipboard
写博客就是一周工作中遇到哪些问题,一个优点就是能够进行一个总结,另外一个优点就是下次遇到相同的问题即使那你记不住,也能够翻看你的博客攻克了.相同也能够帮到别人遇到与你一样问题的人.或者别人有比你更好的 ...
- [Immutable + AngularJS] Use Immutable .List() for Angular array
const stores = Immutable.List([ { name: 'Store42', position: { latitude: 61.45, longitude: 23.11, }, ...
- VB中DateDiff 函数解释
VB中DateDiff 函数使用方法 DateDiff (interval, Date1 , Date2[,firstweekofyear[,firstweekofyear]]) 返回一个Varia ...
- EffectiveC#11--选择foreach循环
1.C#的foreach语句可以为你的任何集合产生最好的迭代代码 不推荐如下写法(?原因未明白 作者意思是阻碍jit边界检测) int len = foo.Length; for ( int inde ...