在CodeBolcks+Windows API下的C++面向对象的编程教程——给你的项目中添加头文件和菜单

news/2024/12/17 12:13:11/文章来源:https://www.cnblogs.com/lexyao/p/18612052

0.前言

我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。

了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:

学习编程从游戏开始 - lexyao - 博客园

这是一篇专题文章,这篇文章是用来讲解下面这篇文章用到的知识的,我在这篇文章中讲解程序使用的例子就是在下面这篇文章中创建的oTetris项目:

在CodeBolcks+Windows API下的C++面向对象的编程教程——用面向对象的方法改写用向导创建一个Windows GUI项目(oTetris) - lexyao - 博客园

在这篇文章里,我主要讲述以下几个方面的内容:

  1. 给项目添加资源文件和头文件
  2. aTetris项目中添加菜单的代码分析
  3. oTetris项目中添加菜单的方法
  4. oTetris和aTetris项目添加菜单的代码对比
  5. 结束语

 

1.给项目添加资源文件和头文件

在Win32 GUI项目中,要给应用程序添加菜单,需要做以下几个方面的工作:

  1. 先创建一个头文件(.h),在头文件中定义菜单项的命令ID(数字常数)
  2. 再创建一个资源文件,在资源文件中添加菜单资源
  3. 再cpp文件中修改代码,将菜单添加到应用程序中

以上工作在aTetris项目中已经做过了,在oTetris项目中直接使用aTetris的头文件和资源文件就行了。创建头文件、资源文件的过程请看下面的文章:

在CodeBolcks+Windows API下的C++编程教程——给你的项目中添加头文件和菜单 - lexyao - 博客园

在这里直接使用aTetris的文件,不用修改。具体操作包括以下步骤:

  1. 将头文件和资源文件添加到oTetris项目
  2. 在cpp文件中包含头文件
  3. 在cpp文件中添加使用菜单资源的代码

首先是添加头文件和资源文件,操作如下:
在CodeBlocks的项目列表中鼠标右击oTetris项目->在菜单中选择“Add files...”->选择aTetris项目的aTetris.h和aTetris.rc添加到oTetris项目中。

在oTetrisMain.cpp文件的头部添加以下代码包含头文件:

#include "aTetris.h"

剩下的就是添加使用菜单的代码了。

2.aTetris项目中添加菜单的代码分析

aTetris项目使用菜单的代码是在入口函数WinMain中定义主窗口类数据的时候添加的。aTetrisMain.cpp中的代码如下:

int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{......WNDCLASSEX wincl;        /* Data structure for the windowclass *//* The Window structure */......wincl.lpszMenuName = _T("aTetris"); //wincl.lpszMenuName = NULL;                /* No menu */....../* Register the window class, and if it fails quit the program */if (!RegisterClassEx (&wincl))return 0;......
}

在程序入口函数WinMain中使用下面语句将资源文件中菜单资源的名称“aTetris”赋值给窗口结构的wincl.lpszMenuName。

wincl.lpszMenuName = _T("aTetris");

没有添加菜单的时候这个语句的赋值是NULL:

wincl.lpszMenuName = NULL;                /* No menu */

 

3.oTetris项目中添加菜单的方法

在oTetris项目中要实现同样的方法只需要添加下面代码中的红色语句:

void MainWindow::WindowClassEx(PWNDCLASSEX wc)
{wc->lpszMenuName = _T("aTetris");wc->hbrBackground = (HBRUSH) COLOR_BACKGROUND;
}

其中的WindowClassEx是我们在基类BaseWindow中添加了纯虚函数后在MainWindow中添加的实现。

以下是使用WindowClassEx的代码:

template <class DERIVED_TYPE>
BOOL BaseWindow<DERIVED_TYPE>::Create(PCWSTR lpWindowName,DWORD dwStyle,DWORD dwExStyle,int x ,int y,int nWidth ,int nHeight,HWND hWndParent,HMENU hMenu
)
{
    WNDCLASSEX wc = {0};......WindowClassEx(&wc);if (!RegisterClassEx(&wc))return 0;......
}

从代码看,aTetris和oTetris项目中设置菜单的代码执行的位置是一样的,只是代码的表现形式不一样罢了。

4.oTetris和aTetris项目添加菜单的代码对比

在前面的内容中已经对aTetris和oTetris项目中设置菜单的代码进行了对比,采用的方法、使用的位置是一样的。
不同点在于:

  • aTetris在程序的入口函数中直接加入,代码简单、明了,比较容易看懂
  • oTetris在子类中重载基类的纯虚函数的代码中,看起来不那么直观,但了解了程序执行的流程后就明白了

从这个简单的代码来看,看不出面向对象的优势,甚至还会觉得面向对象的编程方法把简单的事情搞得复杂了。真的是这样吗?
或许使用的多了才会感觉到:面向对象的的编程方法把简单的事情搞得复杂了,把复杂的事情搞得简单了。

 

5.结束语

从添加菜单的代码来看,没有看出面向对象的编程有什么优势,甚至比面向过程的方法更复杂。或许真的是这样。不过,面向对象的编程技术是用来解决复杂问题的,目的是代码的重复利用。使用的越多的代码在面向对象的方法中国表现的越有优势。
面向过程将数据和代码都摆在同一个层面上,都是看得见的。
面向对象的方法将数据和代码打包封装在类里,你只需要知道类的接口就可以使用,而不需要类的内部做了什么。
在将来当你的程序越来越大的时候,你会体验到面向对象编程的魅力。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-实现组件是否显示还是隐藏

比如我们在home页面需要这个标签在city页面不需要这个标签我们可以在router里面添加meta属性在需要的组件页面导入route实力获取meta属性的值

教育行业办公软件排行榜揭晓!J 人备考该选谁?

在教育领域,高效的办公软件对团队协作和个人学习意义重大。尤其对于 J 人,其偏好秩序与规划,可视化团队协作办公软件能助其在教育教培团队运作和个人公考备考中精准把控进程。本文将盘点 6 款此类软件,助力相关人士做出合适选择。 一、板栗看板 板栗看板是教育办公软件中的…

github克隆代码报错

报错一: git clone https://github.com/PanJiaChen/vue-admin-template.git报错 Cloning into vue-admin-template... fatal: unable to access https://github.com/PanJiaChen/vue-admin-template.git/: Failed to connect to github.com port 443 after 21219 ms: Timed out…

Vulnhub 靶场 DevGuru: 1

前期准备 靶机地址:https://www.vulnhub.com/entry/devguru-1,620/ kali攻击机IP:192.168.11.128 靶机IP:192.168.11.130 一、信息收集 1.使用nmap对目标靶机进行扫描开了 22、80、8585 端口。发现 git 目录,且提示做解析: 192.168.11.130 devguru.local 2. 80 端口发现用…

proxifier 抓取指定客户端软件数据包

背景 想要抓取指定Windows 客户端软件的数据包;过滤掉全局代理的无序数据包。 下载地址 https://www.proxifier.com/ 配置步骤 1. 配置 Proxy Servers2. 代理服务配置 3.Proxification Rules 配置需要监听的小程序,选择上一步配置的代理服务 任务管理器章选择想要抓包的进程…

深度学习一些基础知识

1、过拟合问题 1、数据增强 对图像进行旋转、翻转、裁剪等操作,创造出更多样的数据样本。 2、正则化 凡是能解决模型泛化误差而不是训练误差的方法,都被称为正则化。模型的泛化误差主要是由模型过拟合引起的,所以正则化的各种方法用于解决模型过拟合的问题。 L1和L2正则化:…

ABB机器人驱动器维修

ABB机器人维修驱动器是机器人的重要组成部分,负责将电信号转换为机器人关节的精确运动。驱动器一旦出现故障,机器人的运动将受到影响,导致定位不准确、速度波动等问题,严重影响生产线的稳定性和效率。因此,驱动器维修对于保障机器人的正常运行至关重要。一、ABB机器人驱动…

系统架构设计师学习

一、瀑布模型瀑布模型特点: 1.严格区分阶段,每个阶段因果关系紧密相连 2.只适合需求明确的项目 缺点: 1.软件需求完整性、正确性难确定 2.严格串行化,很长时间才能看到结果 3.瀑布模型要求每个阶段一次性完全解决该阶段工作,这不现实

IDEA中代码写错了,如何回到某个节点?

前言 大家好,我是小徐啊。我们在使用IDEA开发Java应用的时候,经常遇到的一个问题,就是有时候代码写错了,想要全部回退,或者回退到某个节点。这个在Git里面是可以操作的,但是如果没有纳入Git管理的代码的话,就不行了。好在,IDEA中,有很好的历史回退功能,今天小徐就来介…

cobbler无人值守安装系统(补鞋匠)

前言官网:https://cobbler.github.io/ Cobbler 是一个快速网络安装 Linux 的服务,而且经过调整也可以支持网络安装 Windows。 该工具使用 Python 开发,小巧轻便(才 15 k 行 Python 代码),使用简单的命令即可完成PXE网络安装环境的配置, 同时还可以管理 DHCP、DNS、TFTP、…

电商团队如何高效协作?多人协同编辑文档成关键!

在电商行业中,团队协作的重要性不言而喻。从选品策略到营销策划,再到库存管理与客户服务,每一个环节都需要各部门紧密配合。作为一支电商团队,如何高效处理信息、优化沟通,决定了运营效率与市场竞争力。而其中一个被忽视却至关重要的工具,就是多人协同编辑文档。 电商团队…