VS2008环境(精选4篇)
VS2008环境 第1篇
八数码难题一般描述:在33的方格棋盘上,分别放置标有数字1、2、3、4、5、6、7、8的八张牌,第九张牌不标数字,记为空格,给定一种初始状态和目标状态,通过移动空格,使得棋盘从初始状态向目标状态转换(其中操作空格可用的操作有:左移、上移、右移、下移,但不能移出棋盘之外),通过搜索策略寻找从初始状态到目标状态的解路径。
解决八数码问题的搜索策略有很多,归纳起来主要有三种:深度优先搜索(Depth First Search,DFS)、宽度优先搜索(Breadth First Search,BFS)、A*算法。前两种是经典的盲目搜索算法,后一种是经典的启发式搜索算法。对于八数码问题,深度优先搜索一般不能保证得到最优解,A*算法又与其启发式函数息息相关,也无法保证得到最优解。而宽度优先搜索算法可以得到从初始状态到目标状态的最短解路径。虽然宽度搜索算法效率相对较低,搜索点数较多,但考虑到计算机技术的飞速发展,运算速度已经不是影响搜索效率的重要瓶颈了。因此,展开宽度优先搜索算法的研究,不但对解决八数码难题有着实际的意义,而且对解决人工智能中的其它问题,也可以起到积极的参考作用。
本文从人工智能的角度分析八数码问题,对解决八数码问题的宽度优先搜索策略展开研究,给出算法的一般描述,通过对算法进行分析,指出了宽度优先搜索算法的优点,可以获得最优的解路径。最后,在VS2008开发环境下,设计并实现了宽度优先搜索算法,即BSF算法,通过实验运行效果验证了宽度优先搜索算法的优越性。
1 宽度优先搜索算法
1.1 算法一般描述
宽度优先搜索是种先生成的节点先扩展的搜索策略,其一般过程是:从初始状态节点开始逐层向下扩展,在第N层节点还没有全部搜索结束之前,不进人第N+1层节点的搜索。
设TreeNodes表中的节点是根据生成的先后进行排序的,先进人TreeNodes表中的节点排在前面,后进入TreeNodes表的节点排后面,则算法可以进行一般描述:
1)把初始节点StartState放入TreeNodes表中,作为当前节点;
2)如果TreeNodes表中当前节点指向为空,则问题无解,失败退出;
3)把TreeNodes表的当前节点取出,并记该节点为CurrentState;
4)检查当前节点CurrentState是否为目标节点。若是,则得到问题的解,成功退出;否则进行第(5)步;
5)若节点CurrentState无法扩展,设定TreeNodes的下一个节点为当前节点,转第(2)步;
6)对当前节点CurrentState进行扩展,将其子节点存放入TreeNodes表的尾部,并为每一个子节点设置指向父节点CurrentState的指针,然后设定TreeNodes的下一个节点为当前节点,转第2)步。
1.2 针对八数码问题的宽度优先搜索算法分析
对于求解八数码问题,首先要给出一个起始状态和结束状态,如图1所示。那么,宽度优先搜索算法的目标就是寻找一条从起始状态到结束状态的解路径。
根据算法的一般描述,首先把起始状态加入到TreeNodes表中,作为根节点0。然后,把0节点取出,和结束状态比较,如图1来看,明显不是目标节点。所以对节点0进行扩展,根据空格上下左右移动,得到四个子节点,即节点1、2、3、4,并加入到TreeNodes表的尾部。再取出节点1作为当前节点,也不是目标节点,对其进行子节点扩展,得到2个节点,即节点5、6,并加入到TreeNodes表的尾部。然后,取出节点2作为当前节点,以此类推,进行下去,整个搜索节点过程,如图2所示。
图2给出了搜索到节点12时,整个TreeNodes表的节点情况。然后继续搜索节点13,根据算法过程,直到发现目标节点结束。这样的搜索过程,就是宽度优先搜索算法。最坏情况下,该算法将搜索整个状态空间,即搜索9!/2=181440个节点。但从图2可以看出,只要从根节点到目标节点构建一个路径,则该路径一定是最短的一条解路径。
2 八数码问题的VS2008实现
2.1 编程环境简介
我们的软件实验开发软件选用了Visual Studio 2008,它是基于.NET框架的软件开发平台,.NET开发环境是流行的基于Windows平台的编程平台。Visual Studio 2008可以为项目指定.NET Framework的版本:.NET Framework 2.0、3.0或3.5。应用程序的NET Framework目标是指为使该应用程序能够在计算机上运行而需要在该计算机上安装的.NET Framework版本。
Visual Studio 2008中的C#代码编辑器提供了语句结束和快速信息功能,以支持C#3.0中的下列新语言构造:
●隐式类型的局部变量
●查询表达式
●扩展方法
●对象/集合初始值设定项
●匿名类型
●Lambda表达式
●分部方法
C#语言简单易学,C#3.0语言和编译器引入了多种新的语言功能,为快速开发实现八数码问题的BFS算法提供了方便。
2.2 界面设计
求解八数码问题是一个智力型的游戏,基于这样的考虑,给出界面设计如图3所示。为了美观,在不影响系统运行性能的情况下,引用了第三方皮肤控件IrisSkin2.dll。从界面可以看出,除了起始状态和结束状态之外,还给出了存放中间状态的棋盘。另外一些关键的按钮,如“随机初始状态”、“随机结束状态”、“无解判断”、“宽度搜索”、“状态演示”等,其按钮作用比较明显。
作为游戏,在设计上,考虑了手动移动空格的操作方法。在中间状态情况下,棋盘上每个按钮可以按下操作,按下空格的上下左右按钮,如同空格的上移、下移、左移、右移。在信息记录里面显示操作步骤。游戏过程如图4所示。
2.3 BFS算法设计
宽度优先搜索算法设计主要包括状态编码、状态比较函数、无解判定、状态树构建算法、核心搜索算法等几个部分。
由于界面设计采用了按钮的形式,在状态编码上,按照顺时针顺序,使用整型数组存储每个按钮上的数字来表示某个状态,代码如下:
int[]astate=new int[9]{0,1,2,3,4,5,6,7,8};
空格对应于按钮上无数字,在数组中值记为0。
通过状态比较才能判定是否已经达到目标状态。基于整型数组的状态编码方式,可以很方便进行状态比较,只要检查两个状态对应的数组是否相等即可。
无解判定可以避免无解的情况下盲目搜索。可以证明,八数码问题有解的充分必要条件是两个状态的逆序列奇偶性相同。为此,无解判定问题转化为计算两个状态的逆序列奇偶性问题,给出代码如下:
状态树构建问题主要是对当前节点构建其子节点的问题,分三种情况考虑:第一种情况,空格在棋盘中间;第二种情况,空格在棋盘的四个角上;第三种情况,空格在除前两种情况之外的位置。每一种情况构建子节点的数量不同,具体算法中分不同的情况进行处理。
子节点构建完成之后,要考虑是否已经在状态树上存在该状态,如果存在,则不加入到状态树中;否则,加入状态树中,作为一个新的节点存在。
宽度优先搜索算法是解决八数码问题的关键,根据BFS算法的基本思想,使用alllist存放整个TreeNodes树的所有节点,给出其算法代码如下:
2.4 实验结果
根据图3所示的操作界面上的起始状态和结束状态,首先进行无解判断,点击“有解判断”之后,程序提示是有解的。然后进行宽度优先搜索,界面显示如图5所示。
经过一段时时间之后,系统搜索完成,弹出界面,如图6所示。
从搜索结果可以看出,此次八数码问题的解路径为20步,系统记录了每个节点的父节点,通过指向连接,可搜索到整个路径,点击状态演示后,最终界面如图7所示。另外,为了进行算法比较,在实际实验中实现了深度优先搜索算法,通过进行大量的实验,从结果上看,对于每种有解的起始状态和结束状态,深度优先搜索算法的解路径往往比宽度优先搜索算法多很多步。
3 结束语
从本文的实验可以看出,宽度优先搜索是一种完备策略,即只要问题有解,它就一定可以找到解。并且,宽度优先搜索找到的解,还一定是路径最短的解。这些都是宽度优先搜索的优点。当然,宽度优先搜索也存在很多缺点,主要缺点是盲目性较大,尤其是当目标行点距初始节点较远时,将产生许多无用的节点,因此其搜索效率较低,虽然相对于计算机飞速发展的运算速度来讲,这已经不是关键问题,但仍是下一步有待改进的方面。
参考文献
[1]佘玉梅,段鹏.人工智能及其应用[M].上海:上海交通大学出版社,2007.
[2]王万森.人工智能原理及其应用[M].2版.北京:电子工业出版社,2007.
[3]詹志辉,胡晓敏,张军.通过八数码问题比较搜索算法的性能[J].计算机工程与设计,2007,28(11):2505-2508.
[4]刘浩,鲍远律.A*算法在矢量地图最优路径搜索中的应用[J].计算机仿真,2008,25(4):253-257.
[5]刘甲耀,严桂兰.C#程序设汁教程[M].北京:电子工业出版社,2007.
VS2008环境 第2篇
在日常测绘生产作业中,经常需要进行两个不同坐标系之间的坐标转换,尤其是WGS84,BJ54坐标系以及西安80坐标系与地方独立坐标系之间坐标的互相转换。根据两个坐标系之间的3个或3个以上相同点即可解算出七参数,从而实现两个不同坐标系之间坐标的互相转换。
1 两个坐标系之间的转换模型
在大地测量坐标转换中,广泛使用七参数Bursa-Wolf模型解决两个坐标系转换问题,其模型为:
式(1)为两个不同空间直角坐标之间的转换模型,其中含有7个转换参数(ΔX0,ΔY0,ΔZ0,εX,εY,εZ,m),其中,ΔX0,ΔY0,ΔZ0均为坐标平移量;εX,εY,εZ为坐标轴间的3个旋转角度(又称为欧拉角);m为尺度因子。为了求得7个转换参数,至少需要3个公共点,当多于3个公共点时,采用间接平差模型进行解算:
令a1=m+1,a2=a1εX,a3=a1εY,a4=a1εZ,则式(1)写为:
则式(2)可写出如下形式的误差方程:
式(3)改写成矩阵形式为:V=B·δX+L。
其中,δX为待求的转换参数向量,δX=(ΔX0,ΔY0,ΔZ0,a1,a2,a3,a4)T;V为改正数向量,V=(VX2,VY2,VZ2)T;L为常数项向量,L=(X2,Y2,Z2)T已知值;B为系数阵。
根据最小二乘法VTPV=min的原则,可列出法方程为:BTPBδX+BTPL=0。
其解为:δX=-(BTPB)-1BTPL。
在求解得七参数后,利用Bursa-Wolf公式就可以进行未知点的坐标转换了,每输入一组坐标值,就能求出它在新坐标系中的坐标。
2 软件设计与实现
2.1 界面设计
由于七参数求解转换原始数据输入只涉及两个不同空间直角坐标系的重合点以及需要转换的坐标,故软件界面设计为对话框形式,用列表控件显示输入及程序运行结果。
2.2 求解布尔莎模型代码
3 实例分析
3.1 实例1
对某地区的6个实际测量点选取3个点进行验证,见表1。
通过程序计算,坐标转换参数如下:
3.2 实例2
对某地区的7个实际测量点选取4个来点进行验证,如表2所示。
通过程序计算,坐标转换参数如下:
4 结语
两种不同空间直角坐标系转换时,由于公共点的坐标存在误差,求得的转换参数将受其影响,公共点坐标误差对转换参数的影响与点位的几何分布及点数的多少有关,为了求得较好的转换参数,应选择一定数量的精度较高且分布均匀并有较大覆盖面的公共点。考虑Bursa-Wolf转换模型中7个转换参数对大地直角坐标系中坐标转换精度的影响,通过表1,表2可看出,转换点位误差最大为8.5 mm,最小为0 mm。通过该程序可以实现较大区域范围内新、旧坐标之间的快速转换,在控制点本身测量精度较高的条件下,坐标换算误差很小,满足测绘生产的要求。
摘要:对两个坐标系之间的转换模型进行了分析,并以VS2008 VB.NET为开发平台开发了七参数解算软件,通过不同区域的实例验证了其准确性和可靠性,具有一定的生产应用价值。
关键词:七参数,Bursa-Wolf模型,坐标转换
参考文献
[1]孔祥元.大地测量学基础[M].武汉:武汉大学出版社,2001.
VS2008环境 第3篇
关键词:交互式三维图形软件,OVI,OpenGL,VS2005
1 Open Inventor
1.1 Open Inventor是什么
Open Inventor(OVI)是基于OpenGL(Open Graphics Library)[1]的面向对象的开发三维图形软件开发包,其本身用C++编写。程序员使用OVI可以快速、简洁地开发出各种类型的交互式三维图形软件。
1.2 Open Inventor与OpenGL的区别
在文献[2]中,有一段文字形象地介绍了OIV与OpenGL之间的差别。假设要建造一栋房子,可以将使用砖头、水泥、沙子等来建造房屋的原始方式比作使用OpenGL来开发程序,而将利用预制水泥构件、成套室内设备来建造房屋比作使用OIV来开发程序。这种比喻形象地说出了OIV开发程序具有简单、高效的特点。而且OIV和OpenGL是相容的。在OIV中提供了多种方法允许直接调用OpenGL的命令,这使得OIV的功能变得更加强大。
1.3 Open Inventor的特点
1)OVI是面向对像的封装了OpenGL的开发包,因此其程序开发简单、高效;
2)OVI具有平台无关性,它可以在Unix、Windows、Linux等多种操作系统中使用;
3)OVI允许使用C、C++、Java、.Net多种编程语言进行程序开发,且提供了多种方法允许直接调用OpenGL命令;
4)OVI的应用领域非常非常广泛,涉及到机械工程设计与仿真、医学和科学图像、地理科学、石油钻探、虚拟现实、科学数据可视化等;
5)OVI基本上成为面向对象的3D图形开发“事实上”的工业标准。
1.4 Open Inventor的体系结构
如图1是OVI的体系结构,OVI建立在OpenGL和不同的操作系统的基础之上。OVI组件库向下屏蔽具体的操作系统细节,向上为用户提供统一的用户界面接口,比如针对Microsoft Windows系统,OVI组件库提供SoWinXXX等接口,针对Unix系统,提供SoX-tXXX等接口。
OVI 3D工具包包括3D场景数据库、一组节点工具包、一组操作。
3D场景数据库包含有形体、属性、组、引擎和传感器等节点对象,这些节点是用来创建3D场景数据库的“积木块”,每个节点存有一些信息,这些信息可能是3D物体、表面材质、形状描述、几何变换、灯光或照相机等信息。不同的节点的有序集合组合成场景保存在OVI的基础数据库中,这个数据库就是OVI的3D场景数据库。
节点工具包是一些按照某种规则组合在一起的节点集。它有助于创建协调一致的场景数据。
操作器是一种特殊类型的节点,可以响应用户产生的事件,比如用户可以在屏幕上通过鼠标直接操作它。通常,操作器带有外观形状,而且都提供了将事件转换进数据库中的方法。操作器为应用程序提供了一种与3D物体间直接进行交互作用的简便方法。
OVI还可以通过内建的3D交换文件格式,在应用程序之间进行数据交换。操作3D应用程序的用户可以通过剪切、粘贴场景中的3D对象,与桌面上的其它程序共享这些对象数据。
2 Open Inventor程序开发思想与步骤
2.1 Open Inventor程序的开发思想
OVI为程序员提供了类似MFC类库的框架,而不像OpenGL直接调用API的方式进行3D应用程序开发。OVI包括许多节点组件,程序员在不同类型的节点中设置3D物体、表面材质、形状描述、几何变换、灯光或照相机等信息,然后将这些节点作为“积木块”,在程序中有机地组织起来,就可高效地开发出可交互的3D程序。而大量的程序初始化、3D图像绘制、3D图形渲染、消息处理、与用户交互等复杂的工作对于程序员来说都是透明的,由OVI的底层机制自动完成。
2.2 Open Inventor程序的开发步骤
通常情况,在VS2005中开发OVI步骤主要包括四个步骤:
步骤一初始化窗口和视口:
一个3D图形要显示,必须依赖于窗口。通常程序员需要初始化一个系统窗口,并在该系统窗口中初始化视口,以便图像在该视口中显示。这里的视口可以使用渲染场景的窗口类SoWinRenderArea(渲染区),也可以使用观察器组件SoWinExaminerViewer。
步骤二建立场景:
场景是由许多不同的节点组成。首先需要建立场景的根节点,然后创建比如3D物体、表面材质、形状描述、几何变换等节点,接下来设置这些节点信息,然后加入场景,形成场景节点树。
步骤三遍历渲染场景:
在程序中,使用OVI的几条简单的语句,从场景的根节点开始,遍历所有节点,根据各节点的信息渲染3D图形,并显示在视口中。而遍历的方式以及渲染的细节,对于开发人员来说都是是透明的。
步骤四回收资源退出:
程序结束,需要将场景数据库资源和视口资源释放。
读者可根据该文的第四部分详细体会OVI开发的这4个主要步骤。
3 Open Inventor在VS2005中的环境搭建
目前工业界中比较成熟和典型的OVI包有三种:SGI的OVI,TGS的OVI,SIM的OVI。OVI最早由SGI提出并开发,其OIV主要用在UNIX操作系统下。TGS公司最早将OIV由Unix系统移植到Microsoft Windows下,它是目前世界上使用最多的OIV版本,但其属于商业软件包,版权费用昂贵,不适合普通用户学习和使用。SIM公司开发的Coin3D OIV可以同时在UNIX和Microsoft Windows下使用。虽然它的功能和性能没有TGS的OVI强大,但开发一般的3D应用程序绰绰有余。而且它是一个开源的OIV开发包,可以让初学者了解OIV内部运行的机理,更适合普通用户学习和使用。
接下来我们使用SIM公司的Coin3D OVI,详细研究、讨论在VS2005中搭建OVI的具体操作步骤。
步骤一安装VS2005:
Microsoft公司的VS2005安装是可视化、一键式的,非常方便轻松,这里不多作讨论。
步骤二下载并安装Coin3D:
Coin3D是SIM公司的OVI图形库,可以在地址[3]中下载。该地址有许多版本的Coin3D。如果下载的是可安装文件,就直接安装,然后检查系统环境变量COINDIR和PATH是否分别是:Coin3D安装目录、Coin3D安装目录bin。如果下载的不是安装文件,将其解压到某个目录下,而且还需手动设置系统环境变量COINDIR和PATH。这里因为VS2005中的VC版本是8.0,因此下载Coin-3.1.0-bin-msvc8.zip。它没有安装文件,将其解压到D盘(这里用户可以任意解压到一个目录)Coin-3.1.0-bin-msvc8目录,然后设置COINDIR和PATH两个系统环境变量。COINDIR是Coin-3.1.0-bin-msvc8的解压目录,而PATH是其解压目录下的bin目录。PATH的环境变量设置如图2所示。
步骤三下载并安装SoWin:
SoWin是基于Windows的窗口组件,任何使用Coin3D开发的OVI程序都需要依靠SoWin在Windows系统中显示和展现,而且它还为3D图形提供与用户的交互接口。这里下载SoWin-1.4.0.zip。解压该目录,然后将SoWin-1.4.0目录放在D:Coin-3.1.0-bin-msvc8中。
在SoWin-1.4.0文件夹中的build目录,选择适合的版本,打开工程文件进行编译(我们这里选择msvc8版本)。为了防止在编译的过程中出现cmd.exe错误,需要设置可执行文件使用路径。在VS2005的[工具][选项][项目解决方案][VC++目录]的“可执行文件”列表中添加这三项“$(SystemRoot)System32”、“$(SystemRoot)”、$(SystemRoot)System32wbem,如图3所示。接下来进行调试编译,如果编译中报类似“无法打开文件coin2d.lib”错误,需要在VS2005的[项目][sowin1属性][配置属性][链接器][输入][输入依赖项]中的coin2d.lib改为coin3d.lib,然后再编译调试。编译过程中没有报错,会在Coin3D的目录里自动生成SoWin的一些文件,比如sowin1d.dll和sowin1d.lib等,而且在Coin3D目录下的includeInventor里面增加一个Win头文件目录,这说明SoWin编译安装成功。
步骤四OVI应用程序的VS2005环境设置
在开发、编译OVI应用程序前,需要在VS2005中做一些配置才能使OVI程序正常运行。
1)建立OVI项目前,增加Coin3D的Lib目录路径。
在VS2005的[工具][选项][项目解决方案][VC++目录]的“包含文件”列表中增加Coin3D的Include目录路径,在VS2005的[工具][选项][项目解决方案][VC++目录]属性页的“库文件”列表中增加Coin3D的Lib目录路径,如图4所示。
2)编译OVI项目前,为该项目配置预处理器。VS2005[][
在VS2005的[项目][项目名属性(这里项目名是新建项目的名称)][配置属性][C/C++][预处理器]的“预处理器定义”栏增加“COIN_DLL和SOWIN_DLL”,如图5所示。
3)编译OVI项目前,为该项目配置链接器。
在VS2005的[项目][项目名属性(这里项目名是新建项目的名称)][配置属性][链接器][输入]的“附加依赖项”栏增加“coin3d.lib”和“sowin1d.lib”,如图6所示。
以上操作步骤完成以后,Coin3D OVI在VS2005中的环境设置就算完成,然后就可以进行OVI程序的开发和调试。
4 一个简单的Open Inventor程序
下面是一个简单的OVI程序代码,可在文献[2]中第二章找到,该文作了简要修改。它是一个红色的圆锥。程序代码如下:#include
程序运行后如图7所示(它是运行后进行旋转操作后的图片)。
该程序使用了一个OVI的Win窗口,它是OVI组件库的一部分。组件库带有窗口管理和事件处理功能,还包括一系列OVI组件。我们可以在窗口中对圆锥进行旋转、缩放等操作。程序一共只有十几行代码,却开发出如此功能丰富的交互式三维图形程序,这充分说明利用OVI开发交互式三维图形程序的简单、快捷。
5 结束语
Open Inventor(OVI)是基于OpenGL的面向对象的开发交互式三维图形软件开发包,可以用它快速、简洁地开发出各种类型的交互式三维图形软件。该文详细地研究、讨论了OVI的开发步骤以及VS2005中如何搭建OVI开发环境步骤,希望能够给OVI的初学者提供入门帮助。
参考文献
[1]OpenGL[EB/OL].http://baike.baidu.com/view/9222.htm.
[2]The OpenInventor Mentor:Programming Object Oriented 3D Graphics with Open InventorTM,Release2.Josie Wernecke and Open InventorArchitecture Group[M].Addison Wesley,1994.
VS2008环境 第4篇
本文介绍了一种在多层窗口的MFC应用程序中,子窗口调用父窗口的类中的成员函数及控件的方法。在工程实践中,就MFC应用程序而言,多窗口程序的优点显而易见。程序方便,简洁,有层次感,人机界面友好,占用资源很少, 操作灵活等等,不一而足。
二.实例分析
对大中型程序来说,由于功能上的需要,很多情况下需要在子窗口中调用父窗口的成员函数及控件。本文中所用到的实例是在Visual C++2005编程环境下输入、编译和运行的一个简单的MFC程序。该程序主要实现的是两个目的,第一,通过RS232串口通信控制两个小型步进电机执行预定的动作,第二,通过RS232串口通信监视一个马尔测量仪的数据输出。
本程序包含多个窗口,其中,父窗口为uEyeActiveXDem,其中一个子窗口为IDD_MOTOR。在父窗口uEyeActiveXDem中包含了一个通用串口类CSerialPort,现在需要在子窗口IDD_MOTOR中调用父窗口uEyeActiveXDem中包含的通用串口类CSerialPort中的方法及控件。
父窗口uEyeActiveXDem的代码片断:
在父窗口u EyeActiveXDem的头文件uEyeActiveXDemoDlg.h中MotorPort1, MotorPort2, MahrPort被声明为公共的静态的组员,是通用串口类CSerialPor的实例。代码片断如下:
现在,如果要在子窗口IDD_MOTOR中调用父窗口uEyeActiveXDem中包含的这个通用串口类CSerialPort的成员函数及控件,只需简单的在子窗口IDD_MOTOR加以声明引用即可。
在子窗口IDD_MOTOR的头文件MotorSetDlg.h中需要对通用串口类CSerialPort加以引用,代码片断如下:
同样, 在子窗口IDD_MOTOR的程序体中MotorSetDlg.cpp中需要对通用串口类CSerialPort加以引用,代码片断如下:
这样就可以在子窗口IDD_MOTOR的程序体中的任何位置调用父窗口u EyeActiveXDem中包含的通用串口类CSerialPort的任何成员函数及控件。其调用方法如下:
(Motor2Cmd[1]) ;//串口类CSerialPort的成员函数WriteToPort在子窗口IDD_MOTOR的函数中被调用。
三.总结
本文所用到的方法,其实就是对父窗口所包含的类进行实例化,然后再在子窗口里进行引用执行。如果是动态的话,也就是说窗口之间相互操作的话,可能会有一些困难。微软本身也并不推荐这样做。
摘要:在工程实践中, 就MFC应用程序而言, 多层窗口程序的优点显而易见, 程序方便, 简洁, 有层次感, 人机界面友好, 占用资源很少, 操作灵活等等, 不一而足。本文介绍了一种在多层窗口的MFC应用程序中, 子窗口调用父窗口的类中的成员函数及控件的方法。
关键词:VS2005,MFC,成员函数,窗口
参考文献
[1]李勇, 一个多串口多线程数据采集系统软件的设计与实现[M], 计算机集成制造系统-CIMS, 1999, (06)
[2]康灿, 王万玉, 基于串口的信号源与解调器微机控制系统[M], 微计算机信息, 2005, 10, 4-6