rc资源文件重写问题

水军总督 2016-04-21 04:53:55
背景:通过预编译的方式实现每次运行时exe文件图标的变化

我的实现:
1、工程内加入了一个头文件(配置文件)Init.h,只写着#define _A_VERSION
2、新建了两个新的rc文件:a.rc和b.rc,分别定义了两个图标资源
IDR_MAINFRAME ICON ".\\a.ico"
IDR_MAINFRAME ICON ".\\b.ico"
3、将myApp.rc文件(即原本工程里已有的rc文件)内的IDR_MAINFRAME注释掉
4、在myApp.rc文件内加入预编译代码
#include "Init.h"
#ifdef _A_VERSION
#include "a.rc"
#else
#include "b.rc"
#endif

经过以上四步后可以成功实现效果,即每次修改Init.h文件后(如改为#define _B_VERSION),exe文件的图标可在运行时自动切换。


Quetion:
即使实现了想要的效果,但是如果在String Table里添加一个新的字符串然后运行程序,则myApp.rc会被自动改写,第四步里的预编译代码会没了,转而变成
IDR_MAINFRAME ICON ".\\b.ico"
这样就没有了之前想要的效果


求大神指导或其它合适的解决方案,谢谢!
...全文
276 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2016-04-24
  • 打赏
  • 举报
回复

/////////////////////////////////////////////////////////////////////////////
// *.RC2 Add manually edited resources here...
//#define MFC_ICON

#ifdef MFC_ICON
IDR_MAINFRAME           ICON                    "res\\DlgGL.ico" //'mfc'
#else
IDR_MAINFRAME           ICON                    "res\\Icon1.ico"
#endif

/////////////////////////////////////////////////////////////////////////////
水军总督 2016-04-22
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
在 resource。h中 #define ICON1 // 修改它 #ifdef ICON1 #define IDI_ICON1 127 #else #define IDI_ICON1 129 #endif #define IDR_MAINFRAME 128 因为 exe 的 icon 是 icon group 中 数 最小的 那个。
首先先谢谢你的回答,之前知道exe图标是icon里值最小的那个,但没试过将配置文件里的#define _A_VERSION写在Resource.h中。 Question1:你的方法确实可以实现在每次运行程序时改变exe图标,但是我除了exe图标要自动变化之外,窗口和桌面任务栏的图标也是要自动变化的,所以我在构造函数里加入了如下代码:
#ifdef _A_VERSION
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
#else
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON2);
#endif
但是窗口和桌面任务栏的图标没有按预期那样正常显示,请问该怎么处理。 Question2:你的方法是将配置文件里的信息直接写在Resource.h文件里,能不能将#define _A_VERSION单独写在一个头文件里的?因为每次运行时要根据版本来修改这个头文件然后再打开exe运行的 谢谢!
用户 昵称 2016-04-22
  • 打赏
  • 举报
回复
引用 2 楼 kaida1234 的回复:
[quote=引用 1 楼 jennyvenus 的回复:] 高级的不会,俺可能这样做。 弄两套资源,编写一个批处理,将需要的图标拷贝到工程所引用的图标的文件夹,支持多套也行
这样的话你的批处理需要实现些什么?[/quote] copy操作而已。
水军总督 2016-04-22
  • 打赏
  • 举报
回复
效果已实现,具体方法请看本人csdn博客里有关本帖的文章,谢谢! 链接
水军总督 2016-04-22
  • 打赏
  • 举报
回复
引用 11 楼 zzz3265 的回复:

#include "Init.h"
#ifdef _A_VERSION
#include "a.rc"
#else
#include "b.rc"
#endif 
你的这些代码移到 工程的rc2文件里去
刚刚自己搞好了,谢谢! 很奇怪之前我也在rc2文件中试过,但不知道为什么当时不可以。。。
Yofoo 2016-04-22
  • 打赏
  • 举报
回复

#include "Init.h"
#ifdef _A_VERSION
#include "a.rc"
#else
#include "b.rc"
#endif 
你的这些代码移到 工程的rc2文件里去
水军总督 2016-04-22
  • 打赏
  • 举报
回复
引用 9 楼 zzz3265 的回复:
myApp.rc 属于编辑器自己的资源文件, 编译器自己维护的, 你改了也有问题 如果要自己添加, 编译器会有一个 myApp.rc2 , 这个就是用来给编辑的
请问要怎样才能实现我要的效果,急求解啊!!
Yofoo 2016-04-22
  • 打赏
  • 举报
回复
myApp.rc 属于编辑器自己的资源文件, 编译器自己维护的, 你改了也有问题 如果要自己添加, 编译器会有一个 myApp.rc2 , 这个就是用来给编辑的
赵4老师 2016-04-22
  • 打赏
  • 举报
回复
仅供参考:
    // First find the main window of program that houses the desktop.
    progman_wnd = FindWindow(NULL, _T("Program Manager"));
    if(progman_wnd == NULL) throw(GetLastError());

    // Then get the desktop window
    desktopview_wnd = FindWindowEx(progman_wnd, NULL, _T("SHELLDLL_DefView"), NULL);
    if(desktopview_wnd == NULL) throw(GetLastError());

    PostMessage(desktopview_wnd, WM_KEYDOWN, VK_F5, 0);
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, NULL, NULL);
schlafenhamster 2016-04-21
  • 打赏
  • 举报
回复
在 resource。h中 #define ICON1 // 修改它 #ifdef ICON1 #define IDI_ICON1 127 #else #define IDI_ICON1 129 #endif #define IDR_MAINFRAME 128 因为 exe 的 icon 是 icon group 中 数 最小的 那个。
水军总督 2016-04-21
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
在原资源中加 一个 ICON

#define ICON1
CDlgGLDlg::CDlgGLDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgGLDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgGLDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
#ifdef ICON1
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
#else
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
#endif
}

这样只能改窗口的图标和桌面任务栏的图标,exe文件的图标修改不了的
schlafenhamster 2016-04-21
  • 打赏
  • 举报
回复
在原资源中加 一个 ICON

#define ICON1
CDlgGLDlg::CDlgGLDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgGLDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgGLDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
#ifdef ICON1
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
#else
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
#endif
}

水军总督 2016-04-21
  • 打赏
  • 举报
回复
引用 1 楼 jennyvenus 的回复:
高级的不会,俺可能这样做。 弄两套资源,编写一个批处理,将需要的图标拷贝到工程所引用的图标的文件夹,支持多套也行
这样的话你的批处理需要实现些什么?
用户 昵称 2016-04-21
  • 打赏
  • 举报
回复
高级的不会,俺可能这样做。 弄两套资源,编写一个批处理,将需要的图标拷贝到工程所引用的图标的文件夹,支持多套也行

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧