面对对象编程实验_第1页
面对对象编程实验_第2页
面对对象编程实验_第3页
面对对象编程实验_第4页
面对对象编程实验_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、 面向对象编程技术实验三 实验报告班 级:电子二班学 号:姓 名:时 间:1 实验要求12 实验过程及结果12.1调试示例程序Childwin12.2改进ChildWin示例程序12.3跟踪消息传递过程42.4设计、实现一个软键盘.42.5增加新的资源.5 2.6增加菜单.62.7增加快捷菜单处理.73 实验总结8附录 关键代码81实验要求理解、窗口之间的消息传送、调用栈;掌握光标、图标、菜单的制作和使用方式;掌握菜单的响应方式、快捷菜单的载入及使用方式;理解GetWindowLong/SetWindowLong, GetClassLong/SetClassLong函数的用法。2 实验过程及结

2、果2.1调试示例程序Childwin,查找程序中的UnderstandCallStack函数,跟踪调试。在UnderstandCallStack函数中加断点,在一步一步进行调试,看每一步函数的取值,看函数取值是否正确,以及每一步是否出现错误。2.2改进ChildWin示例程序,在子窗口内显示出窗口特定信息(窗口ID号);尝试在每个子窗口中绘制特定颜色的矩形。在子窗口添加函数利用GetWindowLong函数取出子窗口的id值,在将id值赋值给已经定义的数组,再用wsprintf函数打印出来。再利用Rectangle函数绘制特定颜色的矩形。绘制出如图的小矩形。2.3跟踪消息传递过程在Childw

3、in的主窗口和子窗口过程函数设置断点,运行程序,查看各断点的响应过程。利用switch-case结构来确定窗口过程收到的消息的类型以及相应的处理方法。当窗口过程函数对消息进行处理后,应返回0,所有窗口过程不进行处理的消息都必须传给DefWindowProc的函数。DefWindowProc的返回值必须从窗口过程返回。2.4设计、实现一个软键盘用子窗口实现一个软键盘,鼠标点击每个子窗口,可输入不同的字符。将输入的字符显示到屏幕上。本实验在ChildWin示例程序的基础上加以改编,首先创建好子窗口,在子窗口上打印上键盘的字母定义一个数组,利用 GetWindowLong(hWnd, GWL_ID)

4、+65,再将取出的值赋值给定义好的数组,之后在利用wsprintf 打印出键盘上的字符。再在父窗口中添加WM-PAINT消息,当子窗口传来消息时父窗口将获得此时的子窗口是哪一个,这个时候再定义一个数组将传递来的赋值给数组,再用wsprintf函数将它打印在主窗口上。可以是这样如果取值足够大可以同时显示大小写,如下图。2.5增加新的资源2.5.1用资源编辑器编辑一个光标,在资源编辑器增添新的资源,选择新建光标在自己绘制完成后保存检查resource.h的文件中是否以及定义了新建的光标,如果已经定义完成,在注册窗口类的时候包含该光标即可。wc.hCursor = LoadCursor(hInsta

5、nce, MAKEINTRESOURCE(IDC_CURSOR3);2.5.2用资源编辑器编辑一个图标在资源管理器中添加ICON资源,在自定义完成之后,注意查看自己头文件是否已经定义该图标,如果已经成功在注册窗口类的时候包含该图标名,再在下面程序中添加程序,完成添加图标实验,结果显示如下。2.6增加菜单在资源中添加一个新的菜单,在菜单中编写,“欢迎进入”,“编辑”,“退出”。保存,在自定义完成之后,注意查看自己头文件是否已经定义该菜单,如果已经成功在注册窗口类的时候包含该菜单名。本次实验近加入了退出的菜单相应代码。case WM_COMMAND: / 响应编辑控件通知消息if (lParam

6、= 0)switch (LOWORD(wParam)case IDM_FILE_EXIT:SendMessage(hwnd, WM_CLOSE, 0, 0);return 0;2.7增加快捷菜单处理具体的处理下ase WM_CREATE: /获取快捷菜单句柄 hPopMenu = LoadMenu (LPCREATESTRUCT)lParam)->hInstance, TEXT (“PopMenu”); /再获取 hPopMenu 标识的快捷菜单的唯一的菜单便笺句柄 hPopMenu = GetSubMenu (hPopMenu, 0); return 0; case WM_RBUTTO

7、NUP: pt.x = LOWORD (lParam); pt.y = HIWORD (lParam); ClientToScreen (hWnd, &pt); TrackPopupMenu (hPopMenu, /快捷菜单句柄 TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, /标志选项 pt.x, pt.y, 0, hWnd, NULL); return 0; 3实验总结本次实验锻炼了我的很多能力,让我写程序渐渐有了一点思路,以及对各种函数的使用,程序的框架有了一定的了解,在实验过程中也遇到了很多的难题,在做软键盘的时候一开始不知道怎么样

8、在父窗口中显示出字符,之后通过查阅windows编程技术和网上查阅资料了解了父窗口与子窗口之间的通信。进而将子窗口的信息传送给父窗口,在打印出来就行了。在做添加各种控件时,一开始有的时候总没有定义,在头文件中没有控件的定义,这就是我在试验报告中反复强调的检查是否在文件中控件有定义。附录 关键代码软键盘:case WM_SIZE:nXBox = (LOWORD(lParam) * 3 / 2) / COL_NUM;nYBox = (HIWORD(lParam) *2 / 4) / ROW_NUM;/主窗口大小改变时,重新确定各子窗口在主窗口客户区的位置for (x = 0; x<COL_N

9、UM; x+)for (y = 0; y<ROW_NUM; y+)MoveWindow(hChildWndxy, (x*nXBox + LOWORD(lParam) / 20),(y*nYBox + HIWORD(lParam) * 3 / 6), nXBox, nYBox, TRUE);return 0;case WM_COMMAND: /子窗口被命中的通知消息/当子窗口被命中时发送此消息通知主窗口,以便由主窗口确定是否命中另一个子窗口,/若是,则发送消息通知子窗口函数改变前一次被命中子窗口的状态,if (!(LOWORD(wParam) = nChildWin_ID)SendMess

10、age(HWND)hChildWndnColnRow, WM_CHILDWIN, 0, 0L);/记录新的被命中的子窗口nChildWin_ID = LOWORD(wParam);nCol = nChildWin_ID >> 4;nRow = (nChildWin_ID > 15) ? (nChildWin_ID - 4) : nChildWin_ID;InvalidateRect(hWnd, NULL, TRUE);/ 重画时将擦除背景return 0;case WM_PAINT:if (!(LOWORD(wParam) = nChildWin_ID)GetClientRe

11、ct(hWnd, &rect);hdc = BeginPaint(hWnd, &ps);int number = nChildWin_ID;static TCHAR string20 = 0;static int n = 0;stringn = number+65 ;n+;DrawText(hdc, string, n, &rect, DT_SINGLELINE);/wsprintf(string, TEXT("%c"), number + 65);EndPaint(hWnd, &ps);return 0;case WM_DESTROY:Po

12、stQuitMessage(0);return 0;return DefWindowProc(hWnd, message, wParam, lParam);LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)HDC hdc;PAINTSTRUCT ps;RECT rect;LONG l = 0;static int xy;switch (message)case WM_CREATE:xy+;/置各子窗口命中标志为0,(0号子窗口则为1)if (GetWindowLong(hWnd

13、, GWL_ID) = 0)/if (GetWindowWord (hWnd, GWL_ID) = 0) / 2004.03.11 Liangchenghuil = SetWindowLong(hWnd, 0, 1);elsel = SetWindowLong(hWnd, 0, 0);return 0;case WM_LBUTTONDOWN:/新的子窗口被命中if (GetWindowLong(hWnd, 0) = 0)/置该子窗口命中标志为1SetWindowLong(hWnd, 0, 1);/发送消息通知主窗口SendMessage(GetParent(hWnd), WM_COMMAND,

14、/(WPARAM) MAKELONG (WORD)GetWindowWord (hWnd, GWL_ID), (WORD)0),GetWindowLong(hWnd, GWL_ID),(LPARAM)hWnd);/重绘子窗口客户区GetClientRect(hWnd, &rect);InvalidateRect(hWnd, &rect, TRUE);UnderstandCallStack(rect.right);return 0;case WM_CHILDWIN: /主窗口发送的通知消息,改变原命中子窗口的状态 /置子窗口命中标志为0SetWindowLong(hWnd, 0,

15、 0);/恢复子窗口初始显示方式GetClientRect(hWnd, &rect);InvalidateRect(hWnd, &rect, TRUE);return 0;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);GetClientRect(hWnd, &rect);for (int i = 0; i < ROW_NUM; i+) /列数for (int j = 0; j < COL_NUM; j+)TCHAR string20;TCHAR number = GetWindowLong(hWnd, GWL_I

16、D)+65;wsprintf(string, TEXT("%c"), number); /绘制子窗口的字母DrawText(hdc, string,-1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);/反相绘制被命中的子窗口if (GetWindowLong(hWnd, 0)GetClientRect(hWnd, &rect);TCHAR String120;int x = 0;int y = 20;TCHAR number;number = GetWindowLong(hWnd, GWL_ID) + 65;

17、HBRUSH hBrush = CreateSolidBrush(RGB(125, 125, 0);HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);Rectangle(hdc, rect.right / 4, rect.bottom / 4, (rect.right) / 4, (rect.bottom) / 4);SelectObject(hdc, hOldBrush);DeleteObject(hBrush);wsprintf(String1, TEXT("%c"), number);DrawText(hdc,

18、String1, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);/*id = GetWindowLong(hWnd, GWL_ID);DrawText(hdc, szBuffer,-1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);wsprintf(szBuffer, TEXT("%d"),id );*/用黑色画矩形rect的左边线和上边线/*MoveToEx(hdc, 0, rect.bottom - 1, NULL);LineTo(hdc, 0, 0);LineTo(hdc, rect.right - 1, 0);MoveToEx(hdc, 1, 1, NULL);LineTo(hdc, rect.right - 1, rect.bottom - 1);MoveToEx(hdc, 1, rect.bottom - 1, NULL);LineTo(hdc, rect.right - 1, 1);/用白色画矩形rect的

温馨提示

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

评论

0/150

提交评论