目录

  • 版权
  • Original
  • test.rc 资源文件
  • 编译资源文件
  • 编译程序
  • 改用int 标志资源
  • .RC常见问题
    • 忘记include 头文件
    • 头文件里忘记define 常量
    • DIALOG x/y 坐标为-1
  • 附录
    • 代替的资源编辑器
    • ICONDEMO.C 源码

版权

本文为原创, 遵循 CC 4.0 BY-SA 版权协议, 转载需注明出处: https://blog.csdn.net/big_cheng/article/details/127183433.

Original

最近在学习Charles Petzold 的《Programming Windows》第五版. 第10 章"Menus and Other Resources" 开始用到资源文件(用来定义界面布局元素, 图标, 国际化字符串等). 但书中是Visual Studio, 而本地是mingw-w64 + Eclipse CDT. 经摸索可以如下使用资源文件(用10-1 ICONDEMO 程序做试验).

test.rc 资源文件

在ICONDEMO.C 同一目录放置编辑好的ICONDEMO.ICO 图标文件; 再创建一个test.rc 资源文件:

desk1 ICON "ICONDEMO.ICO"

在C 中用字符串"desk1" 引用该资源:

......
wndclass.hIcon = LoadIcon(hInstance, TEXT("desk1"));
......
hIcon = LoadIcon(hInstance, TEXT("desk1"));

编译资源文件

在该目录:

C:\Users\ASUS\eclipse-workspace\HelloWorld>where windres
C:\msys64\mingw64\bin\windres.exe
C:\Users\ASUS\eclipse-workspace\HelloWorld>windres -i test.rc -o test.o -v --use-temp-file

生成test.o 文件.

注意: 一定要使用"--use-temp-file" 选项, 否则(默认用popen/管道) 总是会报错:

C:\Users\ASUS\eclipse-workspace\HelloWorld>windres -i test.rc -o test.o
windres: test.rc:2: syntax error
test.rc:1: fatal error: when writing output to : Invalid argument1 | desk1 ICON "ICONDEMO.ICO"|
compilation terminated.
windres: preprocessing failed.

编译程序

进入"Debug" 子目录编译:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -o ICONDEMO.o "..\\ICONDEMO.C"g++ -mwindows -o HelloWorld.exe ICONDEMO.o "..\\test.o"

生成HelloWorld.exe.

改用int 标志资源

test.rc:

1 ICON "ICONDEMO.ICO"

C:

......
wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(1));
......
hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(1));

.RC常见问题

忘记include 头文件

例如"VK_BACK" 是Windows 常量, 需include windows.h:

#include <windows.h>......POPPAD2 ACCELERATORS
BEGINVK_BACK,       IDM_EDIT_UNDO,      VIRTKEY, ALT, NOINVERT

例如"IDM_FILE_NEW" 由程序自定义, 需include 所在头文件(“POPMENU.H”):

#include "POPMENU.H"......MENUITEM "&New", IDM_FILE_NEW

头文件里忘记define 常量

例如11-11 POPPAD3 的头文件"RESOURCE.H" 里没有定义常量"IDC_STATIC", 而在"POPPAD.RC" 里用到了:

......ICON "POPPAD",IDC_STATIC,7,7,20,20

用windres 编译时将总是出错.

DIALOG x/y 坐标为-1

例如11-9 HEXCALC 的"HEXCALC.DLG" 里:

HexCalc DIALOG −1, −1, 102, 122
......

编译将报错. 改成0 后可以.

附录

代替的资源编辑器

可以尝试resource hacker:
http://www.angusj.com/resourcehacker/

ICONDEMO.C 源码

/*−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−ICONDEMO.C −− Icon Demonstration Program(c) Charles Petzold, 1998−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−*/#include <windows.h>
//#include "resource.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) {static TCHAR szAppName[] = TEXT("IconDemo");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;
//  wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(1));wndclass.hIcon = LoadIcon(hInstance, TEXT("desk1"));wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)) {MessageBox(NULL, TEXT("This program requires Windows NT!"),szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindow(szAppName, TEXT("Icon Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {static HICON hIcon;static int cxIcon, cyIcon, cxClient, cyClient;HDC hdc;HINSTANCE hInstance;PAINTSTRUCT ps;int x, y;switch (message) {case WM_CREATE:hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
//      hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(1));hIcon = LoadIcon(hInstance, TEXT("desk1"));cxIcon = GetSystemMetrics(SM_CXICON);cyIcon = GetSystemMetrics(SM_CYICON);return 0;case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);for (y = 0; y < cyClient; y+= cyIcon)for (x = 0; x < cxClient; x += cxIcon)DrawIcon(hdc, x, y, hIcon);EndPaint(hwnd, &ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}

PW系列 | 用windres 编译.rc 资源文件相关推荐

  1. VC2010打开资源视图时提示“指南必须指定类型”,.rc资源文件损坏(转)

    VC: 打开资源视图时提示"指南必须指定类型 "(Guideline--specify type) ,.rc资源文件损坏 可能是TFS导致的 使用记事本打开.rc文件,找到&quo ...

  2. WIN32编程之.rc资源文件的使用

    引言: 首先,如果学习标C,黑窗口程序,真的没有必要非要用VC: 那么问题来了:学习WIN32是否需要用VC? 我的答案是:不是非要VC不可,其它IDE也可以用来学WIN32: 甚至我一度以为的学到时 ...

  3. VC++创建.rc资源文件

    初学MFC,对资源文件总是很困惑.一上来就直接自动生成了那么多的东西,尤其是.rc和resource.h文件.这两天了解了一下这个方面,在这里分享一下,欢迎交流学习. 1.前两天看了一个关于MFC初始 ...

  4. 恢复Reflector反编译后资源文件的办法

    反编译问题: 1.路径问题:如果遇到了Path.Combine,有错误改下即可 2.资源文件问题: 在Reflector下,对左边的资源管理窗口的Resources文件夹下的资源文件,进行右键点击,选 ...

  5. android 反编译替换资源文件,[求助]想替换微信5.0的一个语言包,但是反编译资源文件出现错误。...

    想为微信5.0中替换进去一个少数民族语言包,但是反编译时出现大量以下类似的错误,而且无法正确回编译,试过了基本所有apktool的版本都无法解决,无奈只能求助各位前辈,请告知解决此问题的方法或思路.谢 ...

  6. android资源编译失败,Android Studio 3.0,AAPT2编译失败 – 资源文件中的dimen无效

    我在Arch Linux上使用 Android Studio 3.0 Canary 3,我正在尝试制作一个小应用程序. 在发布问题之前进行了一些研究,但我发现的解决方案都不适用于我. 任何帮助将非常感 ...

  7. android studio aapt err,Android Studio 3.0,AAPT2编译失败 – 资源文件中的dimen无效

    我在Arch Linux上使用 Android Studio 3.0 Canary 3,我正在尝试制作一个小应用程序. 在发布问题之前进行了一些研究,但我发现的解决方案都不适用于我. 任何帮助将非常感 ...

  8. Qt的qrc资源文件在Visual studio编译出的Qt程序中不能显示问题解决

    这种情况一般是qrc资源文件没编译或资源文件如图片等不存在导致,在Visual studio项目上,单击鼠标右键,在弹出的右键中选择"添加--->新建筛选器",将新建的文件夹 ...

  9. vb编程的好帮手--资源文件

    各位vb高手, 你一定也常常因苦于无法组织本人程序中大量的picture, 而头痛不已, 那就让小生为各位介绍一下vb编程的好帮手--资源文件. 所谓资源文件, 就是指将在程序运行时用到的资源集中在一 ...

最新文章

  1. 人本质要好,要善良,要真诚,有格局和胸怀,有能力,有眼光,能讲故事,能找到人,能搞到钱...
  2. 在Java中使用Spliterator
  3. URAL 1033 Labyrinth
  4. ecshop始终显示全部分类
  5. 普林斯顿微积分读本-[美]阿德里安·班纳著-修订版;杨爽, 赵晓婷, 高璞译
  6. Android实现友盟分享小程序
  7. android 10 多开,多开分身安卓10版
  8. 电脑出问题解决办法(Win7)
  9. 华为机试【机器人走迷宫】
  10. 深度学习AI美颜系列----人像静态/动态贴纸特效算法实现
  11. 中国大学MOOC大学生心理健康试题及答案
  12. word2019安装mythtype后出现“不受信任的位置及禁用宏”问题解决办法
  13. 计算机组成原理 关于CPU中的LDAC和STAC指令
  14. eclipse中字体大小及背景颜色设置
  15. Java——计算用户输入的日期离1900年1月1日相距多少天
  16. synergy官方linux使用教程,Linux下安装synergy
  17. 《十周成为数据分析师》笔记——业务线 第三节 不做只懂技术不懂业务的“工具人”
  18. 敏捷开发 - 每日站立会议
  19. jfreechart学习笔记三 带刻度的蜘蛛图
  20. HOLUX M1200-E 蓝牙GPS轨迹记录器的历史轨迹数据读取

热门文章

  1. 解决Program received signal SIGSEGV, Segmentation fault.的辛酸
  2. 关于QT显示SIGSEGV报错的解决方法
  3. Django模型类与后台管理
  4. 二类分类器构造多类分类器
  5. jar 打包java文件
  6. Cognos问题解决
  7. 神经元模型 Izhikevich Model
  8. 这 7 门 编程语言最适合新手学习
  9. (文末福利)如果代码莫名其妙跑起来了,就不要去动它了……吗?
  10. 常见的 @Transactional 注解,你确定用对了吗?