主要的头文件如下:
// "MyExtentionModule.h"
// CMyModuleResourceOverride构造、析构函数自动完成资源的切换。
// 其中,CMyModuleResourceOverride类的静态成员变量m_theExtensionModule
// 引用了全局的AFX_EXTENSION_MODULE,因此不需要显式的指明要切换到哪个资源
// 该静态成员变量应该在全局的AFX_EXTENSION_MODULE对象被定义之后完成定义。
// 可以将该头文件放在"stdafx.h"头文件中,避免一次次写#include "MyExtensionModule.h"
#pragma once
class CMyModuleResourceOverride
{
public:
CMyModuleResourceOverride();
~CMyModuleResourceOverride();
private:
HINSTANCE m_hInstanceOld;
private:
static AFX_EXTENSION_MODULE& m_theExtensionModule;
};
CMyModuleResourceOverride::CMyModuleResourceOverride()
: m_hInstanceOld(::AfxGetResourceHandle())
{
::AfxSetResourceHandle(m_theExtensionModule.hModule);
}
CMyModuleResourceOverride::~CMyModuleResourceOverride()
{
::AfxSetResourceHandle(m_hInstanceOld);
}
#define IMPLEMENT_MODULE_RESOURCE_OVERRIDE(module)\
AFX_EXTENSION_MODULE& CMyModuleResourceOverride::m_theExtensionModule = module;
另外,还需要在定义AFX_EXTENSION_MODULE全局对象的cpp中实现静态成员变量的定义,如下:
// TestModuleEx.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include <afxdllx.h>
// 必须包含相应头文件
#include "MyExtensionModule.h"
#include "..."
// 此处省略部分由机器自动完成的代码
// 下面这句话是由机器自动生成代码。全局变量
static AFX_EXTENSION_MODULE TestModuleExDLL = { NULL, NULL };
// 通过下面这个宏,实现CMyModuleResourceOverride::m_theExtensionModule的初始化
IMPLEMENT_MODULE_RESOURCE_OVERRIDE(TestModuleExDLL);
// 此处省略部分由机器自动完成的代码
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
//此处省略DllMain的代码
return 1; // 确定
}
// 此处省略部分由机器自动完成的代码
完成上面的工作后,在需要切换资源的地方,只需要像下面这样:
#include "MyExtensionModule.h"
void Fun()
{
CMyModuleResourceOverride myResourse;
CMyDialog() dlg;
dlg.DoModal();
}
综上,在特定cpp文件(一般都是包含DllMain函数的cpp文件)中添加一个include和一句宏,便完成了简便资源切换的全部准备工作。
使用时,只需要定义一个自动切换对象,即实现切换。
4 个解决方案
#1
SF
#2
顶,学习
#3
学习ing
#4
不行啊!!!我试了
#1
SF
#2
顶,学习
#3
学习ing
#4
不行啊!!!我试了