面向对象编程_2016.4.22.doc_第1页
面向对象编程_2016.4.22.doc_第2页
面向对象编程_2016.4.22.doc_第3页
面向对象编程_2016.4.22.doc_第4页
面向对象编程_2016.4.22.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

山东大学 威海 机电与信息工程学院2014 级 面向对象编程技术 实验三实验报告 班 级 电子 2 班 学 号 201400800164 姓 名 赵保丰 时 间 2016 4 22 山东大学 威海 机电与信息工程学院2014 级 I 目目 录录 1 实验要求实验要求 1 2 实验过程及结果实验过程及结果 1 2 1 创建工程 1 2 2 程序流程和数据模型分析 1 2 3 问题及解决方案 1 3 实验总结实验总结 1 附录附录 关键代码关键代码 1 面向对象编程技术实验报告 1 1 实验要求实验要求 1 调试示例程序 Childwin 查找程序中的 UnderstandCallStack 函数 跟踪调试 以此理 解调用栈调用栈 2 改进 ChildWin 示例程序 在子窗口内显示出窗口特定信息 窗口 ID 号 尝试在每个 子窗口中绘制特定颜色的矩形 在子窗口的窗口过程函数的刷新处理消息中增添处理代码 用 GetWindowLong 函数取出子窗口 ID 根据子窗口 ID 设定子窗口内需要显示的信息 使用 wsprintf 函数组织待显示的字 符串 尝试在子窗口中绘制特定颜色的矩形 练习使用 Rectangle 函数 3 跟踪消息传递过程 在 Childwin 的主窗口过程函数的 WM CREATE WM PAINT WM COMMAND WM LBUTTONDOWN 处设置 断点 在子窗口的 WM CREATE WM PAINT WM CHILDWIN WM LBUTTONDOWN 处设置 断点 运行程序 查看各断点的响应过程过程 以此理解消息传递的次序 4 设计 实现一个软键盘 用子窗口实现一个软键盘 在窗口的客户区用子窗口绘制一个仿真的键盘 鼠标点击 每个子窗口 可输入不同的字符 将输入的字符显示到屏幕上 5 在自己的工作目录中建立新工程用于控件测试 可以将 Easywin 工程的 easywin c 拷贝 到新工程的目录中 修改文件名为 ctltest cpp 后缀名改为 cpp 编译 链接并使程序 正常工作 包括修正编译错误 6 用 Button 完成 4 所要求的软键盘实现 比较与原有实现的不同之处 7 创建各种类型的控件子窗口 包括 static edit listbox combobox button scrollbar 等 在主窗口的窗口过程函数中增加相应的消息处理实现主窗口与子窗口的通信 可 尝试设置控件的标题 内容 获取控件的标题 内容以及在控件有点击等操作时在主窗口 给出提示 8 同步骤 5 新建用于资源测试的工程 9 增加新的资源 光标 图标 并正确显示 用资源编辑器编辑一个光标 彩色 注意删除删除资源中不需要不需要的 image 类型 否则 显示光标可能不正确 为光标设定热点 hot spot 用资源编辑器编辑一个图标 修改注册窗口类的代码 使程序能正常使用自定义的光标和图标 参照课本 或 MSDN 中的 DrawIcon 函数 在 WM PAINT 消息中增加处理 在 窗口客户区中显示自定义的光标及图标 面向对象编程技术实验报告 2 创建一个另外光标供后续实验步骤使用 10 增加菜单 菜单中建立一个菜单项命令以修改窗口使用的光标 可命名为 ChangeCursor 对应的 ID 假设为 ID CHANGECURSOR 修改注册窗口类注册窗口类的代码 使程序运行时能正确载入菜单 换一种方式 通过修改创建窗口创建窗口的代码 使菜单能正确载入 11 增加菜单消息响应代码 增加 WM COMMAND 的消息处理 参照第五章菜单示例代码中的处理方式 响应菜单命令 对 ID CHANGECURSOR 命令的响应为 改变窗口使用的光标 可以使用 SetClassLong hwnd GCL HCURSOR LONG LoadCursor HINSTANCE GetWindowLong hwnd GWL HINSTANCE MAKEINTRESOURCE IDC CURSOR2 12 处理鼠标右键 增加快捷菜单处理 右键发出的菜单命令同样是通过 WM COMMAND 消息响应的 增加快捷菜单之 后 程序应该能通过主菜单或快捷菜单两种方式发出同样的命令 13 增加菜单快捷键的定义 修改资源 增加快捷键 使快捷键对应到某一菜单命令 修改消息循环 使程序能够处理快捷菜单 测试快捷键的按键响应情况 2 实验过程及结果实验过程及结果 2 1 创建工创建工程程 点击文件 选择新建项目 选择 win32 项目 改名称和解决方案名字 并进行设置成 空项目 将示例程序 childwin c 改为 childwin cpp 拷贝到所建工程目录 添加为源文件 2 2 问题及解决方案问题及解决方案 1 调试程序 将wcMain hbrBackground GetStockObject WHITE BRUSH wcChild hbrBackground GetStockObject LTGRAY BRUSH 这两句代码的等号后面加 HBRUSH 强制涂刷 在项目 属性 字符集将 Unicode 字符集改为多字节字符集 编译 成功出现子窗 口程序 2 以子窗口程序为基础 写出软键盘程序 定义行数和列数为4和7 在WM SIZE函数中改变子窗口大小和位置 具体代码为 case WM SIZE nXBox LOWORD lParam COL NUM nYBox 2 HIWORD lParam 5 ROW NUM 主窗口大小改变时 重新确定各子窗口在主窗口客户区的位置 for x 0 x COL NUM x 面向对象编程技术实验报告 3 for y 0 y 30 nRow nChildWin ID 30 nChildWin ID 30 nChildWin ID InvalidateRect hWnd NULL TRUE return 0 case WM PAINT hdc BeginPaint hWnd GetClientRect hWnd int number nChildWin ID static int n 0 static char a 50 a n number 65 n 面向对象编程技术实验报告 4 DrawText hdc a 1 EndPaint hWnd return 0 软键盘如图 6 创建工程项目控件 将示例程序 eassywin c 改为 ctltest cpp 并拷贝到所建工程所在文件夹中 将其添加为源文件 在项目 属性 链接器 输入中加入 winmm lib 库 编译成功 在 WM CREATE 函数创建控件类型 对控件的标签 风格 起始位置 高度和宽度进行定义 控件向父 窗口传送消息需要用 WM COMMANND 来自控件的 lParam 等于 1 时进行控件的传送 7 右键点击源文件 添加资源 cursor 绘制光标并保存 8 11 新建资源 munu 将菜单写为 changecursor 点击后在属性处将此 id 改变为 ID CHANGECURSOR 菜单的lparam等于 0 用WM COMMAND消息将菜单传递给父窗 口 case ID CHANGECURSOR时进行光标的改变 将wcMain lpszMenuName NULL 改为菜 单 IDR MENU 即添加菜单 3 实验总结实验总结 在做实验三的这两个周 我深刻的体会到要想写出一个程序并运行成功是多么的不容易 根据实例程序 childwin 运用子窗口的方法 通过定义数组在子窗口显示出大写字母和在 父窗口显示出被命中的字母 这些老师都已经提示过 但真正去做却到处都在出错 不停 的调试 修改 向同学请教 到现在都没做出最理想的软键盘程序 老师说过学习没有捷 径 我以后会在学习编程上投入更多的时间 希望能在学期结束时能对编程这门课有更深 一步的认识 面向对象编程技术实验报告 5 附录附录 关键代码关键代码 软键盘代码 程序 ChildWin 文件 ChildWin c 功能 子窗口演示程序 命中测试 include include define ROW NUM 4 行数 define COL NUM 7 列数 define WM CHILDWIN WM USER 1 主窗口通知子窗口的自定义消息 BOOL InitWindow HINSTANCE hInstance int nCmdShow 主窗口函数原型 LRESULT CALLBACK MainWndProc HWND hWnd UINT message WPARAM wParam LPARAM lParam 子窗口函数原型 LRESULT CALLBACK ChildWndProc HWND hWnd UINT message WPARAM wParam LPARAM lParam TCHAR szAppName TEXT ChildWin 主窗口类名称 TCHAR szChildName TEXT ChildWin Child 子窗口类名称 HINSTANCE hInst 全程变量 实例句柄 int BFunc int pLenB pLenB pLenB return pLenB void AFunc int pLenA BFunc pLenA if pLenA 10000 pLenA 100 面向对象编程技术实验报告 6 void UnderstandCallStack int len len 1000 AFunc int WINAPI WinMain HINSTANCE hInstance HINSTANCE hPrevInstance PSTR szCmdLine int iCmdShow MSG msg if InitWindow hInstance iCmdShow return FALSE while GetMessage DispatchMessage return msg wParam static BOOL InitWindow HINSTANCE hInstance int iCmdShow HWND hwnd WNDCLASS wcMain wcMain style CS VREDRAW CS HREDRAW wcMain lpfnWndProc MainWndProc wcMain cbClsExtra 0 wcMain cbWndExtra 0 wcMain hInstance hInstance wcMain hIcon LoadIcon hInstance IDI APPLICATION wcMain hCursor LoadCursor NULL IDC ARROW wcMain hbrBackground HBRUSH GetStockObject WHITE BRUSH GetStockObject HOLLOW BRUSH CreateSolidBrush RGB 0 0 255 wcMain lpszMenuName NULL wcMain lpszClassName szAppName 面向对象编程技术实验报告 7 if RegisterClass return 0 hInst hInstance hwnd CreateWindow szAppName TEXT softkeyboard WS OVERLAPPEDWINDOW CW USEDEFAULT CW USEDEFAULT CW USEDEFAULT CW USEDEFAULT NULL NULL hInstance NULL if hwnd return FALSE ShowWindow hwnd iCmdShow UpdateWindow hwnd return TRUE LRESULT CALLBACK MainWndProc HWND hWnd UINT message WPARAM wParam LPARAM lParam HDC hdc static HWND hChildWnd COL NUM ROW NUM 子窗口句柄 static int nXBox nYBox 子窗口宽度和高度 static WORD nChildWin ID 被命中的子窗口标识 static int nRow nCol 被命中的子窗口位置 即行列号 static int x y WNDCLASS wcChild 子窗口类 PAINTSTRUCT ps RECT rect switch message case WM CREATE wcChild style CS VREDRAW CS HREDRAW wcChild lpfnWndProc ChildWndProc wcChild cbClsExtra 0 wcChild cbWndExtra sizeof long wcChild hInstance hInst wcChild hIcon NULL 面向对象编程技术实验报告 8 wcChild hCursor LoadCursor NULL IDC CROSS wcChild hbrBackground HBRUSH GetStockObject LTGRAY BRUSH GetStockObject HOLLOW BRUSH wcChild lpszMenuName NULL wcChild lpszClassName szChildName if RegisterClass return 0 创建类似 画图 程序中绘图工具栏的各工具子窗口 for x 0 x COL NUM x for y 0 y ROW NUM y nChildWin ID x 2 y 子窗口标识值 hChildWnd x y CreateWindow szChildName NULL WS CHILDWINDOW WS DLGFRAME WS VISIBLE 0 0 0 0 hWnd HMENU nChildWin ID 0 hInst NULL 令0号子窗口为当前命中的子窗口 nChildWin ID 0 nRow 0 nCol 0 return 0 case WM SIZE nXBox LOWORD lParam COL NUM nYBox 2 HIWORD lParam 5 ROW NUM 主窗口大小改变时 重新确定各子窗口在主窗口客户区的位置 for x 0 x COL NUM x for y 0 y 30 nRow nChildWin ID 30 nChildWin ID 30 nChildWin ID InvalidateRect hWnd NULL TRUE return 0 case WM LBUTTONDOWN MessageBeep 1 发出标准蜂鸣声 MessageBox hWnd TEXT 鼠标左键按下了 TEXT 主窗口鼠标消息 MB OK return 0 case WM PAINT hdc BeginPaint hWnd GetClientRect hWnd int number nChildWin ID static int n 0 static char a 50 a n number 65 n DrawText hdc a 1 EndPaint hWnd return 0 case WM DESTROY PostQuitMessage 0 return 0 面向对象编程技术实验报告 10 return DefWindowProc hWnd message wParam lParam 函数 WinProc 结束 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 GWL ID 0 if GetWindowWord hWnd GWL ID 0 2004 03 11 Liangchenghui l SetWindowLong hWnd 0 1 else l SetWindowLong hWnd 0 0 return 0 case WM LBUTTONDOWN 新的子窗口被命中 if GetWindowLong hWnd 0 0 置该子窗口命中标志为1 SetWindowLong hWnd 0 1 发送消息通知主窗口 SendMessage GetParent hWnd WM COMMAND WPARAM MAKELONG WORD GetWindowWord hWnd GWL ID WORD 0 GetWindowLong hWnd GWL ID LPARAM hWnd 重绘子窗口客户区 GetClientRect hWnd InvalidateRect hWnd UnderstandCallStack rect right 面向对象编程技术实验报告 11 return 0 case WM CHILDWIN 主窗口发送的通知消息 改变原命中子窗口的状态 置子窗口命中标志为0 SetWindowLong hWnd 0 0 恢复子窗口初始显示方式 GetClientRect hWnd InvalidateRect hWnd return 0 case WM PAINT hdc BeginPaint hWnd GetClientRect hWnd 用黑色画矩形rect的左边线和上边线 if GetWindowLong hWnd 0 MoveToEx hdc 0 rect bottom 1 NULL LineTo hdc 0 0 Lin

温馨提示

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

评论

0/150

提交评论