在本文中,将探讨如何通过Windows注册表编程,使用CRegKey类来自定义Internet Explorer(IE)工具栏的皮肤。将创建一个简单的对话框应用程序,允许用户选择一个位图文件作为IE工具栏的皮肤。
首先,需要一个函数来打开文件对话框,让用户选择一个位图文件。在IE中,只有.bmp文件被允许作为皮肤。其他格式如JPEG和GIF不被支持。这个函数将获取用户选择的文件路径,并将其设置为程序的一个成员变量。以下是实现这个功能的代码:
void CIESkinDlg::OnChoose()
{
// 打开一个只包含BMP文件的文件对话框
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();
// 在编辑框中显示文件路径
SetDlgItemText(IDC_EDIT, m_szFilePath);
}
}
这段代码首先定义了一个文件过滤器,只允许用户选择BMP文件。然后,它创建并显示一个文件对话框。如果用户选择了一个文件并点击了“确定”,那么文件的路径将被存储在成员变量m_szFilePath中,并在编辑框中显示。
要将选定的位图文件设置为IE工具栏的皮肤,需要将文件路径设置为注册表中的一个值。这个值位于以下注册表键下:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar
使用CRegKey类来修改注册表。这个类提供了操作系统注册表值的方法。首先,需要包含atlbase.h头文件来使用CRegKey类。以下是设置皮肤的代码:
BOOL CIESkinDlg::SetIESkin()
{
LONG lResult = 0;
CRegKey reg;
// 打开所需的注册表键
LPCTSTR lpszKey = "Software\\Microsoft\\Internet Explorer\\Toolbar";
lResult = reg.Open(HKEY_CURRENT_USER, lpszKey);
// 检查是否成功打开
if (ERROR_SUCCESS != lResult)
{
return FALSE;
}
// 设置值
lResult = reg.SetValue(m_szFilePath, "BackBitmap");
if (ERROR_SUCCESS != lResult)
{
return FALSE;
}
// 完成,关闭并返回成功
reg.Close();
return TRUE;
}
这段代码首先尝试打开指定的注册表键。如果成功,它将用户选择的文件路径设置为BackBitmap的值。如果设置成功,函数返回TRUE,否则返回FALSE。
CRegKey类提供了几个方法来操作注册表。以下是一些重要的方法:
所有这些方法在成功时返回ERROR_SUCCESS,否则返回错误值。可以使用Win32 FormatMessage函数和FORMAT_MESSAGE_FROM_SYSTEM标志来获取错误的错误描述。
要从IE中移除皮肤,需要删除之前设置的BackBitmap值。这可以通过RemoveIESkin函数来完成,该函数由“移除皮肤”按钮的OnRemove处理程序调用。以下是移除皮肤的代码:
BOOL CIESkinDlg::RemoveIESkin()
{
LONG lResult = 0;
CRegKey reg;
// 打开所需的注册表键
LPCTSTR lpszKey = "Software\\Microsoft\\Internet Explorer\\Toolbar";
lResult = reg.Open(HKEY_CURRENT_USER, lpszKey);
// 检查是否成功打开
if (ERROR_SUCCESS != lResult)
{
return FALSE;
}
// 从工具栏中删除"BackBitmap"值
lResult = reg.DeleteValue("BackBitmap");
// 检查是否成功删除
if (ERROR_SUCCESS != lResult)
{
return FALSE;
}
// 完成,返回成功
reg.Close();
return TRUE;
}