【VC编程技巧】动态链接库☞1.6设计应用程序界面换肤

引言(转载请说明作者和出处):

刚休完 十一长假,又加上最近公司事挺多的,十来天没更新了文章,打算后面补上。

今天讲利用动态链接库来实现应用程序的界面换肤。原理是在动态链接库中创建应用程序需要的位图资源文件,当应用程序需要界面换肤时去加载新的位图资源。下面我看一个例子,这个例子同第一讲“【VC编程技巧】动态链接库☞1.1调用Dll中的一个图标”差不多。

效果图:


1〉创建MFCRegularDLL类型的DLL工程,DLL名:InterfaceRes.dll

2〉插入两个位图资源,resources.h

//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by InterfaceRes.rc
//
//位图1
#define IDB_MAINFORM                    8000
//位图2
#define IDB_SECFORM                     8001

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        4002
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         4000
#define _APS_NEXT_SYMED_VALUE           4000
#endif
#endif

3〉编译生成InterfaceRes.dll

4〉创建换肤对话框应用程序ChangeSkin.exe,通过两个Button去调用动态库中的不同位图;相关代码如下:

void CChangeSkinDlg::OnStyleOne() 
{
	//加载动态链接库
	HMODULE hRes = LoadLibrary("./InterfaceRes.dll");
	if (hRes != NULL)								//判断是否加载成功
	{
		//加载动态链接库中的位图,其中8000为动态链接库中的位图资源ID值
		HBITMAP hBmp = (HBITMAP)LoadImage(hRes, MAKEINTRESOURCE(8000), IMAGE_BITMAP, 0, 0, 0);
		if (hBmp != NULL)							//判断加载位图是否成功
		{
			//在控件中显示位图
			if(m_hOldBmp != NULL)
			{
				m_hOldBmp = m_Bmp.SetBitmap(hBmp);
			}
			else
			{
				//如果控件已经设置过位图,先将其还原再设新的
				m_Bmp.SetBitmap(m_hOldBmp);
				m_Bmp.SetBitmap(hBmp);
			}
			//释放LoadImage加载的位图资源占据的内存
			if (hBmp)
			{
				DeleteObject(hBmp);
			}
		}
		FreeLibrary(hRes);							//卸载动态链接库
	}
}

void CChangeSkinDlg::OnStyleTwo() 
{
	//加载动态链接库
	HMODULE hRes = LoadLibrary("./InterfaceRes.dll");
	if (hRes != NULL)								//判断是否加载成功
	{
		//加载动态链接库中的位图,其中8001为动态链接库中的位图资源ID值
		HBITMAP  hBmp = (HBITMAP)LoadImage(hRes, MAKEINTRESOURCE(8001), IMAGE_BITMAP, 0, 0, 0);
		if (hBmp != NULL)							//判断加载位图是否成功
		{
			//在控件中显示位图
			if(m_hOldBmp != NULL)
			{
				m_hOldBmp = m_Bmp.SetBitmap(hBmp);
			}
			else
			{
				//如果控件已经设置过位图,先将其还原再设新的。
				m_Bmp.SetBitmap(m_hOldBmp);
				m_Bmp.SetBitmap(hBmp);
			}
			//释放LoadImage加载的位图资源占据的内存
			if (hBmp)
			{
				DeleteObject(hBmp);
			}
		}
		FreeLibrary(hRes);							//卸载动态链接库
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值