PW系列 | 用windres 编译.rc 资源文件
目录
- 版权
- 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 资源文件相关推荐
- VC2010打开资源视图时提示“指南必须指定类型”,.rc资源文件损坏(转)
VC: 打开资源视图时提示"指南必须指定类型 "(Guideline--specify type) ,.rc资源文件损坏 可能是TFS导致的 使用记事本打开.rc文件,找到&quo ...
- WIN32编程之.rc资源文件的使用
引言: 首先,如果学习标C,黑窗口程序,真的没有必要非要用VC: 那么问题来了:学习WIN32是否需要用VC? 我的答案是:不是非要VC不可,其它IDE也可以用来学WIN32: 甚至我一度以为的学到时 ...
- VC++创建.rc资源文件
初学MFC,对资源文件总是很困惑.一上来就直接自动生成了那么多的东西,尤其是.rc和resource.h文件.这两天了解了一下这个方面,在这里分享一下,欢迎交流学习. 1.前两天看了一个关于MFC初始 ...
- 恢复Reflector反编译后资源文件的办法
反编译问题: 1.路径问题:如果遇到了Path.Combine,有错误改下即可 2.资源文件问题: 在Reflector下,对左边的资源管理窗口的Resources文件夹下的资源文件,进行右键点击,选 ...
- android 反编译替换资源文件,[求助]想替换微信5.0的一个语言包,但是反编译资源文件出现错误。...
想为微信5.0中替换进去一个少数民族语言包,但是反编译时出现大量以下类似的错误,而且无法正确回编译,试过了基本所有apktool的版本都无法解决,无奈只能求助各位前辈,请告知解决此问题的方法或思路.谢 ...
- android资源编译失败,Android Studio 3.0,AAPT2编译失败 – 资源文件中的dimen无效
我在Arch Linux上使用 Android Studio 3.0 Canary 3,我正在尝试制作一个小应用程序. 在发布问题之前进行了一些研究,但我发现的解决方案都不适用于我. 任何帮助将非常感 ...
- android studio aapt err,Android Studio 3.0,AAPT2编译失败 – 资源文件中的dimen无效
我在Arch Linux上使用 Android Studio 3.0 Canary 3,我正在尝试制作一个小应用程序. 在发布问题之前进行了一些研究,但我发现的解决方案都不适用于我. 任何帮助将非常感 ...
- Qt的qrc资源文件在Visual studio编译出的Qt程序中不能显示问题解决
这种情况一般是qrc资源文件没编译或资源文件如图片等不存在导致,在Visual studio项目上,单击鼠标右键,在弹出的右键中选择"添加--->新建筛选器",将新建的文件夹 ...
- vb编程的好帮手--资源文件
各位vb高手, 你一定也常常因苦于无法组织本人程序中大量的picture, 而头痛不已, 那就让小生为各位介绍一下vb编程的好帮手--资源文件. 所谓资源文件, 就是指将在程序运行时用到的资源集中在一 ...
最新文章
- 人本质要好,要善良,要真诚,有格局和胸怀,有能力,有眼光,能讲故事,能找到人,能搞到钱...
- 在Java中使用Spliterator
- URAL 1033 Labyrinth
- ecshop始终显示全部分类
- 普林斯顿微积分读本-[美]阿德里安·班纳著-修订版;杨爽, 赵晓婷, 高璞译
- Android实现友盟分享小程序
- android 10 多开,多开分身安卓10版
- 电脑出问题解决办法(Win7)
- 华为机试【机器人走迷宫】
- 深度学习AI美颜系列----人像静态/动态贴纸特效算法实现
- 中国大学MOOC大学生心理健康试题及答案
- word2019安装mythtype后出现“不受信任的位置及禁用宏”问题解决办法
- 计算机组成原理 关于CPU中的LDAC和STAC指令
- eclipse中字体大小及背景颜色设置
- Java——计算用户输入的日期离1900年1月1日相距多少天
- synergy官方linux使用教程,Linux下安装synergy
- 《十周成为数据分析师》笔记——业务线 第三节 不做只懂技术不懂业务的“工具人”
- 敏捷开发 - 每日站立会议
- jfreechart学习笔记三 带刻度的蜘蛛图
- HOLUX M1200-E 蓝牙GPS轨迹记录器的历史轨迹数据读取