windows编程,交互式画图··.doc_第1页
windows编程,交互式画图··.doc_第2页
windows编程,交互式画图··.doc_第3页
windows编程,交互式画图··.doc_第4页
windows编程,交互式画图··.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

山东大学威海分校机电与信息工程学院2008 级 面向对象编程技术 综合实验一实验报告 班 级 通信一班 学 号 200800800095 姓 名 李辉 版本号 1 时 间 2010 12 05 山东大学威海分校机电与信息工程学院2008 级 I 目目 录录 1 实验要求实验要求 1 2 实验过程及结果实验过程及结果 1 2 1 创建工程 1 2 2 程序流程和数据模型分析 1 2 3 问题及解决方案 9 3 实验总结实验总结 9 附录附录 关键代码关键代码 10 面向对象编程技术实验报告 1 1 实验要求实验要求 1 交互式绘制图形 至少包括线 矩形和文本 绘制完成的图形能够正确地重现 2 绘制结果可以正确持久化 存储到文件 从文件中读出 3 最终交付的工程中至少包含两个源文件 高级要求高级要求 1 线 矩形 文本的颜色 线色和填充色 文本字体可调 2 能够通过鼠标点击选中图形 并进行属性的修改 修改的内容可包括 位置 大小 颜色 线型 2 实验过程及结果实验过程及结果 2 1 创建工程创建工程 1 在工程里 除创建了资源的头文件 又另外定义了一个头文件 来存放各个 结构体或者是其他文件的声明 2 定义了两个 cpp 文件 一个 cpp 文件存放主程序 另一个文件存放其他子函 数 比如 对话框的定义函数 画图子函数等 2 2 程序流程和数据模型分析程序流程和数据模型分析 已实现功能已实现功能 画线 矩形 椭圆 输入文本 保存 打开 高级功能高级功能 由于时间关系 对矩形实现了图形的移动 对椭圆实现了图形的放大缩小 对文本 可以改变颜色和字体 定义了三种画笔 四种画刷 以画线为例以画线为例 根据选择的图像类型 将相应的数据存入结构体里 lines Count lcount Lines x LOWORD lParam lines Count lcount Lines y HIWORD lParam 另外定义另外一个结构体来记录相应图形画的个数 面向对象编程技术实验报告 2 typedef struct count int lcount int rcount int ecount int tcount COUNT 这个结构体在画图和打开文件再做修改时很重要 保存文件保存文件 WriteFile hFile WriteFile hFile lines sizeof MYLINES Count lcount 必须将计图形个数的结构体最先写入文件 在读文件的时候需要用到 读文件 ReadFile hFile 先写入的文件 先读 由于先读入线的个数 故可以来确定读线时所需要的空间 调用另存为对话框 调用另存为对话框 在 wm creat 里初始定义 设置对话框结构变量 ofn 调用另存为对话框 GetSaveFileName POINT Linee COLORREF color intpenWidth int penStyle 面向对象编程技术实验报告 4 MYLINES 根据选择的画笔的类型 将相应的函数传到结构体里 if iSelectionPen IDM PEN BLACK ellipse Count ecount penStyle PS SOLID ellipse Count ecount penWidth 1 ellipse Count ecount color RGB 0 0 0 2 画刷的定义画刷的定义 将画刷的类型写入结构体 在画图的子函数里再根据画刷的类型选择相应的画刷来绘 图 文本的添加文本的添加 点击左键 获得坐标 在该点输出文本 文本的输入通过激活对话框 文本可以改变颜色 g Color GetMyColor hWnd 面向对象编程技术实验报告 5 写入当前的坐标 texts Count tcount Texts x LOWORD lParam texts Count tcount Texts y HIWORD lParam 激活文本输入的对话框 DialogBox HINSTANCE GetWindowLong hWnd GWL HINSTANCE MAKEINTRESOURCE IDD DIALOG hWnd InputDlgProc 将对话框输入的文本写入对话框 strcpy texts Count tcount Text g EditInput 激活自定义颜色对话框 且获得颜色值 g Color GetMyColor hWnd 面向对象编程技术实验报告 6 将文本颜色值写入对话框 texts Count tcount Color g Color 文本的显示文本的显示 SetTextColor hdc texts i Color TextOut hdc texts i Texts x texts i Texts y texts i Text strlen texts i Text 关于图形的移动 关于图形的移动 矩形的移动矩形的移动 首先确定一下选择了哪个矩形 然后根据相对位移将新的起始点写入结构体里 for i 0 i Count rcount i if abs rects i Rects x pts x abs rects i Recte x pts x abs rects i Recte x rects i Rects x rects i Rects y rects i Rects y pts y pte y rects i Recte x rects i Recte x pts x pte x rects i Recte y rects i Recte y pts y pte y break Pts 是移动的起始坐标 pte 是终点坐标 判断是否在矩形内 利用到了绝对值 避免了对四种绘图习惯造成分类判断 移动前的矩形 移动后的矩形 面向对象编程技术实验报告 7 关于图形的放大与缩小关于图形的放大与缩小 椭圆的放大与缩小椭圆的放大与缩小 首先确定选择了哪一个椭圆 判决的条件同矩形一样 将鼠标左键 UP 的坐标重新赋 予椭圆结构体里的终点坐标 重新绘图 实现缩放 for i 0 i Count ecount i if abs ellipse i Ellips x pts x abs ellipse i Ellipe x pts x abs ellipse i Ellipe x ellipse i Ellips x ellipse i Ellipe y pte y break 缩放前的椭圆 缩放后的椭圆 面向对象编程技术实验报告 8 关于字体的选择关于字体的选择 在 creat 里初始化 将字体的 LOGFONT 写入结构体里 在 paint 里 hFont CreateFontIndirect SelectObject hdc hFont 面向对象编程技术实验报告 9 2 3 问题及解决方案问题及解决方案 保存文件 最开始由于保存文件采取的是开拓空间时 用最大的数值来来开拓 但它的缺点是 打开已保存的文件 一旦再做修改会将原来的东西覆盖 解决方案 有另外定义一个结构体 来记录图形的个数 绘图的时候 会接着上次的 记录到结构体里 lines Count lcount Linee x LOWORD lParam lines Count lcount Linee y HIWORD lParam Count lcount 记录个数的结构体为 typedef struct count int lcount int rcount int ecount int tcount COUNT 关于全局变量 g Color 定义在头文件中 但编译的时候 出错 说 g Color 已在子 cpp 文件里 重复定义了 最后解决 在主函数声明此变量 在子 cpp 文件中声明是外部变量 才得以解 决 关于 static 在确定选中哪一个图形的时候 由于定义坐标直接利用了声明 POINT 导致 在判断坐标的过程中老是判别不出来 最后在 POINT 前加了 static 才得以解 决 关于字体 在选择字体的过程中 可以显示改变后的字体 但一旦保存 打开 字体又 恢复的默认的 原因查找 在存入结构体时 存的是 HFONT 没有存 logfont 3 实验总结实验总结 1 通过这次实验基本让我们了解了如何去实现稍微大的程序 知道了该首先在哪里 下手 2 一个良好的给变量的命名习惯 会让编程便得很简洁 3 本次试验还有很多未知名的错误 比如说 一旦改变已打开的文件 只能利用另 存为的方式存入 直接点击保存 并不能实现理想中的效果 面向对象编程技术实验报告 10 4 关于全局变量的使用 还是不是很熟悉 5 了解了 如何使用结构体 才能使思路变得更清晰 附录附录 关键代码关键代码 结构体的定义 typedef struct count int lcount int rcount int ecount int tcount COUNT typedef struct tagtext POINT Texts COLORREF Color char Text 40 LOGFONT Logfont TEXT typedef struct tagmylines POINT Lines POINT Linee COLORREF color intpenWidth int penStyle MYLINES typedef struct tagrect RECT rect POINT Rects POINT Recte int brushtype COLORREF color intpenWidth int penStyle 面向对象编程技术实验报告 11 MYRECT typedef struct tagellipse POINT Ellips POINT Ellipe int brushtype COLORREF color intpenWidth int penStyle RECT rect MYELLIPSE 部分子 cpp 文件 void DrawMyLine HDC hdc MYLINES pLine 绘制一条线 HPEN hPen CreatePen pLine penStyle pLine penWidth pLine color HPEN hPenOld HPEN SelectObject hdc hPen MoveToEx hdc pLine Lines x pLine Lines y NULL LineTo hdc pLine Linee x pLine Linee y SelectObject hdc hPenOld DeleteObject hPen void DrawMYRECT HDC hdc MYRECT rects int brushtype 绘制一条线 HPEN hPen CreatePen rects penStyle rects penWidth rects color HPEN hPenOld HPEN SelectObject hdc hPen HBRUSH hNewBrush hOldBrush 选用新画刷 switch brushtype case IDM BRUSH WHITE hOldBrush HBRUSH SelectObject hdc GetStockObject WHITE BRUSH break case IDM BRUSH LTGRAY hOldBrush HBRUSH SelectObject hdc GetStockObject LTGRAY BRUSH break case IDM BRUSH COLORSOLID 面向对象编程技术实验报告 12 创建并选择彩色实体画刷 hNewBrush HBRUSH CreateSolidBrush RGB 0 255 255 hOldBrush HBRUSH SelectObject hdc hNewBrush break case IDM BRUSH CROSS 创建并选择绿色十字影线画刷 hNewBrush HBRUSH CreateHatchBrush HS CROSS RGB 0 255 0 hOldBrush HBRUSH SelectObject hdc hNewBrush break Rectangle hdc rects Rects x rects Rects y rects Recte x rects Recte y SelectObject hdc hPenOld SelectObject hdc hOldBrush 删除自建画刷 DeleteObject hNewBrush void DrawMYELLIPSE HDC hdc MYELLIPSE ellipse int brushtype 绘制一条线 HPEN hPen CreatePen ellipse penStyle ellipse penWidth ellipse color HPEN hPenOld HPEN SelectObject hdc hPen HBRUSH hNewBrush hOldBrush 选用新画刷 switch brushtype case IDM BRUSH WHITE hOldBrush HBRUSH SelectObject hdc GetStockObject WHITE BRUSH break case IDM BRUSH LTGRAY hOldBrush HBRUSH SelectObject hdc GetStockObject LTGRAY BRUSH break case IDM BRUSH COLORSOLID 创建并选择彩色实体画刷 hNewBrush HBRUSH CreateSolidBrush RGB 0 255 255 hOldBrush HBRUSH SelectObject hdc hNewBrush break case IDM BRUSH CROSS 创建并选择绿色十字影线画刷 hNewBrush HBRUSH CreateHatchBrush HS CROSS RGB 0 255 面向对象编程技术实验报告 13 0 hOldBrush HBRUSH SelectObject hdc hNewBrush break Ellipse hdc ellipse Ellips x ellipse Ellips y ellipse Ellipe x ellipse Ellipe y SelectObject hdc hPenOld SelectObject hdc hOldBrush 删除自建画刷 DeleteObject hNewBrush Paint 消息里 for i 0 i Count lcount i DrawMyLine hdc lines i for i 0 i Count rcount i DrawMYRECT hdc rects i rects i brushtype for i 0 i Count ecount i DrawMYELLIPSE hdc ellipse i ellipse i brushtype for i 0 i Count tcount i hFont CreateFontIndirect SelectObject hdc hFont SetTextColor hdc texts i Color TextOut hdc texts i Texts x texts i Texts y texts i Text strlen texts i Text SelectObject hdc GetStockObject SYSTEM FONT 判断并移动矩形 if Type IDM POSIT pte x LOWORD lParam pte y HIWORD lParam for i 0 i Count rcount i if abs rects i Rects x pts x abs rects i Recte x pts x abs rects i Recte x rects i Rects x rects i Rects y rects i Rects y pts y pte y rects i Recte x rects i Recte x pts x pte x rects i Recte y rects i Recte y pts y pte y break 判断并改变椭圆的大小 if Type IDM SIZE pte x LOWORD lParam pte y HIWORD lParam for i 0 i Count ecount i if abs ellipse i Ellips x pts x abs ellipse i Ellipe x pts x abs ellipse i Ellipe x ellipse i Ellips x ellipse i Ellipe y pte y break 将相关信息写入结构体 case WM LBUTTONDOWN if bdrawing SetCapture hWnd if Type IDM FUNC LINE lines Count lcount Lines x LOWORD lParam lines Count lcount Lines y HIWORD lParam if iSelectionPen IDM PEN BLACK lines Count lcount penStyle PS SOLID lines Count lcount penWidth 1 lines Count lcount color RGB 0 0 0 if iSelectionPen IDM PEN REDDASHDOT 面向对象编程技术实验报告 15 lines Count lcount penStyle PS DASHDOT lines Count lcount penWidth 1 lines Count lcount color RGB 255 0 0 if iSelectionPen IDM PEN BLUESOLID lines Count lcount penStyle PS SOLID lines Count lcount penWidth 3 lines Count lcount color RGB 0 0 255 if Type IDM FUNC RECT rects Count rcount Rects x LOWORD lParam rects Count rcount Rects y HIWORD lParam rects Count rcount brushtype iSelectionBrush if iSelectionPen IDM PEN BLACK rects Count rcount penStyle PS SOLID rects Count rcount penWidth 1 rects Count rcount color RGB 0 0 0 if iSelectionPen IDM PEN REDDASHDOT rects Count rcount penStyle PS DASHDOT rects Count rcount penWidth 1 rects Count rcount color RGB 255 0 0 if iSelectionPen IDM PEN BLUESOLID rects Count rcount penStyle PS SOLID rects Count rcount penWidth 3 rects Count rcount color RGB 0 0 255 if Type IDM FUNC ELLIPSE ellipse Count ecount Ellips x LOWORD lParam ellipse Count ecount Ellips y HIWORD lParam ellipse Count ecount brushtype iSelectionBrush if iSelectionPen IDM PEN BLACK 面向对象编程技术实验报告 16 ellipse Count ecount penStyle PS SOLID ellipse Count ecount penWidth 1 ellipse Count ecount color RGB 0 0 0 if iSelectionPen IDM PEN REDDASHDOT ellipse Count ecount penStyle PS DASHDOT ellipse Count ecount penWidth 1 ellipse Count ecount color RGB 255 0 0 if iSelectionPen IDM PEN BLUESOLID ellipse Count ecount penStyle PS SOLID ellipse Count ecount penWidth 3 ellipse Count ecount color RGB 0 0 255 if Type IDM POSIT pts x LOWORD lParam pts y HIWORD lParam if Type IDM FONT pts x LOWORD lParam pts y HIWORD lParam if Type IDM SIZE pts x LOWORD lParam pts y HIWORD lParam bdrawing TRUE return 0 case WM LBUTTONUP if bdrawing SetCapture NULL if Type IDM FUNC LINE 面向对象编程技术实验报告 17 lines Count lcount Linee x LOWORD lParam lines Count lcount Linee y HIWORD lParam Count lcount bFileChange TRUE if Type IDM FUNC RECT rects Count rcount Recte x LOWORD lParam rects Count rcount Recte y HIWORD lParam Count rcount bFileChange TRUE if Type IDM FUNC ELLIPSE ellipse Count ecount Ellipe x LOWORD lParam ellipse Count ecount Ellipe y HIWORD lParam Count ecount b

温馨提示

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

评论

0/150

提交评论