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

news2025/1/9 14:41:08

源自网络收集,仅供参考

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

实验题目

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

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

整体目的:理解、窗口之间的消息传送、调用栈;掌握光标、图标、菜单的制作和使用方式;掌握菜单的响应方式、快捷菜单的载入及使用方式;理解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创建工程

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

  1. 改进ChildWin示例程序,在子窗口内显示出窗口特定信息(窗口ID号);尝试在每个子窗口中绘制特定颜色的矩形
    • 在子窗口的窗口过程函数的刷新处理消息中增添处理代码;
    • 用GetWindowLong函数取出子窗口ID;
    • 根据子窗口ID设定子窗口内需要显示的信息(使用wsprintf函数组织待显示的字符串)
    • 尝试在子窗口中绘制特定颜色的矩形(使用CreateSolidBrush、Rectangle函数)

     

2.跟踪消息传递过程

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

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

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

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

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

 

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

 

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

 

 

 

 

 

9. 增加菜单

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

 

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

 

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

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

 

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

2.3问题及解决方案

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

3.实验总结

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

附录 关键代码
软键盘绘制代码:
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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/602610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAY08_JavaScrip

目录 1 JavaScript1.1 JavaScript简介1.2 JavaScript引入方式1.2.1 内联脚本1.2.2 内部脚本1.2.3 外部脚本 1.3 JavaScript基础语法1.3.1 书写语法1.3.2 输出语句1.3.3 变量1.3.4 数据类型1.3.5 运算符1.3.5.1 \和区别1.3.5.2 类型转换 1.3.6 流程控制语句1.3.6.1 if 语句1.3.6…

常见设计模式

单例模式 单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例,优点:不会频繁地创建和销毁对象,浪费系统资源。缺点是没有抽象层,难以扩展。 单例模式的常见写法: 饿汉式单例模式的写法&…

免安装版MySQL数据库的安装和卸载

说明:MySQL早些版本有分安装版和免安装版,可在官网(https://dev.mysql.com/downloads/mysql/)下载,推荐使用最新版本,是免安装版的,下载完配置一下就可以用。 推荐使用最新版本 安装 我这里以…

第3章“程序的机器级表示”:过程

文章目录 3.7 过程3.7.1 栈帧3.7.2 转移控制3.7.3 寄存器使用惯例3.7.4 过程示例3.7.5 递归过程 3.7 过程 一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分…

金融人不能错过的中国人民大学与加拿大女王大学金融硕士,你不能不知道

金融行业是一个发展飞速的行业,越来越多的优秀人士的涌入,让本就卷起来的金融行业变得异常拥挤,怎么办,想留有一席之地只能不断的提升与攀登,金融人不能错过的中国人民大学与加拿大女王大学金融硕士,你不能…

架构EA演进

架构演进 目录概述需求: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve den…

spring cloud搭建(service)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【C++】海量数据处理面试题(位图和布隆过滤器)

都是大厂面试题哦~ 文章目录 一.位图面试题 1.给定100亿个整数,设计算法找到只出现一次的整数 2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 3.1个文件有100亿个int,1G内…

等价类,边界值,场景法的使用方法和运用场景

等价类: 在很多情况下,很多人想到的测试方法是穷举测试,穷举测试是最全面的测试,但是数据量很大的情况下不太现实,测试效率太低,后来为了减少测试人员的工作量和提高测试的效率和以达到最好的测试质量&…

启明星辰集团CEO严望佳:与AI共生,共建以人为本的数字善治生态体系

近日,2023中国国际大数据产业博览会在贵阳成功召开。启明星辰集团董事长兼首席执行官严望佳应邀出席大会“数据安全产业高质量发展”高端对话,发表“主动应对ChatGPT技术冲击,加强数据安全风险防控”主题演讲,同与会人士共探数据安…

32.有序序列插入一个整数(刷题)

描述 有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。 输入描述: 第一行输入一个整数N(0≤N≤50)。 第二行输入N个升序排列的整数,输入用空格分隔的N个…

2023年前端面试题汇总-浏览器原理

1. 浏览器安全 1.1. 什么是 XSS 攻击? 1.1. 1. 概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。 XSS 的本质是因为网站没有对…

企业要从哪些方面着手进行数据安全治理?

什么是数据安全治理? 数据安全治理是指组织基于业务发展与合规要求,制定全面且系统的数据安全策略、流程与技术措施,对数据生命周期中的安全风险进行管控与优化的一系列管理活动。它需要从组织层面建立数据安全管理框架,保证敏感数…

2023-6-2-DIS研究

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

Java 列表导出

一、具体实现 import java.net.URLEncoder; import com.alibaba.excel.EasyExcel;List<实体> targets xxx; response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); String fileName URLEncoder.encode(&…

深入理解设计原则之里氏替换原则(LSP)

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 LSP&#xff1a;里氏替换原则 系列文章目录1、里氏替换原则的定义和解读2、里氏替换原则可以用于哪些设计模式中&#xff1f;3、如何使用里氏替换原则来降低代码耦合度&#…

Julia系列14:调用自定义C/C++库

1. 基础调用&#xff1a;ccall 调用的基本格式为&#xff1a; ccall((:函数名, 库地址), 输出格式, (输入格式列表), 输入数据) 下面是例子&#xff1a; 1.1 基础数据结构 1.2 数组 首先是输入数组&#xff0c;注意需要convert 接着是输出数组&#xff0c;需要使用unsafe…

《操作系统》—— 处理机调度算法

前言&#xff1a; 在之前的文章中&#xff0c;我们已经了解了进程和线程相关的基本概念&#xff0c;今天我们将要了解的是关于处理机调度相关的知识。 目录 &#xff08;一&#xff09;调度的概念 1、调度的基本概念 2、调度的层次 3、三级调度的关系 &#xff08;二&…

遗传算法(Genetic Algorithm)

本文为阅读《遗传算法原理及应用》的笔记和心得 ISBN&#xff1a;7-118-02062-1 遗传算法简介 遗传算法是模拟生物在自然环境中的遗传和进化过程中而形成的一种自适应全局优化概率搜索算法 总的来说&#xff0c;求最优解解或近似最优解的方法主要有三种&#xff1a;枚举法、启…

【PCB专题】Allegro设置禁止铺铜区域但仍可以走线和打过孔

在PCB设计中我们有时候需要做一些净空区,但是净空区内有一些走线和过孔。如果使用Route Keepout画一个框的话,那是不允许走线和打过孔的,会报DRC。 那么如何才能既禁止区域铺铜,又可以走线和打过孔不报DRC呢? Setup->Areas->Shape Keepout Options选择要禁止…