windows编程,交互式画图··

上传人:大米 文档编号:504747968 上传时间:2022-10-03 格式:DOC 页数:21 大小:536KB
返回 下载 相关 举报
windows编程,交互式画图··_第1页
第1页 / 共21页
windows编程,交互式画图··_第2页
第2页 / 共21页
windows编程,交互式画图··_第3页
第3页 / 共21页
windows编程,交互式画图··_第4页
第4页 / 共21页
windows编程,交互式画图··_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《windows编程,交互式画图··》由会员分享,可在线阅读,更多相关《windows编程,交互式画图··(21页珍藏版)》请在金锄头文库上搜索。

1、山东大学威海分校机电与信息工程学院2008级 面向对象编程技术综合实验一实验报告班 级:通信一班学 号:200800800095姓 名: 李辉版本号:1时 间:2010-12-05目 录1 实验要求12 实验过程及结果12.1 创建工程12.2 程序流程和数据模型分析12.3 问题及解决方案93 实验总结9附录 关键代码104面向对象编程技术实验报告1 实验要求1. 交互式绘制图形(至少包括线、矩形和文本),绘制完成的图形能够正确地重现2. 绘制结果可以正确持久化(存储到文件、从文件中读出)3. 最终交付的工程中至少包含两个源文件高级要求1. 线、矩形、文本的颜色(线色和填充色)、文本字体可调

2、。2. 能够通过鼠标点击选中图形,并进行属性的修改,修改的内容可包括:l 位置l 大小l 颜色l 线型2 实验过程及结果2.1 创建工程1. 在工程里,除创建了资源的头文件,又另外定义了一个头文件,来存放各个结构体或者是其他文件的声明;2. 定义了两个cpp文件,一个cpp文件存放主程序,另一个文件存放其他子函数,比如:对话框的定义函数,画图子函数等。2.2 程序流程和数据模型分析已实现功能:画线,矩形,椭圆,输入文本,保存,打开高级功能由于时间关系对矩形实现了图形的移动对椭圆实现了图形的放大缩小对文本,可以改变颜色和字体定义了三种画笔,四种画刷以画线为例:根据选择的图像类型,将相应的数据存入

3、结构体里linesCount.lcount.Lines.x=LOWORD(lParam);linesCount.lcount.Lines.y=HIWORD(lParam);另外定义另外一个结构体来记录相应图形画的个数typedef struct countint lcount;int rcount;int ecount;int tcount;COUNT;(这个结构体在画图和打开文件再做修改时很重要)保存文件:WriteFile (hFile, &Count, sizeof(COUNT), &dwBytes, NULL);WriteFile (hFile, lines, sizeof(MYLIN

4、ES)*Count.lcount, &dwBytes, NULL);(必须将计图形个数的结构体最先写入文件,在读文件的时候需要用到)读文件:ReadFile (hFile, &Count, sizeof(COUNT), &dwBytes, NULL);ReadFile (hFile, lines, sizeof(MYLINES)*Count.lcount, &dwBytes, NULL);(先写入的文件,先读,由于先读入线的个数,故可以来确定读线时所需要的空间)调用另存为对话框:在wm_creat里初始定义设置对话框结构变量ofn调用另存为对话框GetSaveFileName (&ofn)文件

5、的打开对话框:设置对话框结构变量ofn调用打开对话框GetOpenFileName (&ofn)调用是否需要保存对话框的逻辑:当文件已做修改未保存,再执行打开其他文件或者是关闭程序时,调用询问对话框。若需保存则SendMessage (hWnd, WM_COMMAND, IDM_FILE_SAVE, 0),当文件名不为“无标题”时执行保存操作,否则执行“另存为”命令。利用bFileChange来确定文件是否改变。添加画笔画刷1画笔的定义typedef struct tagmylinesPOINT Lines;POINT Linee;COLORREF color;intpenWidth;int

6、penStyle;MYLINES;根据选择的画笔的类型,将相应的函数传到结构体里if(iSelectionPen=IDM_PEN_BLACK)ellipseCount.ecount.penStyle=PS_SOLID;ellipseCount.ecount.penWidth=1;ellipseCount.ecount.color=RGB(0,0,0);2.画刷的定义将画刷的类型写入结构体,在画图的子函数里再根据画刷的类型选择相应的画刷来绘图文本的添加点击左键,获得坐标,在该点输出文本。文本的输入通过激活对话框。文本可以改变颜色。g_Color=GetMyColor(hWnd)写入当前的坐标te

7、xtsCount.tcount.Texts.x=LOWORD(lParam);textsCount.tcount.Texts.y=HIWORD(lParam);激活文本输入的对话框DialogBox ( (HINSTANCE)GetWindowLong (hWnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDD_DIALOG), hWnd, InputDlgProc);将对话框输入的文本写入对话框strcpy(textsCount.tcount.Text, g_EditInput);激活自定义颜色对话框,且获得颜色值g_Color=GetMyColor(hWnd)将文

8、本颜色值写入对话框textsCount.tcount.Color=g_Color;文本的显示SetTextColor (hdc,textsi.Color);TextOut(hdc,textsi.Texts.x,textsi.Texts.y,textsi.Text,strlen(textsi.Text)关于图形的移动:矩形的移动首先确定一下选择了哪个矩形,然后根据相对位移将新的起始点写入结构体里for(i=0;iCount.rcount;i+)if(abs(rectsi.Rects.x-pts.x)+abs(rectsi.Recte.x-pts.x)=abs(rectsi.Recte.x-rec

9、tsi.Rects.x)&(abs(rectsi.Rects.y-pts.y)+abs(rectsi.Recte.y-pts.y)=abs(rectsi.Recte.y-rectsi.Rects.y)rectsi.Rects.x=rectsi.Rects.x-pts.x+pte.x; rectsi.Rects.y=rectsi.Rects.y-pts.y+pte.y; rectsi.Recte.x=rectsi.Recte.x-pts.x+pte.x; rectsi.Recte.y=rectsi.Recte.y-pts.y+pte.y;break;Pts是移动的起始坐标,pte是终点坐标判断是

10、否在矩形内利用到了绝对值。避免了对四种绘图习惯造成分类判断。移动前的矩形移动后的矩形关于图形的放大与缩小椭圆的放大与缩小首先确定选择了哪一个椭圆,判决的条件同矩形一样。将鼠标左键UP的坐标重新赋予椭圆结构体里的终点坐标。重新绘图,实现缩放。for(i=0;iCount.ecount;i+)if(abs(ellipsei.Ellips.x-pts.x)+abs(ellipsei.Ellipe.x-pts.x)=abs(ellipsei.Ellipe.x-ellipsei.Ellips.x)&(abs(ellipsei.Ellips.y-pts.y)+abs(ellipsei.Ellipe.y-p

11、ts.y)=abs(ellipsei.Ellipe.y-ellipsei.Ellips.y)ellipsei.Ellipe.x=pte.x;ellipsei.Ellipe.y=pte.y;break;缩放前的椭圆缩放后的椭圆关于字体的选择在creat里初始化。将字体的LOGFONT写入结构体里。在paint里hFont=CreateFontIndirect (&textsi.Logfont);SelectObject (hdc,hFont);2.3 问题及解决方案保存文件:最开始由于保存文件采取的是开拓空间时,用最大的数值来来开拓。但它的缺点是,打开已保存的文件,一旦再做修改会将原来的东西覆盖

12、!解决方案:有另外定义一个结构体,来记录图形的个数,绘图的时候,会接着上次的,记录到结构体里。linesCount.lcount.Linee.x=LOWORD(lParam);linesCount.lcount.Linee.y=HIWORD(lParam);Count.lcount+;记录个数的结构体为typedef struct countint lcount;int rcount;int ecount;int tcount;COUNT;关于全局变量g_Color定义在头文件中,但编译的时候,出错。说g_Color已在子cpp文件里重复定义了。最后解决,在主函数声明此变量,在子cpp文件中声

13、明是外部变量,才得以解决。关于static在确定选中哪一个图形的时候,由于定义坐标直接利用了声明POINT。导致在判断坐标的过程中老是判别不出来。最后在POINT前加了static才得以解决关于字体在选择字体的过程中,可以显示改变后的字体,但一旦保存,打开,字体又恢复的默认的。原因查找,在存入结构体时,存的是HFONT,没有存logfont。3 实验总结1. 通过这次实验基本让我们了解了如何去实现稍微大的程序,知道了该首先在哪里下手。2. 一个良好的给变量的命名习惯,会让编程便得很简洁。3. 本次试验还有很多未知名的错误,比如说,一旦改变已打开的文件,只能利用另存为的方式存入,直接点击保存,并不能实现理想中的效果4. 关于全局变量的使用,还是不是很熟悉。5. 了解了,如何使用结构体,才能使思路变得更清晰。附录 关键代码结构体的定义typedef struct countint lcount;int rcount;int ecount;int tcount;COUNT;typedef struct tagtextPOINT Texts;COLORR

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号