Internet Explorer 皮肤管理器





5.00/5 (3投票s)
2002年6月10日
4分钟阅读

199609

3275
一篇解释如何创建一个实用程序来管理 Internet Explorer 皮肤的文章
引言
正如你在上面的截图中所见,Internet Explorer (IE 5 及以上版本) 允许你使用位图作为IE工具栏的皮肤/壁纸,使其更有趣。这个小工具允许你通过一个方便的基于对话框的应用程序来设置/移除IE皮肤。在这个过程中,我们通过CRegKey
类深入研究了Windows注册表编程。

该工具是一个简单的基于对话框的应用程序,其GUI非常简洁,如上所示。代码可以很容易地分成上述按钮的处理程序。文章的其余部分将通过相关的代码片段讨论重要的步骤。
选择位图
按钮“Choose...”的OnChoose()
处理程序会打开一个文件选择对话框,其过滤器设置为“Bitmap Files”,因为.bmp文件是唯一允许用于IE皮肤的文件。JPEG和GIF等其他图像格式不支持IE皮肤/壁纸。此函数获取用户选择的文件的路径,并将m_szFilePath
设置为该值。它还将文件路径显示在只读编辑框中。OnChoose()
的代码是 -
void CIESkinDlg :: OnChoose() { //open a file dialog with only BMP files filter, //other formats not allowed LPCTSTR lpszFilter = "Bitmap Files (*.bmp)|*.bmp||"; CFileDialog dlgFile(TRUE,NULL,NULL,OFN_FILEMUSTEXIST|OFN_EXPLORER, lpszFilter,this); if(IDOK == dlgFile.DoModal()) { m_szFilePath = dlgFile.GetPathName(); //display file path in the edit box SetDlgItemText(IDC_EDIT,m_szFilePath); } }
将位图设置为皮肤
要将选定的位图文件设置为Internet Explorer的皮肤,你必须在注册表项下的注册表值BackBitmap
的数据值中指定选定文件的路径 -
HKEY_CURRENT_USER \Software \Microsoft \Internet Explorer \Toolbar
注册表修改使用CRegKey
类完成,该类提供了操作系统注册表值的各种方法。请注意,你需要将atlbase.h头文件包含在你的代码中才能使用CRegKey
类。
SetIESkin()
函数用于设置位图作为皮肤。该函数又被“Set Skin”按钮的OnSet()
处理程序调用。该函数打开所需的注册表项,将BackBitmap
的值设置为m_szFilePath
(即用户选择的文件),最后关闭该项。代码如下 -
BOOL CIESkinDlg :: SetIESkin() { LONG lResult = 0; CRegKey reg; //open the required registry key LPCTSTR lpszKey = "Software\\Microsoft\\Internet Explorer\\Toolbar"; lResult = reg.Open(HKEY_CURRENT_USER,lpszKey); //check if opened successfully if(ERROR_SUCCESS != lResult) { return FALSE; } //set the value lResult = reg.SetValue(m_szFilePath,"BackBitmap"); if(ERROR_SUCCESS != lResult) { return FALSE; } //done, close and return success reg.Close(); return TRUE; }
现在让我们来看一些CRegKey
函数,CRegKey::Open
函数打开指定的项并将m_hKey
设置为该项的句柄。其原型是 -
LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS )
hKeyParent
- 这是当前打开项的句柄,或者是预定义的保留句柄值之一,例如 -HKEY_CURRENT_USER,
HKEY_LOCAL_MACHINE
等。lpszKeyName
- 指定要打开的项的名称。此名称必须是hKeyParent
的子项。samDesired
- 项的安全访问权限。根据此权限,允许读取或写入注册表项。默认值为KEY_ALL_ACCESS
。其他值包括 -KEY_WRITE
,KEY_READ
和KEY_QUERY_VALUE
。如果你的应用程序只需要读取注册表值,你可能需要KEY_QUERY_VALUE
或KEY_READ
访问权限。
另一个使用的函数是LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName )
,它将数据存储在已打开注册表项的指定值字段中。如果该值名称在该特定子项下不存在,则会创建它以存储数据。此版本的SetValue
使用m_hKey
作为已打开的项。
LONG Close( )
函数关闭该项,释放m_hKey
成员句柄并将其设置为NULL
。当项关闭时,其注册表数据将被写入(刷新)到硬盘。如果你的应用程序必须显式地将注册表数据写入硬盘,你可以调用RegFlushKey
Win32函数。
所有这些函数如果成功则返回ERROR_SUCCESS
,否则返回错误值。你可以使用Win32的FormatMessage
函数配合FORMAT_MESSAGE_FROM_SYSTEM
标志来获取错误的通用描述。
移除皮肤
要从IE中移除皮肤,你需要删除注册表值BackBitmap
,该值之前已通过SetIESkin()
函数设置。这是由RemoveIESkin()
函数完成的,该函数又被“Remove Skin”按钮的OnRemove()
处理程序调用。
RemoveIESkin()
函数打开所需的项,从系统注册表中删除该项的BackBitmap
值,最后关闭该项。成功删除此值将清除IE工具栏。如果找不到要删除的值,函数将返回FALSE
,表示出错。代码如下 -
BOOL CIESkinDlg :: RemoveIESkin() { LONG lResult = 0; CRegKey reg; //open the required registry key LPCTSTR lpszKey = "Software\\Microsoft\\Internet Explorer\\Toolbar"; lResult = reg.Open(HKEY_CURRENT_USER,lpszKey); //check if opened successfully if(ERROR_SUCCESS != lResult) { return FALSE; } //delete the value "BackBitmap" from toolbar lResult = reg.DeleteValue("BackBitmap"); //check if deleted successfully if(ERROR_SUCCESS != lResult) { return FALSE; //perhaps value not found, if skin is not set } //done, return success reg.Close(); return TRUE; }
CRegKey::DeleteValue
函数实际删除由m_hKey
标识的项的值字段,而m_hKey
又由CRegKey::Open
设置。CRegKey::DeleteValue
的原型是 -
LONG DeleteValue( LPCTSTR lpszValue )
该函数接受参数lpszValue
,它指定要移除的值字段。如果值成功删除,函数返回ERROR_SUCCESS
,否则返回错误值。如果参数lpszValue
指定的值未找到,函数将返回错误值。在收到此错误值后,RemoveIESkin()
函数返回FALSE
,表示注册表值未被删除。
就是这样!
真的!这就结束了这个实用工具的所有重要代码。其余的零散部分可以在源代码中找到。一旦你开始用这个工具尝试各种bmp文件,你就可以让你的IE看起来非常酷。此外,作为附带效果,你的Outlook Express也将开始炫耀这个新皮肤。
你可以使用此代码开发一个功能齐全的IE自定义工具,通过设置适当的注册表值,该工具可以具有自定义标题、自定义旋转logo、品牌logo等。有关这些注册表设置的详细信息可以从MSDN站点获取。祝你编码和调试愉快!;)