当前位置: 首页 > news >正文

WPF/ArcGIS Engine三维开发和EVC3/4升级到VS项目建议(转)

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 Scene
    this .scene.LoadSxFile( "******" ); // 加载场景
    this .scene.Navigate =  true ; // 启用 Navigate
    this .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就会弹出对话框,然后进行升级,如下图所示:

捕获

 

image

 

    一路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"

image


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中,

image

 

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

image

 

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

image

 

 

posted on 2013-07-22 18:23 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3205870.html

相关文章:

  • mysql一直使用swap,导致swap空间用尽变卡
  • 非阻塞同步机制与CAS操作
  • 今天作为一个Android开发者,你迷茫了吗?
  • html select 和dropdownlist小结收集
  • Promise的使用及简单实现
  • Redis详解篇
  • 求int最大值以及int二进制
  • idea+tomcat 解决 debug超级慢 问题
  • ubuntu 安装时分辨率太小 导致无法继续安装
  • EntityFramework Core笔记:查询数据(3)
  • Entity Framework In Action--5 Domain model mapping(2)
  • 在IDEA中编译Maven项目
  • Python绘制数码管显示当前时间
  • ECSHOP 购物车数量更新时自动更新价格 不要重新点击更新数量按钮
  • 关于ansible远程执行的环境变量问题(login shell nonlogin shelll)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2017年终总结、随想
  • 2019年如何成为全栈工程师?
  • co模块的前端实现
  • Django 博客开发教程 8 - 博客文章详情页
  • input的行数自动增减
  • Javascript 原型链
  • JS专题之继承
  • 初识MongoDB分片
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 你真的知道 == 和 equals 的区别吗?
  • 排序算法学习笔记
  • 入门级的git使用指北
  • 深度学习入门:10门免费线上课程推荐
  • 时间复杂度与空间复杂度分析
  • 实战|智能家居行业移动应用性能分析
  • 系统认识JavaScript正则表达式
  • 译自由幺半群
  • 原生JS动态加载JS、CSS文件及代码脚本
  • Spring第一个helloWorld
  • 从如何停掉 Promise 链说起
  • #includecmath
  • (1)Android开发优化---------UI优化
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (分享)自己整理的一些简单awk实用语句
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .“空心村”成因分析及解决对策122344
  • .net web项目 调用webService
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 指南:抽象化实现的基类