基于MFC的测量程序开发_第1页
基于MFC的测量程序开发_第2页
基于MFC的测量程序开发_第3页
基于MFC的测量程序开发_第4页
基于MFC的测量程序开发_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于MFC的测量程序开发摘要:关键词:1 界面设计以坐标转换系统(包括高斯平面坐标、大地空间坐标、空间直角坐标之间的转换)为例,界面设计如下:对于此类简单的测绘程序设计,在我看来,运用对话框进行编程,已经足够了,如果没有特殊的要求,不建议使用单文档以及多文档。对于对话框程序的界面设计主要包括:对话框大小、对话框标题、对话框控件的大小与位置设计等3个方面。其中控件的大小与位置设计最为关键,其美观程度也在此体现,一个美观的程序界面能给人耳目一新的感觉,我认为界面设计是很有必要的。对话框大小的设计我一般是采用黄金矩形比例即1:0.618,如有特殊的要求可适当的加宽或者加长。对话框的标题可直接在对话框

2、属性中的Caption一栏进行修改。常用控件类型分为:GroupBox、ComboBox、Radio、Edit、Button以及ListControl,其中GroupBox控件起到Radio控件分组与包裹其他类型控件的美观作用,ComboBox起到转换方式选择和坐标系选择的作用,不要使用默认大小,要用鼠标进行绘制,其横向长度要能保证大于最长string的长度,其纵向宽度适宜就行,不做特别要求,Radio、Edit和Button控件的大小也是适宜就行,不做特别要求,ListControl控件的长度很重要,必需要能表示所有的列(包括其中的数据),不能存在空间不够而省略表示的现象,如实在是由于对话框

3、大小有限,长度不够,还能在控件初始化时对控件字体大小进行修改,后面会做介绍。2 初始化整个程序的初始化是为后面文件读写、计算、绘图等操作的代码编写做铺垫,是构建一个大的框架,之后再编写每一个部分,在编写的过程中,我们可能会发现很多框架所存在的问题,逐渐修改、逐步完善就可以了,就完成了程序的编写。初始化并不是必要的,就算不初始化,也可以逐步完成程序的编写,但初始化后的程序,在接下来的编写过程中,将会更加的流畅,也能加深自己对于整个程序的理解。程序的初始化主要包括两个部分,变量的初始化和控件的初始化,它们是有一定的联系的,应交叉进行,不可分开处理,下面主要介绍各类控件的初始化。ComboBox控件

4、初始化:首先建立一个ComboBox控件变量,然后在InitDialog函数调用Addsting函数添加string字段,调用SetCursel函数参数设为0是为了在打开对话框时ComboBox控件上默认选择第1条字段,然后调用ComboBox控件的响应函数,响应函数里首先要调用GetCursel函数获取当前索引,然后判断索引值,完成ComboBox控件相对应的操作。Radio控件初始化:直接在InitDialog函数里创建一个CButton的变量指针获取Radio控件的窗口句柄,然后调用SetCheck函数并将参数设为1,即在打开对话框时选中此Radio按钮,然后调用Radio控件的响应函数

5、,完成相应操作。需要注意的一点就是,要将包围1组Radio控件的Group控件属性栏里边的Group设置为True,否则将造成整个对话框的所有Radio控件为一组,不能同时选取2个Radio控件的情况。List Control控件初始化:List Control控件,我又称之为表格控件,主要利用表格进行数据的显示,直接明了。表格控件的初始化直接在InitDialog函数里进行,首先获取表格的大小即Rect,主要是为了接下来每一列宽度的设置做准备,然后进行风格、字体大小、字体颜色的设定,最后依次插入每一列的列名。3 数据输入数据的输入有两种形式,一种是文件读入数据,一种是手动输入数据。3.1 文

6、件读入数据并显示到ListCtrl中数据文件类型一般常用的是.txt(文本文件)和.xls(表格文件),下面分别对两种类型数据文件的读取进行介绍。3.1.1 .txt文本文件数据读取在文本文件中,单个数据之间通常用空格或者逗号来隔开,或者进行换行处理,以下简称为空格类文本文件和逗号类文本文件。空格类文本文件用C+的fstream来进行读取是非常方便的,但是逗号类文本文件用流来进行读取就显得力不从心了,所以综合空格类文本文件和逗号类文本文件的特点,我们采取一种新的文件读取方式即用MFC中的CStdioFile类来进行文件读取操作,下面介绍具体操作。双击打开文件Button,创建其响应函数。在响应

7、函数中创建打开对话框获取文件地址并对文件地址进行判定。文件地址存储在csFileAddress中,文件地址非空判定为空,则弹出提示消息”文件地址错误”,判定为非空则继续往下运行,进行数据的读取操作。如要读取下一行数据,在再进行一次sf.Readstring()操作即可,最后进行文件的关闭操作。CStdioFile类读取大多数类型的文本文件都挺方便的,fstream只对于空格类文本文件读取较为方便,标准C的文件读取方式对一切文本文件都可以实现,但较为繁琐,只对于标准文件读取较为方便,如图像文件。3.1.2 .xls表格文件数据读取C+读取.xls文件,有各种各样的方法,我在这里向大家介绍一种比较

8、简单快捷的方法,采用OLE的方式读取.xls文件。首先点击项目->类向导->添加类->类型库中的MFC类,然后从注册表中选取Excel或者直接从文件中选取(这需要电脑上已经安装了Excel),成功后,从接口中选取6个类添加到生成的类,分别是CApplication、CRang、CWorkbook、CWorkbooks、CWorksheet、CWorksheets,在对话框类头文件中引用这6个类,并定义变量分别为app、range、book、books、sheet、sheets。接着是创建打开文件Button的响应函数并构建打开对话框获取文件地址,在读取.txt文件中已经详细介

9、绍了,这里就不再重复介绍了。接下来就是对.xls文件的操作部分了。读取.xls文件的原理就是先要获取数据的在表格中的位置,在上图中65代表第A列(依据ASCII码),1代表第1行,然后再获取其内容,最后关闭excel。3.1.3 将数据显示到ListCtrl中从文件读取数据后并存储,可以将数据显示到ListCtrl中,这可以增加程序的交互性,让用户使用程序更加方便,更能对读入数据的正确性进行简单判断,具体操作如下。以高斯正算为例,需要将原本char、double类型的变量转换为CString类型,以便在ListCtrl中显示。3.2 手动输入数据我们想要实现这样一种手动输入数据的方式,即鼠标左

10、键单击ListCtrl控件中某一单元格,在同一单元格处弹出一个Edit编辑框,大小与此单元格完全一致,然后在Edit编辑框中中输入数据,点击其他区域,即完成数据的输入,并将数据显示到当前单元格。具体操作如下。打开类向导,找到命令中的IDC_LIST即ListCtrl控件ID,然后找到其响应消息NM_CLICK,点击添加处理程序,点击确定,在其响应函数进行下列操作。首先要获取我们鼠标点击ListCtrl控件的单元格的行列,iItem与iSubItem是在.h文件中定义的,然后获取客户区坐标即ListCtrl控件的坐标,并将坐标原点转移到ListCtrl控件的左上角,获取编辑框的坐标,它的坐标为客

11、户区坐标加上它在ListCtrl控件中的坐标。接着进行对Edit编辑框的操作,如果此处单元格原本就有数据,那么我们需要将它的原始数据显示到编辑框中,然后移动、显示编辑框,并对编辑框实现编辑,编辑完成后,点击其它区域,结束对编辑框的操作,编辑框的结束操作也有对应的响应函数,以建立ListCtrl单击响应函数相同的方法建立Edit的响应函数EN_KILLFOCUS。KILLFOCUS主要的功能就是起到一个数据传递的作用,即将编辑框中的数据显示到ListCtrl中。到此,手动输入数据就介绍完了,如何运用ListCtrl中的数据将在计算中进行讲解。4 计算以坐标转换为例,计算主要包括,计算辅助函数的编

12、写,坐标系与坐标转换方式的选择,如选择手动输入数据,还需输入未知点个数与确定分度带,并读取ListCtrl中的数据,还有最重要的主体计算。4.1 计算辅助函数的编写编写辅助函数要新建一个C_AssistFucntion类,将辅助函数写在这个类里面。常用的计算辅助函数有:(1)、度分秒->度Dms2Deg;(2)、度->弧度Deg2Rad;(3)、度分秒->弧度Dms2Rad;(4)、弧度->度分秒Rad2Dms;(5)、弧度->度Rad2Deg;(6)、度数之和SumofDms(含相减);(7)、求边长 CalDistance;(8)、求方位角CalAzimuth

13、Angle;(9)、方位角传递TransAzimuth(小于180,加上180;大于180,减去180);4.2 坐标系与坐标转换方式的选择在ComboBox下拉框中选择了坐标系和坐标转换的方式后,要有相应的响应操作。双击坐标系选择ComboBox控件,建立其响应函数,进行下列操作。 首先要获取其索引,即所选坐标系的排列位数,按从上到下进行排列,然后进行相应的操作。坐标转换方式的选择就比较简单了,在.h文件中定义一个int型变量m_iflag记录其索引值就行了,在下面的计算中针对不同的索引进行不同的计算。4.3 文件输入计算双击文件输入Radio,创建其响应函数,进行下列操作。m_bHand和

14、m_bFile是在.h文件中定义的bool型变量,m_bHand代表手动输入,m_bFile代表文件输入,true代表选择。当选择文件输入时,将未知点个数的Edit编辑框与确定Button设置为不可编辑,将打开文件Button设置为可编辑,在打开文件读取数据后,对未知点个数进行更新,并在对话框上显示,但不可编辑。4.4 手动输入计算双击手动输入Radio,创建其响应函数,其操作与文件输入刚好相反。文件输入的数据在打开文件时就已经存储在里容器中,直接使用即可。手动输入的数据包括未知点个数,ListCtrl表格控件上的数据,高斯正反算还包括分度带的选取,这些问题需要一一进行处理。4.4.1 未知点

15、个数输入给未知点个数Edit控件绑定一个int型变量m_N,双击确定Button,创建其响应函数,进行下列操作。UpdataDate(TRUE)表示更新变量,将Edit框输入的数赋值给其绑定的变量m_N,然后在ListCtrl控件上添加m_N行空行,这是为了后面在在ListCtrl控件上输入数据做准备,因为ListCtrl控件上无数据,鼠标左键单击响应函数是不会执行的,所以必须添加m_N行空白数据。4.4.2 高斯正反算分度带的选取分度带的选取就是选择不同的Radio,执行不同的操作,需要创建不同的响应函数,在.h文件中定义m_iFdd,如选择6度带,则在其对应的响应函数中给m_iFdd赋值为

16、6,选择3度带进行相同操作给m_iFdd赋值为3,在后面的主体计算中对m_iFdd值进行判断即可。4.4.3 ListCtrl控件上数据的读取手动在ListCtrl控件上输入数据后,数据是显示在ListCtrl控件上的,并不是存储在容器中的,我们需要把数据从ListCtrl控件上读取下来,存放到容器中,方便使用。在计算Button响应函数的开头进行下列操作。首先要对输入方式进行判定,确定选择了手动输出Radio才进行其余操作,主要函数GetItemTex(i,j)这个函数实现了对ListCtrl控件上第i行j列数据的读取,读取后数据的存储方式为CString,要进行相应的转换,点名转换为cha

17、r数组,经纬度转换为double型变量,这就完成了对LisrCtrl控件上数据的读取。4.5 主体计算以坐标转换为例,主体计算就是对坐标转换算法的实现,需要注意的几点包括:(1)、批量计算的处理;(2)、算法实现的正确性;(3)、转换方式的选择,通过获取转换方式ComboBox的索引值来进行判定;(4)、尽量模块化,将算法写成不同的函数进行调用,提高计算的结果的正确性。(5)、数据存储建议使用vector容器,方便动态开辟与多维计算。(6)、计算完毕后,可以将计算结果显示到ListCtrl控件上,增强呈现的交互性。5 数据保存计算数据的保存,常用的有.txt、.csv、.xls等格式,.txt

18、与.csv在C+中用fstream来进行存储比较方便,比较简单,就不具体介绍了,下面主要介绍.xls表格文件的存储方法。双击保存数据Button,创建其响应函数,在响应函数中首先要创建保存文件对话框获取文件地址,具体操作与创建打开文件对话框一致,唯一一点不同是将对话框对象的第一个参数设置为FALSE,过滤器可要可不要,然后对文件地址的正确与否进行判定,接下来就是.xls文件写入的具体操作,如下所示。首先,要连接.xls文件,接着和读取数据一样获取单元格位置即单元格行列,然后写入数据,写入的数据格式要求为CString,需要进行相应的转换,接着选择整列自适应宽度,避免数据的隐藏,最后关闭exce

19、l进程。6 绘图绘图有2种方式,一种是直接在对话框上创建一个画布进行绘图,以下简称对话框绘图,以附合水准近似平差为例,如图所示。另外一种绘图方式为dxf绘图,即将图元信息保存为.dxf格式,为的是能够在CAD软件中打开查看,如图所示。下面分别对对话框绘图与dxf绘图作详细介绍。6.1 对话框绘图要在对话框上进行绘图,首先要在对话框上建立画布,这里的画布是用StaticText控件来代替的,创建了StaticText控件后记得要修改其ID,然后找到OnCtlColor函数,进行下列操作。判定窗口句柄是否为画布,然后修改文字背景色与画布背景色。双击绘图Button建立其响应函数,在.h文件中定义b

20、ool型变量m_bDraw,在绘图响应函数中给m_bDraw赋值为true,然后调用OnPaint函数。在OnPaint函数中,首先对m_bDraw的正负进行判定,如为正,则进行以下操作。首先要获取绘图画布的句柄并选定画笔,然后刷新视图,并将绘图原点从对话框左上角转移到画布左上角。为了让图像等比缩小显示在画布中心且比例合适,需要确定一个比例常数k,设计算数据中坐标点的x、y坐标的最大最小值之差分别为dx与dy,屏幕坐标即画布坐标x、y坐标的最大最小值之差分别为DX与DY,则k=minDx/dx,Dy/dy*0.8,0.8代表图像大小比例为画布的0.8倍,这个值是可以改变的,根据图像的特点来进行

21、确定,在绘图时只需将坐标改为坐标乘以k来进行绘制即可。接下来就是图元的具体绘制,基础图元大致分直线、圆、注记等,至于更复杂的高程点、水准点、平行线的绘制都是由基础图元来组成的。建议将图元的绘制函数写在类CAssistFunction中,直接调用即可。绘制图像的过程就是调用各个图元绘制函数的过程,这是在OnPaint函数中进行的。下面以绘制直线为例,编写DrawLine函数。6.2 dxf绘图Dxf绘图实质上就是将图元信息编写一个.dxf文件,使其能在CAD软件中打开并查询。.dxf文件实质上是由一个个组码与其对应的数据组成,这里不做重点讲述,因为它很复杂,我们需要操作的就两个部分,一个是HANDSEED部分,另一个就是ENTITIES图元部分,下面介绍具体操作。首先打开CAD软件,AUTOCAD和中望CAD都是可以的,随便绘制一条直线,一个圆,一个注记,然后另存为AUTOCAD R12 DXF(.dxf)格式,其他格式也是可以的,但R12比较简单,数据量较少。然后我们要对.dxf文件进行修改,要将图元信息写入其图元部分,从而实现图形的绘制功能,但直接在文件上进行修

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论