Windows编程基础--第2节 win32程序资源管理

2023-11-14

(操作系统:win10 64位 IDE:vc++ 6.0)
windows程序都有自己的资源,例如按钮,图标,对话框等等,这节介绍如何使用win32程序资源管理;
1、继续使用上节的win32程序demo,执行File->new添加资源,选择Files选项卡中的Resource Script,填写资源名,如图所示:
这里写图片描述
2、此时项目左侧会出现ResourceView视图,单击ResourceView中的根节点+号,会提示“This file is already open in an editor”,这时候关闭右边的day01.rc,再次打开就可以了;
这里写图片描述
3、在ResourceView节点day01 Resources节点上右击->Insert,选中Dialog
,单击“New”,创建一个对话框资源,创建成功之后如图:
这里写图片描述
4、在新建的对话框上右击选择属性(Properties),会弹出dialog的属性窗口,可以设置一些对话框的相关属性,如图
这里写图片描述
5、接下来我们做一个简单的BMI计算器(体重指数BMI=体重/身高的平方(国际单位kg/㎡)),拖动三个Edit分别用来显示身高,体重,BMI值,并设置属性ID,分别为:IDC_EDIT_SG、IDC_EDIT_TZ,IDC_EDIT_BMI,如图所示:
这里写图片描述
6、接下来切换到类视图(classView),双击WinMain入口函数,添加对话框语句:

DialogBox(hInstance,(LPCTSTR)IDD_DIALOG_BMI,NULL,DlGFUNC);

其中IDD_DIALOG_BMI为刚才添加的对话框属性ID,DlGFUNC为对话框的消息处理函数,
7、接下来我们添加DlGFUNC函数,如下:

BOOL CALLBACK DlGFUNC(HWND hwnd_dlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_COMMAND:
        switch(wParam)
        {
        case IDCANCEL:
            EndDialog(hwnd_dlg,IDCANCEL);
            break;
        case IDOK:
            {
                int nHeight= GetDlgItemInt(hwnd_dlg,IDC_EDIT_SG,NULL,TRUE);
                double dHeight = nHeight / 100.00;
                int nWeight = GetDlgItemInt(hwnd_dlg,IDC_EDIT_TZ,NULL,TRUE);
                double bmi = nWeight/(dHeight*dHeight);
                char buf[28];
                sprintf(buf, "%.3f", bmi);
                SetDlgItemText(hwnd_dlg,IDC_EDIT_BMI,buf);
            }
            break;
        }
        break;
    }
    return FALSE;
}

其中IDOK,和IDCANCEL为对话框确认按钮和取消按钮所触发消息,IDCANCEL关闭对话框,IDOK消息我们来获取身高和体重Edit中的值,并按照公式体重指数BMI=体重/身高的平方(国际单位kg/㎡)计算BMI,最后将BMI值设置到BMI Edit中:

                int nHeight= GetDlgItemInt(hwnd_dlg,IDC_EDIT_SG,NULL,TRUE);
                double dHeight = nHeight / 100.00;
                int nWeight = GetDlgItemInt(hwnd_dlg,IDC_EDIT_TZ,NULL,TRUE);
                double bmi = nWeight/(dHeight*dHeight);
                char buf[28];
                sprintf(buf, "%.3f", bmi);
                SetDlgItemText(hwnd_dlg,IDC_EDIT_BMI,buf);

注意:要在文件头部引用资源头文件:#include “resource.h”
最终效果如下:
这里写图片描述
附day01.cpp源码:

// day01.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include "stdio.h"


BOOL CALLBACK DlGFUNC(HWND hwnd_dlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_COMMAND:
        switch(wParam)
        {
        case IDCANCEL:
            EndDialog(hwnd_dlg,IDCANCEL);
            break;
        case IDOK:
            {
                int nHeight= GetDlgItemInt(hwnd_dlg,IDC_EDIT_SG,NULL,TRUE);
                double dHeight = nHeight / 100.00;
                int nWeight = GetDlgItemInt(hwnd_dlg,IDC_EDIT_TZ,NULL,TRUE);
                double bmi = nWeight/(dHeight*dHeight);
                char buf[28];
                sprintf(buf, "%.3f", bmi);
                SetDlgItemText(hwnd_dlg,IDC_EDIT_BMI,buf);
            }
            break;
        }
        break;
    }
    return FALSE;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    DialogBox(hInstance,(LPCTSTR)IDD_DIALOG_BMI,NULL,DlGFUNC);

    return 0;
}

后记:
DialogProc是一个窗口过程函数。该函数为一个应用程序定义可与DialogBox函数一起使用的回调函数。它处理发送到一个模态的或无模式对话框的消息。DLGPROC类型定义了一个指向此回调函数的指针。DialogProc函数是应用程序定义函数名的一个占位符。
函数原型:

BOOL CALLBACK DialogProc(
HWND hwndDlg,
UINT UMsg,
WPARAM wParam,
LPARAM lParam
);

hwndDlg
指定对话框。
uMsg
指定消息。
wParam
指定消息特定的其他信息。
Iparam
指定消息特定的其他信息。

项目源码可以访问我的码云来fork:

https://gitee.com/AmuUncle/MFC_CSDN.git
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows编程基础--第2节 win32程序资源管理 的相关文章

  • 如何使用最小起订量模拟私有只读 IList 属性

    我试图嘲笑这个列表 private readonly IList
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 当 foreach 块的内容具有 Conditional 属性时,C# 编译器是否会对其进行优化?

    我正在工作中编写一些调试代码 我想知道我所做的是否会损害性能 让我们看一下代码 foreach var item in aCollection Debug WriteLine item Name 我知道 Debug 类使用 Conditio
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • C# 实体框架我们应该使用 POCO.Id 还是仅使用 POCO 设置关系?

    我在服务方法中遇到一种情况 将 POCO 分配为另一个 POCO 的子对象无法按预期工作 我正在使用实体框架 4 public void ChangeOrderCurrency Currency currency order Currenc
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd

随机推荐

  • ubuntu-16.04 安装虚拟机工具时报错

    2019独角兽企业重金招聘Python工程师标准 gt gt gt root alex virtual machine home alex Desktop vmware tools distrib vmware install pl ope
  • Mathtype公式编辑软件 安装教程

    文章目录 1 MathType公式编辑器 介绍 2 MathType 安装 2 1 下载包 2 2 安装源程序 2 3 安装补丁 4 验证是否安装成功 我们再写论文时 一般都明确要求 公式必须用MathType编辑 所有公式必须在MathT
  • 什么是软件外包公司?要不要去外包公司?

    关注后回复 进群 拉你进程序员交流群 作者丨土豆居士 来源丨一口Linux ID yikoulinux 一 什么是外包 软件外包分为 人力外包和项目外包两个方向 1 劳务派遣 指的是把员工外派到对应的用工企业打 短工 比如很多工程师虽然签约
  • SpringBoot总结

    一 SpringBoot简介 1 入门案例 SpringMVC的HelloWord程序大家还记得吗 SpringBoot是由Pivotal团队提供的全新框架 其设计目的是用来简化Spring应用的初始搭建以及开发过程 原生开发SpringM
  • 153个!PCB板上的字母符号都代表啥?一图带你搞懂!

    PCB板是基于电路设计图而生产的 看过电路设计图的小伙伴都会知道 上面有各种物理电学标准符号 通过分析电路设计图 可以得知将使用哪些电子元器件 各元器件之间的关系 以及该电路具备哪些性能 为此 小编在网络上搜集了一些电工电路图常用的字母符号
  • 石锤!谷歌排名第一的编程语言,死磕这点,程序员都收益

    日本最大的证券公司之一野村证券首席数字官马修 汉普森 在Quant Conference上发表讲话 用Excel的人越来越少 大家都在码Python代码 甚至直接说 Python已经取代了Excel 事实上 为了追求更高的效率和质量 他们开
  • 数据结构与算法——马踏棋盘(c++栈实现)

    马踏棋盘问题是旅行商 TSP 或哈密顿问题 HCP 的一个特例 在国际棋盘棋盘上 用一个马按照马步跳遍整个棋盘 要求每个格子都只跳到一次 最后回到出发点 这是一个 NP问题 通常采用回溯法或启发式搜索类算法求解 在此采用栈进行回溯法求解 i
  • 嵌入式:驱动开发 Day4

    作业 通过字符设备驱动分步注册方式编写LED驱动 完成设备文件和设备的绑定 驱动程序 myled c include
  • OpenCASCADE:在 Android 上使用 OCCT AndroidQt 示例进行 C/C++ 开发

    OpenCASCADE 在 Android 上使用 OCCT AndroidQt 示例进行 C C 开发 在 Android 平台上进行 C C 开发是一项具有挑战性的任务 然而 通过使用 OpenCASCADE OCCT 库和 Andro
  • java linux mac,Java - 获取Linux系统的MAC地址

    I m trying to get the MAC address of a linux system with this code try ip InetAddress getLocalHost NetworkInterface netw
  • Jenkins-CI 远程代码执行漏洞(CVE-2017-1000353)

    Jenkins Jenkins是一个开源软件项目 是基于Java开发的一种持续集成工具 用于监控持续重复的工作 旨在提供一个开放易用的软件平台 使软件项目可以进行持续集成 漏洞描述 该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中
  • ES自己手动高亮

    背景 es的高亮真的是一言难尽 经常出现各种各样的高亮异常 如 高亮错位 高亮词错误等等 而且 用wildcardQuery 等 也无法高亮 可能是我技术不精吧 总是调不好这玩意 因此决定手写高亮 废话不多说 直接上代码 1 第一步 处理高
  • 方法调用:一看就懂,一问就懵?

    方法调用是不是很熟悉 那你真的了解它吗 今天就让我们来盘一下它 首先大家要明确一个概念 此处的方法调用并不是方法中的代码被执行 而是要确定被调用方法的版本 即最终会调用哪一个方法 上篇文章中我们了解到 class字节码文件中的方法的调用都只
  • CSS元素移动

    元素移动 2D平面移动 水平竖直移动 旋转 3D移动 3D旋转 立体正方体六面为图片 绕由原点指向某一定点的向量轴旋转 2D平面移动 水平竖直移动 水平竖直移动采用属性 transform中的translate x y 一起设置水平和竖直移
  • 使用 mdev 机制实现热插拔USB无线网卡 自动获取IP

    文章目录 实验环境 一 MDEV 机制 1 基本用法 2 MDEV 的配置文件 二 Kernel hotplug 三 wpa supplicant 使用方法 wpa cli 命令 四 DHCP 五 实现 1 开机脚本 2 创建 mdev 配
  • 机器人TF坐标系变换与一些可视化工具的应用

    TF坐标在ROS中是一个非常重要的概念 因为机器人在做日常操作任务的时候 对于其所在位置和朝向是需要时刻知道的 而机器人是由很多节点组成的协同任务 对于每个部件 我们需要知道它的位姿 位置和朝向 这使得坐标系就成为了一个很重要的问题 TF的
  • Unity查找物体的方法总结

    文章目录 前言 一 不能找到失活对象的方法 1 Object类中的静态方法 2 GameObject类中的静态方法 二 能找到失活对象的方法 1 Transform Find 2 如何通过Transform找到自己以下的任意对象 总结 前言
  • JavaScript 判断空对象空数组

    JavaScript 判断空对象空数组 一 为什么判断空数组空对象会比较麻烦 二 判断空数组的方法 三 判定空对象的方法 四 一个判断参数为空的函数封装 来源 https www jianshu com p cadcbab793d7 我们判
  • ADAS的八大系统

    简述 ADAS Advanced Driving Assistant System 即高级驾驶辅助系统 ADAS 是利用安装于车上的各式各样的传感器 在第一时间收集车内外的环境数据 进行静 动态物体的辨识 侦测与追踪等技术上的处理 从而能够
  • Windows编程基础--第2节 win32程序资源管理

    操作系统 win10 64位 IDE vc 6 0 windows程序都有自己的资源 例如按钮 图标 对话框等等 这节介绍如何使用win32程序资源管理 1 继续使用上节的win32程序demo 执行File gt new添加资源 选择Fi