《2022年面向对象编程技术实习报告 .pdf》由会员分享,可在线阅读,更多相关《2022年面向对象编程技术实习报告 .pdf(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
26、- - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 23 页 - - - - - - - - - 3 问题及解决方案1调用通用颜色对话框的时候要先添加到自定义颜色中才可使其变色,为使其更方便,将代码 ctText=crCustomColors0;改为 ctText=cc.rgbResult; 2编写 MyPolyPolyline函数时, 出现很多问题, 先是在编写函数时总是不能实现特定的功能,调用时忘记申明,最后编写时仔细理解了LineTo 和 MoveToEx ,利用这两个函数先写出了 MyPolyline,然后在这基础上编写了MyPolyPoly
27、line;3 MyPolyPolygon编写时也同样出现很多问题,没法实现填充,最后直接调用的PolyPolygon ,编写时按照一个在头文件中编写,另一个新建一个cpp,理解函数的调用;#include BOOL MyPolyPolygon(HDC hdc,CONST POINT*lpPoints,CONST INT*lpPolyCounts,int nCount) PolyPolygon(hdc,lpPoints,lpPolyCounts,nCount); return TRUE; 4在定时器的编写时运行无错,却总是出现528528528,无法成功计时,此时#define Time 1 ;
28、SetTimer(hWnd,1,1000,NULL);确认无错的情况下,将GetSystem(&systemtime);改为 GetLocalTime(&systemtime);可成功计时;5编写时依旧存在括号漏写,未定义等错误,在出现错误很多的情况下检查括号是否漏写,未定义的在定义的类型上要仔细考虑,不能把类型弄错;4 实验总结这次的实验, 总体来说不向以往几次都是赶着上交之前才完成,有了一定的进步吧。初次拿到题目时还是一样的大量的题目,然而仔细的去一点点的研究,去做的时候发现也许有了上几次的练习作为积淀,做起来也不向以前一样刚开始毫无头绪。在仔细的研究完实例程序后, 按照特定的步骤和方法都
29、能一步步的做出来。也许是有着实例程序的运用,为我们提供了很多的借鉴及参考。这次的实验中花费时间最长的是函数的编写,因为知道自己的弱点一直在函数这边,所以这次的练习在函数上下了很大的功夫。虽然说是简单的函数编写,但是我还是经过了多次的推敲,尝试,最终顺利的实现时的却十分开心。在一次次的实验中,看着一点点的进步,从不妄想能够一步登天,亦知自己还需努力,于是耐下心来一点点的去做,去积累,去领悟编程的思想。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 23 页 - - - -
30、 - - - - - 附件关键程序代码A、对话框部分:#include #include #include resource.h BOOL InitWindow (HINSTANCE hInstance, int nCmdShow); LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); COLORREF GetMyColor(HWND hWnd) COLORREF cr = 0; CHOOSECOLOR cc; COLORREF crCustomColors16; /初始化
31、CHOOSECOLOR 结构变量cc cc.lStructSize = sizeof (CHOOSECOLOR); cc.hwndOwner = hWnd; cc.hInstance = NULL; cc.rgbResult = RGB (0, 0, 0); cc.lpCustColors = crCustomColors; cc.Flags = CC_RGBINIT | CC_FULLOPEN; cc.lCustData = 0; cc.lpfnHook = NULL; cc.lpTemplateName = NULL; if (ChooseColor (&cc) cr = cc.rgbRe
32、sult; return cr; ; COLORREF g_Color; BOOL CALLBACK ColorDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) BOOL b; static int iColor; /用户选择的颜色switch (message) case WM_INITDIALOG: /先设置为红色CheckRadioButton (hDlg, IDC_RADIO_RED, IDC_RADIO_GREEN, IDC_RADIO_RED); SetDlgItemInt (hDlg, IDC_COLO
33、RVALUE, RGB(255,0,0), FALSE); return FALSE; case WM_COMMAND: /处理对话框中各控件通知消息名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 23 页 - - - - - - - - - switch (LOWORD (wParam) case IDOK: /响应 确认 按钮,改写文本颜色iCurrentColor 为 iColor g_Color = GetDlgItemInt(hDlg, IDC_COLORVA
34、LUE, &b, FALSE); /关闭对话框EndDialog (hDlg, TRUE); /关闭对话框return TRUE; case IDCANCEL: /响应 取消 按钮,直接关闭对话框EndDialog (hDlg, FALSE); return TRUE; case IDC_BUT_SELCOLOR: SetDlgItemInt(hDlg, IDC_COLORVALUE, GetMyColor(hDlg), FALSE); return TRUE; case IDC_RADIO_RED: case IDC_RADIO_GREEN: case IDC_RADIO_BLUE: Che
35、ckRadioButton (hDlg, IDC_RADIO_RED, IDC_RADIO_BLUE, LOWORD (wParam); switch(LOWORD (wParam) case IDC_RADIO_RED: SetDlgItemInt (hDlg, IDC_COLORV ALUE, RGB(255,0,0), FALSE); break; case IDC_RADIO_GREEN: SetDlgItemInt (hDlg, IDC_COLORVALUE, RGB(0,255,0), FALSE); break; case IDC_RADIO_BLUE: SetDlgItemIn
36、t (hDlg, IDC_COLORVALUE, RGB(0,0,255), FALSE); break; return TRUE; break; return FALSE; ;/ 结束 ColorDlgProc int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) . LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) static HWN
37、D hWndEdit; static HMENU hMenuPop; HDC hdc; PAINTSTRUCT ps; RECT rect; static COLORREF crText = RGB (0, 0, 0); static BOOL change=FALSE; HBRUSH hold; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 23 页 - - - - - - - - - static CHOOSECOLOR cc; static COLORREF c
38、rCustomColors16; switch (message) case WM_CREATE: /初始化结构cc cc.lStructSize = sizeof (CHOOSECOLOR); cc.hwndOwner = hWnd; cc.hInstance = NULL; cc.rgbResult = RGB (0, 0, 0); cc.lpCustColors = crCustomColors; cc.Flags = CC_RGBINIT | CC_FULLOPEN; cc.lCustData = 0; cc.lpfnHook = NULL; cc.lpTemplateName = N
39、ULL; hMenuPop = LoadMenu (LPCREATESTRUCT)lParam)-hInstance, IDR_MENU1); hMenuPop = GetSubMenu (hMenuPop, 1); return 0; case WM_SETFOCUS: SetFocus (hWndEdit); return 0; case WM_COMMAND: / 响应编辑控件通知消息if (lParam) WORD w, W1, W2, W3; w = LOWORD (wParam); W1 = HIWORD(wParam); W2 = LOWORD (lParam); W3 = HI
40、WORD(lParam); /编辑控件通知消息if (LOWORD (wParam) = 1) &(HIWORD(wParam) = EN_ERRSPACE | HIWORD (wParam) = EN_MAXTEXT) MessageBox (hWnd,TEXT ( 编辑控件内存溢出), TEXT ( 菜单示例程序 ), MB_OK|MB_ICONSTOP); return 0; else switch(LOWORD(wParam); case IDM_SET_BKColor: if (DialogBox ( (HINSTANCE)GetWindowLong (hWnd, GWL_HINST
41、ANCE), MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ColorDlgProc)=IDOK) if 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 23 页 - - - - - - - - - (change)hold=(HBRUSH)GetWindowLong(hWnd,GCL_HBRBACKGROUND); SetClassLong(hWnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(g_Col
42、or); change=TRUE; if (change) DeleteObject(hold); InvalidateRect(hWnd,NULL,TRUE); case IDM_SET_SCRIPTColor: if (ChooseColor (&cc) crText=cc.rgbResult; InvalidateRect (hWnd, NULL, TRUE); return 0; return 0; case WM_PAINT: hdc = BeginPaint (hWnd, &ps); GetClientRect (hWnd, &rect); SetTextColor (hdc, c
43、rText); DrawText (hdc, TEXT ( 欢迎使用 ), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; return DefWindowProc (hWnd, message, wParam, lParam); / 函数MainWndProc 结束B、自定义对话框:#include #include #include resource.h #include my
44、polyolygon.h BOOL InitWindow (HINSTANCE hInstance, int nCmdShow); LRESULT CALLBACK WinProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); BOOL MyPolyline(HDC hdc,CONST POINT *lppt,int cPoints); . LRESULT CALLBACK WinProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) HDC hdc; 名师资料
45、总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 23 页 - - - - - - - - - PAINTSTRUCT ps; RECT rect; LOGPEN logpen; CONST DWORD b2=5,5; int c2=5,5; static HMENU hMenuPop; HMENU hMenu; static int iSelectionFunc=IDM_FUNC_POLYLINE; static int iSelectionPen=IDM_PEN_BLACK;
46、 static int iSelectionBrush=IDM_BRUSH_WHITE; static HPEN hRedDashdotPen, hBlueSolidPen; HPEN hOldPen; HBRUSH hNewBrush, hOldBrush; POINT ptDiamond5; POINT ptDiamond210; POINT ptDiamond310, pt; switch (message) case WM_CREATE: hRedDashdotPen = CreatePen (PS_DASHDOT, 1, RGB (255, 0, 0); /创建宽度为3 的蓝色画笔l
47、ogpen.lopnStyle = PS_SOLID; logpen.lopnWidth.x = 3; logpen.lopnColor = RGB (0, 0, 255); hBlueSolidPen = CreatePenIndirect (&logpen); hMenuPop = LoadMenu (LPCREATESTRUCT)lParam)-hInstance, IDR_MENU1); hMenuPop = GetSubMenu (hMenuPop, 1); return 0; case WM_COMMAND: hMenu = GetMenu (hWnd) ; switch (LOW
48、ORD (wParam) case IDM_FUNC_POL YPOLYLINE: case IDM_FUNC_POL YLINE: case IDM_FUNC_POL YGON: case IDM_FUNC_POL YPOLYGON: case IDM_FUNC_LINETO: case IDM_FUNC_RECTANGLE: case IDM_FUNC_ROUNDRECT: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 23 页 - - - - - - - - -
49、 case IDM_FUNC_MYPOL YPOLYLINE: case IDM_FUNC_MYPOL YPOLYGON: CheckMenuItem(hMenu,iSelectionFunc,MF_UNCHECKED); iSelectionFunc=LOWORD(wParam); CheckMenuItem(hMenu,iSelectionFunc,MF_CHECKED); InvalidateRect(hWnd,NULL,TRUE); return 0; case IDM_PEN_BLACK: case IDM_PEN_REDDASHDOT: case IDM_PEN_BLUESOLID
50、: CheckMenuItem(hMenu,iSelectionPen,MF_UNCHECKED); iSelectionPen=LOWORD(wParam); CheckMenuItem(hMenu,iSelectionPen,MF_CHECKED); InvalidateRect(hWnd,NULL,TRUE); return 0; case IDM_BRUSH_WHITE: case IDM_BRUSH_LTGRAY: case IDM_BRUSH_COLORSOLID: case IDM_BRUSH_CROSS: CheckMenuItem (hMenu, iSelectionBrus