面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

这篇具有很好参考价值的文章主要介绍了面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

源自网络收集,仅供参考

实验三收集到两份完整报告,这是其一,另一份见本专栏下一篇文章。

实验题目

《面向对象程序设计》 实验三

实验题目:子窗口与控件的基本用法、资源的使用

整体目的:理解、窗口之间的消息传送、调用栈;掌握光标、图标、菜单的制作和使用方式;掌握菜单的响应方式、快捷菜单的载入及使用方式;理解GetWindowLong/SetWindowLong, GetClassLong/SetClassLong函数的用法。

实验内容过程:

改进ChildWin示例程序,在子窗口内显示出窗口特定信息(窗口ID号);尝试在每个子窗口中绘制特定颜色的矩形

    • 在子窗口的窗口过程函数的刷新处理消息中增添处理代码;
    • 用GetWindowLong函数取出子窗口ID;
    • 根据子窗口ID设定子窗口内需要显示的信息(使用wsprintf函数组织待显示的字符串)
    • 尝试在子窗口中绘制特定颜色的矩形(使用CreateSolidBrush、Rectangle函数)
  1. 跟踪消息传递过程
    • 在Childwin的主窗口过程函数的WM_CREATE、WM_PAINT、WM_COMMAND、WM_LBUTTONDOWN处设置断点
    • 在子窗口的WM_CREATE、WM_PAINT、WM_CHILDWIN、WM_LBUTTONDOWN处设置断点
    • 运行程序,查看各断点的响应过程,以此理解消息传递的次序
  2. 设计、实现一个软键盘

用子窗口实现一个软键盘(在窗口的客户区用子窗口绘制一个仿真的键盘),鼠标点击每个子窗口,可输入不同的字符。将输入的字符显示到窗口中。

  1. 在自己的工作目录中建立新工程用于控件测试〔可以将Easywin工程的easywin.c拷贝到新工程的目录中,修改文件名为ctltest.cpp(后缀名改为.cpp),编译、链接并使程序正常工作(包括修正编译错误)〕。
  2. * 用Button完成4*所要求的软键盘实现。比较与原有实现的不同之处。
  3. 创建各种类型的控件子窗口,包括static、edit、listbox、combobox、button、scrollbar等;在主窗口的窗口过程函数中增加相应的消息处理实现主窗口与子窗口的通信(可尝试设置控件的标题/内容,获取控件的标题/内容以及在控件有点击等操作时在主窗口给出提示)。
  4. 同步骤5,新建用于资源测试的工程。
  5. 增加新的资源:光标、图标,并正确显示
    • 用资源编辑器编辑一个光标(彩色),注意删除资源中不需要的image类型,否则显示光标可能不正确。
    • 为光标设定热点(hot spot)
    • 用资源编辑器编辑一个图标
    • 修改注册窗口类的代码,使程序能正常使用自定义的光标和图标
    • 用DrawIcon函数,在WM_PAINT消息中增加处理,在窗口客户区中显示自定义的光标及图标。
    • 创建一个另外光标供后续实验步骤使用
  6. 增加菜单
    • 菜单中建立一个菜单项命令以修改窗口使用的光标,可命名为“ChangeCursor”,对应的ID假设为ID_CHANGECURSOR
    • 修改注册窗口类的代码,使程序运行时能正确载入菜单
    • 换一种方式,通过修改创建窗口(CreateWindow的代码,使菜单能正确载入
  7. 增加菜单消息响应代码
    • 增加WM_COMMAND的消息处理
    • 参照第五章菜单示例代码中的处理方式,响应菜单命令
    • 对ID_CHANGECURSOR命令的响应为:改变窗口使用的光标,可以使用SetClassLong (hwnd,  GCL_HCURSOR,
                                 (LONG)LoadCursor((HINSTANCE)GetWindowLong(hwnd,  GWL_HINSTANCE),
                                                                             MAKEINTRESOURCE(IDC_CURSOR2) ) );
  8. 处理鼠标右键,增加快捷菜单处理
    • 右键发出的菜单命令同样是通过WM_COMMAND消息响应的,增加快捷菜单之后,程序应该能通过主菜单或快捷菜单两种方式发出同样的命令
  9. 将本次实验做好的工程的编译、链接增加到程序构建使用的批处理文件中,用批处理文件一次性自动构建实验一、二、三的所有工程。
  10. 本次实验的实验报告上交时间为10月22日 21:30之前。

注意:

  1. 5* 选做。
  2. 做好各次实验的备份,每次实验课时携带所有先前实验的实验成果(电子版)备查。
  3. 实验报告文档格式、文件名应符合要求。

实验报告1(另一份报告见本专栏下一篇文章)

  1. 实验要求

理解、窗口之间的消息传送、调用栈;掌握光标、图标、菜单的制作和使用方式;掌握菜单的响应方式、快捷菜单的载入及使用方式;理解GetWindowLong/SetWindowLong, GetClassLong/SetClassLong函数的用法。

2,实验过程及结果

2.1创建工程

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

2.2程序流程和数据模型分析

  1. 改进ChildWin示例程序,在子窗口内显示出窗口特定信息(窗口ID号);尝试在每个子窗口中绘制特定颜色的矩形
    • 在子窗口的窗口过程函数的刷新处理消息中增添处理代码;
    • 用GetWindowLong函数取出子窗口ID;
    • 根据子窗口ID设定子窗口内需要显示的信息(使用wsprintf函数组织待显示的字符串)
    • 尝试在子窗口中绘制特定颜色的矩形(使用CreateSolidBrush、Rectangle函数)面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

     

2.跟踪消息传递过程

在Childwin的主窗口过程函数的WM_CREATE、WM_PAINT、WM_COMMAND、

    • WM_LBUTTONDOWN处设置断点
    • 在子窗口的WM_CREATE、WM_PAINT、WM_CHILDWIN、WM_LBUTTONDOWN处设置断点
    • 运行程序,查看各断点的响应过程,以此理解消息传递的次序

3.设计、实现一个软键盘

用子窗口实现一个软键盘(在窗口的客户区用子窗口绘制一个仿真的键盘),鼠标点击每个子窗口,可输入不同的字符。将输入的字符显示到窗口中。面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

4.在自己的工作目录中建立新工程用于控件测试〔可以将Easywin工程的easywin.c拷贝到新工程的目录中,修改文件名为ctltest.cpp(后缀名改为.cpp),编译、链接并使程序正常工作(包括修正编译错误)〕

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 

  • * 用Button完成4*所要求的软键盘实现。比较与原有实现的不同之处。
  • 创建各种类型的控件子窗口,包括static、edit、listbox、combobox、button、scrollbar等;在主窗口的窗口过程函数中增加相应的消息处理实现主窗口与子窗口的通信(可尝试设置控件的标题/内容,获取控件的标题/内容以及在控件有点击等操作时在主窗口给出提示)。面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 

  • 同步骤4,新建用于资源测试的工程。
  • 增加新的资源:光标、图标,并正确显示
    • 用资源编辑器编辑一个光标(彩色),注意删除资源中不需要的image类型,否则显示光标可能不正确。
    • 为光标设定热点(hot spot)
    • 用资源编辑器编辑一个图标
    • 修改注册窗口类的代码,使程序能正常使用自定义的光标和图标
    • 用DrawIcon函数,在WM_PAINT消息中增加处理,在窗口客户区中显示自定义的光标及图标。
    • 创建一个另外光标供后续实验步骤使用

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 

 面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

9. 增加菜单

  • 增加菜单
    • 菜单中建立一个菜单项命令以修改窗口使用的光标,可命名为“ChangeCursor”,对应的ID假设为ID_CHANGECURSOR
    • 修改注册窗口类的代码,使程序运行时能正确载入菜单
    • 换一种方式,通过修改创建窗口(CreateWindow的代码,使菜单能正确载入

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 

  • 增加菜单消息响应代码
    • 增加WM_COMMAND的消息处理
    • 参照第五章菜单示例代码中的处理方式,响应菜单命令
    • 对ID_CHANGECURSOR命令的响应为:改变窗口使用的光标,可以使用SetClassLong (hwnd,  GCL_HCURSOR,
                                 (LONG)LoadCursor((HINSTANCE)GetWindowLong(hwnd,  GWL_HINSTANCE),
                                                                             MAKEINTRESOURCE(IDC_CURSOR2) ) );

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 

  1. 处理鼠标右键,增加快捷菜单处理

右键发出的菜单命令同样是通过WM_COMMAND消息响应的,增加快捷菜单之后,程序应该能通过主菜单或快捷菜单两种方式发出同样的命令

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

 

  • 将本次实验做好的工程的编译、链接增加到程序构建使用的批处理文件中,用批处理文件一次性自动构建实验一、二、三的所有工程。

2.3问题及解决方案

  1. 在主窗口设置的光标无法在子窗口显示,为了在子窗口设置自己的光标,我使用了全局变量进行编写子窗口的光标程序;
  2. 由于paint中我使用了if条件语句,导致本软键盘第一个按键无法作用,按下后无法刷新,所以将所有字母向后移动一位(也可以不后移,设置全局变量代替if语句进行绘制判断即可);
  3. 快捷方式写好后无法运行,经检查为      g_hSubMenu = GetSubMenu(g_hMenu, 0);语句写在return语句后面,导致无法正常运行,但系统又无法报错。

3.实验总结

在本次试验中,我不仅将老师上课所讲的窗口知识和菜单知识进行实践的运用,掌握了绘制光标,绘制图标的能力,掌握了菜单的制作和使用、响应方式,快捷菜单的载入及使用方式,还通过上网搜索等方法了解了许多课外函数,如:GetCursorPos(),TrackPopupMenu()等。不仅锻炼了自己的独立思考能力还拓宽了眼界。文章来源地址https://www.toymoban.com/news/detail-468949.html

附录 关键代码
软键盘绘制代码:
case WM_PAINT:
		GetClientRect(hWnd, &rect);
		hdc = BeginPaint(hWnd, &ps);
		if (!(LOWORD(wParam) == nChildWin_ID))
		{
			string[n] = number + 65;
			n++;
			DrawText(hdc, string, n, &rect, DT_SINGLELINE);
			
			
		}	
		DrawIcon(hdc,1,1, LoadIcon(hin, MAKEINTRESOURCE(IDI_ICON1)));
		EndPaint(hWnd, &ps);
		return 0;
子窗口命中写入代码:
case WM_COMMAND:                
		if (!(LOWORD(wParam) == nChildWin_ID))
		{
			SendMessage((HWND)hChildWnd[nCol][nRow], WM_CHILDWIN, 0, 0L);

		
			nChildWin_ID = LOWORD(wParam);
			nCol = nChildWin_ID >> 4;
			nRow = (nChildWin_ID > 15) ? (nChildWin_ID - 4) : nChildWin_ID;
		}
		else
		{
			switch (wParam)
			{
			case ID_CHANGECURSOR:
				SetClassLong(hWnd, GCL_HCURSOR,
					(LONG)LoadCursor((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
						MAKEINTRESOURCE(IDC_CURSOR1)));
				break;
			
			}
		}
		InvalidateRect(hWnd, NULL, TRUE);
		return 0;
主窗口绘制菜单,光标,图形代码:
 wcMain.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
	wcMain.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE (IDC_CURSOR2));
	wcMain.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wcMain.lpszMenuName =  MAKEINTRESOURCE(IDR_MENU3);





改变光标菜单代码:
case WM_COMMAND:                 
			
		if (!(LOWORD(wParam) == nChildWin_ID))
		{
			SendMessage((HWND)hChildWnd[nCol][nRow], WM_CHILDWIN, 0, 0L);

			
			nChildWin_ID = LOWORD(wParam);
			nCol = nChildWin_ID >> 4;
			nRow = (nChildWin_ID > 15) ? (nChildWin_ID - 4) : nChildWin_ID;
		}
		else
		{
			switch (wParam)
			{
			case ID_CHANGECURSOR:
				SetClassLong(hWnd, GCL_HCURSOR,
					(LONG)LoadCursor((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
						MAKEINTRESOURCE(IDC_CURSOR1)));
				break;
			
			}
		}
		InvalidateRect(hWnd, NULL, TRUE);
		return 0;
右键快捷菜单代码:
	case WM_RBUTTONDOWN:
			GetCursorPos(&stPos);
			TrackPopupMenu(g_hSubMenu,TPM_LEFTALIGN,stPos.x,stPos.y,NULL,hWnd,NULL);
			break;

到了这里,关于面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面向对象分析(实验三)

    一开始12关,最后一关我是按照要求画的,结果头歌系统一直不给过,最后时间到了,我画过了,和我一开始的是一样的,头歌系统说是效率分然后不给开,最后只有33.3分,对头歌很失望,这个系统有太多问题,无法接受这样的结果 类图关系 1.依赖(Dependence) 依赖关系的定

    2024年02月05日
    浏览(37)
  • 再申明一次:面向对象编程不是面向人编程

    这个方法就我自己调用,所以就没封装... 这个RPC方法只有我自己写的代码会调用,日 期参数就用String了。因为我知道我会传“yyyy-MM-dd”格式的日期。 为了使用spring事务,我就把这两个插入数据的操作放到一个方法里了。 这个方法名还好吧,其他地方不调用。 这个返回值用

    2024年02月19日
    浏览(42)
  • 【Java语言面向对象】(1)面向过程编程

    人机猜拳的第一版(下方是程序源码) 人机猜拳(面向过程版本) 三部分组成 初始化 游戏开始 游戏数据统计 逐步完成,并阶段测试。 面向过程整体的思路:做一件事,分为多个步骤,每个步骤之间是有序的,最后按序完成。 面向过程的优缺点: 优点:符合人类思维,简

    2023年04月09日
    浏览(54)
  • 【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)

    🌈个人主页:  Aileen_0v0 🔥系列专栏: Java学习系列专栏 💫个人格言: \\\"没有罗马,那就自己创造罗马~\\\"   目录 回顾  构造方法  this 面试题 构造方法的类型  下节预告 代码块  之前我们学习了什么是类  什么是对象  什么是面向对象编程 定义类   构造方法 :它的方法名

    2024年02月05日
    浏览(55)
  • 面向对象设计原则实验之“接口隔离原则”

    客户端不应该依赖那些它不需要的接口。 实验一 考虑一个安全系统。在这个系统中,有一些Door对象,可以被加锁和解锁,并且Door对象知道自己是开着还是关着。这个Door编码成一个接口,这样客户程序就可以使用那些符合Door接口的对象,而不需要依赖于Door的特定实现。 现

    2024年04月12日
    浏览(52)
  • 再谈编程范式(3):理解面向过程/面向对象/函数式编程的精髓

    面向过程是随着VB一起来到我的世界,那个时候会的非常有限,感觉能把程序写出来自己就非常棒了,VB是做那种可视化界面,在工具栏拖个框框放到面板上,然后就在各个事件上写完整的逻辑,什么封装,抽象,继承一概不懂,就有一种一个方法把实现过程需要的逻辑都罗列

    2024年01月20日
    浏览(42)
  • Java面向对象程序设计实验报告(实验五 接口的练习)

    ✨ 作者:命运之光  ✨ 专栏: Java面向对象程序设计实验报告 ​ 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录:源程序代码(带注释) demo5类 Instrument类 Piano类 play类 Student类 Teacher类 Violin类 work类  实验五 接口的练习 实验

    2024年02月06日
    浏览(45)
  • 【C++】面向对象编程(二)面向对象的编程思维:virtual虚拟调用、继承、protected成员、派生类与基类

    默认情形下,成员函数的解析都是编译时静态进行。如果要让成员函数的解析在程序运行时动态进行,需要在成员函数的声明前加上virtual: 虚函数的作用: 用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,会调用 真正指向对象的成员函数 ,而

    2024年02月07日
    浏览(44)
  • C#复习:面向对象基本概念

    关于我C#的博客是根据刘铁猛老师的C#入门课程为基础写的,可以配合刘铁猛老师的课程一起观看,会由更好的理解! 所谓面向对象,在我看来, 就是把世界上的很多事物抽象成数据,方法等 ,举个例子 这是个汽车,这个汽车有发动机,变速器… 在面向对象的程序中,我们

    2024年02月07日
    浏览(41)
  • 2023.5.5 面向对象程序设计实验报告

    实验项目名称:模板 1、熟练掌握函数模板和类模板的定义格式。 2、熟练运用函数模板和类模板解决实际问题。 1、复数类Complex有两个数据成员:a和b, 分别代表复数的实部和虚部,并有若干构造函数和一个重载-(减号,用于计算两个复数的距离)的成员函数。 要求设计一个

    2024年02月02日
    浏览(117)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包