面向对象编程 实验三 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创建工程

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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Netty】Netty中的超时处理与心跳机制(十九)

文章目录 前言一、超时监测二、IdleStateHandler类三、ReadTimeoutHandler类四、WriteTimeoutHandler类五、实现心跳机制5.1. 定义心跳处理器5.2. 定义 ChannelInitializer5.3. 编写服务器5.4. 测试 结语 前言 回顾Netty系列文章: Netty 概述(一&#…

内存栈与CPU栈机制

1. 内存栈: 先入后出,LIFO(LAST IN FIRST OUT) 入栈:将一个新的元素放到栈顶 出栈:从栈顶取出一个元素 栈顶元素总是最后一个入栈,需要时出栈. 2.CPU栈机制 8086CPU提供相关指令以栈方式来访问内存空间.相当于将一段内存当做栈来使用 8086CPU提供的入栈指令为:PUSH ,出栈指令为…

JointJS+ v3.7 Crack

JointJS v3.7 改进了对 SVG 上下文中的外部对象的支持。 2023 年 5 月 30 日 - 16:00 新版本 特征 改进了对外部对象 (HTML) 的支持- 外部对象已成为 Web 开发的标准,JointJS 现在已经在 SVG 上下文中引入了对外部对象的全面且功能齐全的支持。这意味着您现在可以在…

Elasticsearch 8.8.0 发布

Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 基于 Java 开发,并在 SSPL Elastic License 双重授权许可下作为开源软件发布。 Elasticsearch 8…

win10系统如何设置虚拟回环

在日常生活中,人们(特别是IT行业者)通常需要在一台机上进行软件测试,而同一台计算上通常只能使用一个地址,而在需要同时使用两个地址进行测试的时候就显得捉襟见肘。此方法通过配置window10自带的环回适配器,达到上述目的。 win1…

如何使用Kali进行信息收集?

渗透测试即模拟黑客入侵的手段对目标网络进修安全测试,从而发现目标网络的漏洞,对目标网络进行安全加固与漏洞修复。 Kali 是一个基于 debian 的渗透测试平台,其中集成了很多常见的和不常见的渗透测试工具,如下图: 工…

基于SSM的服装设计供需系统设计与实现

摘 要:作为服装设计的重要形式之一,服装具有显著的审美性,是人类情感表达不可忽视的代表形态。但在新时期背景下,随着服装设计的进一步优化,服装设计创新融合强度也随之增强。本文就服装设计供需系统进行深入探究。 服…

Linux之命令搜索

目录 Linux之命令搜索 Whereis命令 定义 基本信息 举例 which命令 定义 与whereis命令的区别 基本信息 举例 locate 命令 定义 优点 缺点 基本信息 案例 Linux之命令搜索 Whereis命令 定义 whereis --- 搜索系统命令的命令(像绕口令一样&#xff09…

数据库新闻速递 明白3中主流的数据迁移方法 (译)

头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共8…

ShardingSphere笔记(三):自定义分片算法 — 按月分表·真·自动建表

ShardingSphere笔记(二):自定义分片算法 — 按月分表真自动建表 文章目录 ShardingSphere笔记(二):自定义分片算法 — 按月分表真自动建表一、 前言二、 Springboot 的动态数据库三、 实现我们自己的动态数…

MySQL查询当前数据和上一行数据比较、业务数据的趋势分析、数据变动的监控和报警

标题: 使用MySQL查询当前数据和上一行数据比较的场景 在MySQL中,我们经常需要对数据进行比较和分析。其中一种常见的需求是查询数据列表并与前一行的数据进行比较。这种场景可以通过使用窗口函数或连接来实现。本文将介绍使用MySQL查询比较数据和上一行数据的场景&a…

计算机组成原理-指令系统-指令格式及寻址方式

目录 一、指令的定义 1.1 扩展操作码指令格式 二、指令寻址方式 2.1 顺序寻址 2.2 跳跃寻址 三、 数据寻址 3.1 直接寻址 3.2 间接寻址 3.3 寄存器寻址 ​ 3.4 寄存器间接寻址 3.5 隐含寻址 3.6 立即寻址 3.7 偏移地址 3.7.1 基址寻址 3.7.2 变址寻址 3.7.3 相对寻址…

【C++】右值引用和移动语义(详细解析)

文章目录 1.左值引用和右值引用左值引用右值引用 2.左值引用和右值引用的比较左值引用总结右值引用总结 3.右值引用的使用场景和意义知识点1知识点2知识点3知识点4总结 4.完美转发万能引用见识完美转发的使用完美转发的使用场景 1.左值引用和右值引用 传统的C语法中就有引用的…

【SpringCloud】SpringAMQP总结

文章目录 1、AMQP2、基本消息模型队列3、WorkQueue模型4、发布订阅模型5、发布订阅-Fanout Exchange6、发布订阅-DirectExchange7、发布订阅-TopicExchange8、消息转换器 1、AMQP Advanced Message Queuing Protocol,高级消息队列协议。是用于在应用程序之间传递业务…

Java设计模式(三)

系列文章目录 迪米特法则 合成复用原则 设计原则核心思想 文章目录 系列文章目录前言一、迪米特法则1.迪米特法则基本介绍2.迪米特法则注意事项和细节 二、合成复用原则1.合成复用原则基本介绍 三、设计原则核心思想总结 前言 大家好呀,欢迎来到柚子的博客~让我们…

CAPL(vTESTStudio) - CAPL、CANoe、Panel联动

目录 一、变量设置 ① dbc文件中的Environment variables变量

图灵完备游戏:信号计数 解法记录

使用1个全加器 2个半加器完成。这关的思想主旨在于如何把输出4,输出2,输出1的情况统一在一根导线上。 首先用一个全加器来完成输入2-4这三个引脚的计数,因为全加器输出范围二进制是00 - 11,而输入正好有两个引脚数位是2和1&…

高压放大器在大学教研领域的实际应用

在大学教研领域中,高压放大器可以用于多种实际应用。下面将介绍其中几个典型的应用场景。 1、激光切割 适用高校学院:机械学院 应用场景:机械制造、各类材料的切割 2、超声雾化 适用高校学院:医学院、机械学院、物理学院 应用场景…

《Spring Guides系列学习》guide31 - guide34 及中期简单回顾

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

使用 GitHub Actions 自动部署 Hexo 个人博客

文章目录 申请 GitHub Token源码仓库配置 Github Action重新设置远程仓库和分支查看部署 每次部署 Hexo 都需要运行 hexo cl & hexo g & hexo d 指令三件套完成推送到远程仓库,随着文章越来越多,编译的时间也会越来越长,通过 Github …