Windows 资源文件(.rc文件)-程序员宅基地

技术标签: rc  rcfile  资源文件  

rc 是resource的简称,对应着VS中的资源视图文件。rc 文件是资源文件,包括比如对话框、菜单、图标、字符串、版本等资源信息。使用.rc 资源文件的目的是为了对程序中用到的大量的资源进行统一的管理。在win32编程中,为方便项目中的资源统一管理,提供了一个格式统一的资源文件,对各种资源进行管理。它的扩展名是.rc,在程序编译时它会被资源编译器编译生成一个.res的二进制文件。

这里写图片描述

rc文件的语法:

1、注释:注释方式和 C 语言相通,单行注释用 // 符号,多行注释用 /* ... */ 符号。

2、预处理命令:预处理指令包括一些头文件的引用(使用 #include ,也同 C 语言)。

3、编译指令:预定义(#define,常量和宏,不支持带参数的宏) 和 条件编译(#if, #ifdef, #undef, #ifndef, #else, #elif, #endif 等)。

4、资源定义声明:资源定义的声明中包括“资源”(Resources),"控件"(Controls) 和 “声明”(Statements) 3 类。

资源定义声明:

1.资源(Resources):“资源”具有资源 ID,在程序中可以使用 FindResource ,LoadResource,LoadMenu 等资源相关 API 来操作。常见的定义如下:

(1)从文件导入的资源类型:(BITMAP,ICON,HTML,FONT,CURSOR 等)

//格式:
nameID BITMAP filename
//例子:
IDI_ICON_MAIN       ICON       "res\\icon.ico"  //ICON RESOURCE

(2) 对话框资源类型:(DIALOG,DIALOGEX 等)(对话框可以包括若干子控件,如菜单,按钮等,定义语法如下)

//模板
nameID DIALOGEX x, y, width, height [ , helpID]] [[ optional-statements]]  {control-statements }
 
//例子
IDD_DIALOG_ABOUT DIALOGEX 0, 0, 290, 59        //DIALOGEX RESOURCE
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"        // CAPTION   STATEMENT
FONT 8, "MS Shell Dlg", 400, 0, 0x1        // FONT  STATEMENT
BEGIN
    LTEXT           "Windows Resource Demo",3001,26,14,119,8,SS_NOPREFIX    //  CONTROL
    LTEXT           "Copyright (C) 2008",3002,26,30,119,8                        //  CONTROL
    DEFPUSHBUTTON   "OK",IDOK,234,14,32,14,WS_GROUP                //  CONTROL
    DEFPUSHBUTTON   "Quit",IDCANCEL,234,31,32,14,WS_GROUP            //   CONTROL
END

(3) 菜单资源类型:

//定义:
//MENU:
menuID MENU [[optional-statements]] { item-definitions ... }
//POPUP:
POPUP text, [[optionlist]] { item-definitions ... }
 
//例子
//MENU:
IDR_MENU_MAIN MENU        //MENU RESOURCE
BEGIN
    POPUP "File"        // POPUP RESOURCE
    BEGIN
        MENUITEM "&Open",        ID_FILE_COPY    // MENUITEM  STATEMENT
        MENUITEM "&Save",        ID_FILE_SAVE40002// MENUITEM  STATEMENT
        MENUITEM SEPARATOR            // MENUITEM  STATEMENT
        MENUITEM "E&xit",         ID_FILE_EXIT  // MENUITEM  STATEMENT
    END
    POPUP "Eidt"        // POPUP RESOURCE
    BEGIN
        MENUITEM "&Copy",        ID_EIDT_COPY// MENUITEM  STATEMENT
        MENUITEM "&Paste",     ID_EIDT_PASTE// MENUITEM  STATEMENT
    END
    POPUP "Help"        // POPUP RESOURCE
    BEGIN
        MENUITEM "&About",    ID_HELP_ABOUT// MENUITEM  STATEMENT
    END
END
 
//POPUP:
IDR_MENU_POPUP MENU 
BEGIN
    POPUP "POPUP"
    BEGIN
        MENUITEM "&Copy",        ID_POPUP_COPY
        MENUITEM "&Paste",        ID_POPUP_PASTE
        MENUITEM "Cu&t",        ID_POPUP_CUT
        POPUP "&Info"
        BEGIN
            MENUITEM "Co&unt",         ID_INFO_A
            MENUITEM "&Size",            ID_INFO_B
        END
    END
END

(4)字符串表类型:

//定义
STRINGTABLE [[optional-statements]] {stringID string ...}
 
//例子
STRINGTABLE
BEGIN
IDS_1 L"5\x00BC-Inch Floppy Disk"
IDS_1a "5\xBC-Inch Floppy Disk"
IDS_2 L"Don't confuse \x2229 (intersection) with \x222A (union)"
IDS_3 "Copyright \xA92001"
IDS_3a L"Copyright \x00a92001"
END

(5)自定义类型:

nameID typeID filename
nameID typeID { raw-data }

2、控件(Controls):

//定义
<控件类型> text, id, x, y, width, height [[, style [[, extended-style]]]]
<控件类型>, id, x, y, width, height [[, style [[, extended-style]]]]
 
//例子
LTEXT           "Windows Resource Demo",3001,26,14,119,8,SS_NOPREFIX    //  CONTROL
LTEXT           "Copyright (C) 2008",3002,26,30,119,8                        //  CONTROL
DEFPUSHBUTTON   "OK",IDOK,234,14,32,14,WS_GROUP                //  CONTROL
DEFPUSHBUTTON   "Quit",IDCANCEL,234,31,32,14,WS_GROUP            //   CONTROL

3、声明(Statements)

根据资源的不同而不同,有的资源有“声明”,有的资源则没有,且每一种资源对应特定的声明。比如 MENU 的资源就会具有 MENUITEM 声明,用于指定菜单项;对话框资源(DIALOG,DIALOGEX)具有 CAPTION 声明,用于指定对话框标题。

另外:资源 ID 是一个资源或资源子项的唯一标识,很多资源和子项都具有标识。在上面的实例中,IDD_DIALOG_ABOUT ,ID_FILE_COPY 等都是资源 ID 。这些 ID 实际是有用户定义的常数,都定义在 Resource.h 头文件中。如下:

//{
   {NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Windows.rc
//
#define IDD_DIALOG_ABOUT                101
#define IDR_MENU_MAIN                   101
#define IDR_MENU_POPUP                  102
#define IDI_ICON_MAIN                   103
#define IDC_EDIT_ABOUT                  1001
#define ID_FILE_COPY                    40001
#define ID_FILE_SAVE40002               40002
#define ID_FILE_EXIT                    40003
#define ID_EIDT_COPY                    40004
#define ID_EIDT_PASTE                   40005
#define ID_HELP_ABOUT                   40006
#define ID_COPY_PASTE                   40007
#define ID_COPY_PASTE40008              40008
#define ID_POPUP_COPY                   40009
#define ID_POPUP_PASTE                  40010
#define ID_POPUP_CUT                    40011
#define ID_POPUP_INFO                   40012
#define ID_INFO_A                       40013
#define ID_INFO_B                       40014
 
// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        104
#define _APS_NEXT_COMMAND_VALUE         40015
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

在程序中使用资源:

case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                // 在“帮助”菜单中选择“关于”
            case ID_HELP_ABOUT:
                {
                    DialogBox(
                        hinst, (LPCTSTR)IDD_DIALOG_ABOUT, hwnd, (DLGPROC)About
                        );
                    return 0;
                }
            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
            }
        }

 
其中,如果处理的是 WM_COMMAND 消息时(当用户从菜单选中一个命令项目、当一个控件发送通知消息给去父窗口或者按下一个快捷键将发送 WM_COMMAND 消息),我们首先一般会用 LOWORD 宏来检查 wParam 参数,从而得出“菜单 ID”或“控件ID”,这两者都是资源 ID,像上面的 ID_HELP_ABOUT 和 IDD_DIALOG_ABOUT 都是资源 ID 。

在使用资源 ID 时经常会看到一个宏 MAKEINTRESOURCE ,这个宏的功能是将资源 ID 转换为资源名(字符串形式),很多 API 函数在引用资源时都是通过资源名来引用的。

图标

见 MSDNICON Resource一文:

格式:

nameID ICON filename

例子:

IDI_ICON1               ICON    "main.ico"
IDI_ICON2               ICON    "main2.ico"

其中:

nameID

16位无符号整数 或 唯一的名字

filename

如果不在工作目录下需要使用完整路径,需要使用引号扩住

版本信息(VERSIONINFO)

见MSDNVERSIONINFO ResourceVS_FIXEDFILEINFO Structure

格式:

versionID VERSIONINFO 
fixed-info
BEGIN
block-statement
. . .
END

其中,fixed-info 信息:

字段

实例值

 

FILEVERSION

1,0,0,0

文件版本,4个16位整数,(其实是2个32位整数)

PRODUCTVERSION

1,0,0,0

产品版本,同上

FILEFLAGS

0x0L

文件属性

FILEFLAGSMASK

0x0L

属性的掩模

FILEOS

VOS_NT_WINDOWS32

用于何种操作系统

FILETYPE

VFT_APP

文件一般类型(对于dll,类型为 VFT_DLL)

FILESUBTYPE

VFT2_UNKNOWN

细分的类型

对应的结构体:

typedef struct tagVS_FIXEDFILEINFO {
  DWORD dwSignature;
  DWORD dwStrucVersion;
  DWORD dwFileVersionMS;
  DWORD dwFileVersionLS;
  DWORD dwProductVersionMS;
  DWORD dwProductVersionLS;
  DWORD dwFileFlagsMask;
  DWORD dwFileFlags;
  DWORD dwFileOS;
  DWORD dwFileType;
  DWORD dwFileSubtype;
  DWORD dwFileDateMS;
  DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;

fix 字段后面是可变字段:

  • 0个或多个 StringFileInfo 结构

    • 1 个或多个 StringTable 结构

  • 0个或多个 VarFileInfo 结构

#include "winver.h"

IDI_ICON1       ICON      "main.ico"
IDI_ICON2       ICON      "main2.ico"

VS_VERSION_INFO VERSIONINFO
 FILEVERSION    1,0,0,0
 PRODUCTVERSION 1,0,0,0
 FILEFLAGS      0x0L
 FILEFLAGSMASK  0x3fL
 FILEOS         VOS_NT_WINDOWS32
 FILETYPE       VFT_APP
 FILESUBTYPE    VFT2_UNKNOWN
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000004b0"
        BEGIN
            VALUE "CompanyName", "Hermes Microvision Inc"
            VALUE "FileDescription", "HMI Image EZ USB(2rd)"
            VALUE "FileVersion", "1.0.0.0"
            VALUE "LegalCopyright", "Copyright (C) 2009-2011 Hermes Microvision Inc"
            VALUE "InternalName", "hmiezusb"
            VALUE "OriginalFilename", "hmiezusb"
            VALUE "ProductName", "HMI Image EZ USB(2rd)"
            VALUE "ProductVersion", "1.0.0.0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0, 1200
    END
END

参考

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fuhanghang/article/details/116302561

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签