2022年面向对象编程技术实习报告 .pdf
《2022年面向对象编程技术实习报告 .pdf》由会员分享,可在线阅读,更多相关《2022年面向对象编程技术实习报告 .pdf(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象编程技术实验四实验报告班级:通信 2 班学号:201000800212 姓名: 王煜莹时间:2012-10-20 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 23 页 - - - - - - - - - 目录1 实验要求 . 3 2 实验过程及结果 . 3 A、对话框部分: . 3 B、图形绘制函数的使用 . 5 C、定时器使用 . 10 3 问题及解决方案 . 11 4 实验总结 . 11 附件 . 12 关键程序代码 . 12 A、对话框部分: . 12
2、B、自定义对话框: . 15名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 23 页 - - - - - - - - - 1 实验要求掌握通用对话框和自定义对话框的使用;掌握图形绘制函数的使用; 掌握定时器的设置和定时消息响应。2 实验过程及结果A、对话框部分:1.研究第五章示例程序,理解通用对话框、 自定义对话框的使用方式,为本次实验打基础。2.在自己 的工作目录中建立新工程。从已有的示例程序中选取适当的代码,修改形成自己的框架。代码整理过程中要特别注意代码的格式。源文
3、件名后缀必须是.cpp,不可以是.c3.增加对 WM_PAINT消息的处理,在窗口客户区输出文本。case WM_PAINT: hdc = BeginPaint (hWnd, &ps); GetClientRect (hWnd, &rect); DrawText (hdc, TEXT ( 欢迎使用 ), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hWnd, &ps); return 0; 4.增加菜单资源,要求至少包含“更改文本颜色”和“更改背景颜色”两个命令。5.自定义一个简单的对话框,该对话框内至少有一个“选
4、择背景色”按钮 和一个 静态文本框(或 Edit 框) 以及 确定 、取消 两个按钮。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 23 页 - - - - - - - - - 该简单对话框的处理逻辑为:点击“选择背景色”按钮,弹出通用对话框选择颜色,选择完颜色后,将 颜色值 显示到静态文本框(或Edit 框)中。再点击该对话框的“确定”按钮,可将结果颜色值通过变量交接给外部程序使用。6.编写上述自定义对话框的处理函数。switch(LOWORD(wParam) cas
5、e IDM_SET_BKColor: if (DialogBox ( (HINSTANCE)GetWindowLong (hWnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ColorDlgProc)=IDOK) if (change)hold=(HBRUSH)GetWindowLong(hWnd,GCL_HBRBACKGROUND); SetClassLong(hWnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(g_Color); change=TRUE; if (change) Dele
6、teObject(hold); InvalidateRect(hWnd,NULL,TRUE); case IDM_SET_SCRIPTColor: if (ChooseColor (&cc) crText=cc.rgbResult; InvalidateRect (hWnd, NULL, TRUE); 7.增加响应菜单命令的代码。在“更改文本颜色”命令的响应中调用通用颜色对话框选择新的颜色。 新选定的文本颜色用 全局变量 或静态变量 保存,在主窗口刷新消息(WM_PAINT )处理中用该颜色显示原来输出的文本。case IDC_BUT_SELCOLOR: SetDlgItemInt(hDlg,
7、 IDC_COLORVALUE, GetMyColor(hDlg), FALSE); return TRUE; case WM_PAINT: hdc = BeginPaint (hWnd, &ps); GetClientRect (hWnd, &rect); SetTextColor (hdc, crText); DrawText (hdc, TEXT ( 欢迎使用 ), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hWnd, &ps); return 0; 更改背景颜色命令响应中激活自定义对话框,对话框结束后,
8、根据选择的颜色,结合 SetClassLong 和 CreateSolidBrush 函数,创建新的画刷,并替换原来主窗口类使用的画刷。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 23 页 - - - - - - - - - if (change)hold=(HBRUSH)GetWindowLong(hWnd,GCL_HBRBACKGROUND); SetClassLong(hWnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(
9、g_Color); change=TRUE; if (change) DeleteObject(hold); InvalidateRect(hWnd,NULL,TRUE); 8.刷新窗口看显示结果是否符合要求(可在设置完颜色或画刷之后直接用InvalidateRect函数激发 WM_PAINT消息) 。B、图形绘制函数的使用1.研习 EASYGDI示例程序。查看各个GDI 绘制函数的使用方法。2.在自己的工作目录中建立新工程。要求同2。3.增加对 WM_PAINT消息的处理,在其中使用:Polyline 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
10、- - - - - - 名师精心整理 - - - - - - - 第 5 页,共 23 页 - - - - - - - - - PolyPolyline Polygon PolyPolygon 等函数, 注意在 WM_PAINT 消息中对HDC 的获取和释放使用的函数是 BeginPaint 和 EndPaint 函数。switch(iSelectionFunc) case IDM_FUNC_POL YLINE: ptDiamond0.x = 0; ptDiamond0.y = rect.bottom / 2; ptDiamond1.x = rect.right / 2; ptDiamond1
11、.y = 0; ptDiamond2.x = rect.right; ptDiamond2.y = rect.bottom / 2; ptDiamond3.x = rect.right / 2; ptDiamond3.y = rect.bottom; ptDiamond4.x = 0; ptDiamond4.y = rect.bottom / 2; Polyline (hdc, ptDiamond, 5); break; case IDM_FUNC_POL YGON: if (GetPolyFillMode(hdc)=WINDING) SetPolyFillMode(hdc, ALTERNAT
12、E); else SetPolyFillMode(hdc, WINDING); ptDiamond0.x = 0; ptDiamond0.y = rect.bottom / 3; ptDiamond1.x = rect.right; ptDiamond1.y = rect.bottom / 3; ptDiamond2.x = rect.right / 4; ptDiamond2.y = rect.bottom; ptDiamond3.x = rect.right / 2; ptDiamond3.y = 0; ptDiamond4.x = 3 * rect.right / 4; ptDiamon
13、d4.y = rect.bottom; Polygon (hdc, ptDiamond, 5); break; case IDM_FUNC_POL YPOLYLINE: ptDiamond20.x = 0; ptDiamond20.y = rect.bottom / 4; ptDiamond21.x = rect.right / 4; ptDiamond21.y = 0; ptDiamond22.x = rect.right; ptDiamond22.y = rect.bottom / 4; ptDiamond23.x = rect.right / 4; 名师资料总结 - - -精品资料欢迎下
14、载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 23 页 - - - - - - - - - ptDiamond23.y = rect.bottom; ptDiamond24.x = 0; ptDiamond24.y = rect.bottom / 4; ptDiamond25.x = 0; ptDiamond25.y =3 * rect.bottom / 4; ptDiamond26.x =3 * rect.right / 4; ptDiamond26.y = 0; ptDiamond27.x = rect
15、.right; ptDiamond27.y =3 * rect.bottom / 4; ptDiamond28.x = 3 *rect.right / 4; ptDiamond28.y = rect.bottom; ptDiamond29.x = 0; ptDiamond29.y = 3 *rect.bottom / 4; PolyPolyline (hdc, ptDiamond2, b,2); break; case IDM_FUNC_POL YPOLYGON: if (GetPolyFillMode(hdc)=WINDING) SetPolyFillMode(hdc, ALTERNATE)
16、; else SetPolyFillMode(hdc, WINDING); ptDiamond30.x = 0; ptDiamond30.y = rect.bottom / 6; ptDiamond31.x = rect.right; ptDiamond31.y = rect.bottom /6; ptDiamond32.x = rect.right / 4; ptDiamond32.y = rect.bottom / 2; ptDiamond33.x = rect.right /2; ptDiamond33.y = 0; ptDiamond34.x = 3 * rect.right / 4;
17、 ptDiamond34.y = rect.bottom/2; ptDiamond35.x = 0; ptDiamond35.y = 2* rect.bottom / 3; ptDiamond36.x = rect.right; ptDiamond36.y = 2*rect.bottom /3; ptDiamond37.x = rect.right / 4; ptDiamond37.y = rect.bottom; ptDiamond38.x = rect.right /2; ptDiamond38.y = rect.bottom /2; ptDiamond39.x = 3 * rect.ri
18、ght / 4; ptDiamond39.y = rect.bottom; PolyPolygon (hdc, ptDiamond3, c,2); break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 23 页 - - - - - - - - - 4.按与 Polyline相同的函数格式编写自定义的折线绘制函数,新函数命名为MyPolyline(用 MoveToEx 和 LineTo 实现) ,用该函数替换上一步代码(11)中的 Polyline ,应该获得同样的
19、运行结果。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 23 页 - - - - - - - - - BOOL MyPolyline(HDC hdc,CONST POINT *lppt,int cPoints) MoveToEx(hdc,(*lppt).x,(*lppt).y,NULL); for (int i=1;icPoints;i+) LineTo(hdc,(*(lppt+i).x,(*(lppt+i).y); return TRUE; 5.编写 MyPolyPo
20、lyline和 MyPolyPolygon ,替换 11 中相应的库函数,获得同样的运行结果, 以此加深对函数编写、指针方式参数传递的理解。BOOL MyPolyPolyline(HDC hdc,CONST POINT *lppt,CONST DWORD *lpdwPolyPoints,int count) int i=0; for (int n=0;ncount;n+) MyPolyline(hdc,lppt+i,*(lpdwPolyPoints+n); i+=*(lpdwPolyPoints+n); return TRUE; BOOL MyPolyPolygon(HDC hdc,CONST
21、 POINT*lpPoints,CONST INT*lpPolyCounts,int nCount) PolyPolygon(hdc,lpPoints,lpPolyCounts,nCount); return TRUE; 6.一个工程多个 .cpp 文件的试验: 可尝试将这些自定义函数用单独的.cpp 文件管理, 并编写相应的头文件,使这些函数可以在其他.cpp 文件中被调用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 23 页 - - - - - - - - - 7
22、.在调试完上述代码的基础上增加绘图函数的使用,尝试绘制椭圆、矩形等图形。case IDM_FUNC_RECTANGLE: Rectangle (hdc, rect.right / 4, rect.bottom / 4, 3 * rect.right / 4, 3 * rect.bottom / 4); break; case IDM_FUNC_ROUNDRECT: RoundRect (hdc, rect.right / 4, rect.bottom / 4, 3 * rect.right / 4, 3 * rect.bottom / 4, rect.right / 4, rect.botto
23、m / 4); break; C、定时器使用8.在 WM_CREATE 消息中增加设置定时器的代码(用SetTimer 函数);case WM_CREATE: /创建消息SetTimer(hWnd,1,1000,NULL); return 0; 9.在窗口过程的消息处理代码中增加WM_TIMER消息的处理,处理的内容包括:用 SYSTEMTIME结构定义一个时间结构变量用 GetSysteTime 函数或 GetLocalTime 函数取出系统时间或本地时间将时间值打印成字符串(可以使用wsprintf 函数或 sprintf 函数)使用 GetDC 函数获取 HDC 用 TextOut 或
24、DrawText 函数输出文本用 ReleaseDC 函数释放先前获取的HDC 上述操作完成后,能够在窗口客户区中看到不断刷新的时间显示。case WM_TIMER: GetLocalTime(&systemtime); InvalidateRect (hWnd, NULL, TRUE); return 0; case WM_PAINT: wsprintf(str, %s %u/%u/%u %u:%u:%u, day, systemtime.wYear, systemtime.wMonth, systemtime.wDay, systemtime.wHour, systemtime.wMinu
25、te, systemtime.wSecond, systemtime.wMilliseconds); DrawTextA(hdc,str,strlen(str),&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER); EndPaint (hWnd, &ps); 10.在 WM_DESTROY消息中增加删除已创建的定时器的代码(用KillTimer函数)case WM_DESTROY: KillTimer(hWnd,NULL); PostQuitMessage(0); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年面向对象编程技术实习报告 2022 面向 对象 编程 技术 实习 报告
限制150内