65.9K
CodeProject 正在变化。 阅读更多。
Home

Internet Explorer 皮肤管理器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2002年6月10日

4分钟阅读

viewsIcon

199609

downloadIcon

3275

一篇解释如何创建一个实用程序来管理 Internet Explorer 皮肤的文章

Internet Explorer with a custom skin

引言

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

IE Skin Manager

该工具是一个简单的基于对话框的应用程序,其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_READKEY_QUERY_VALUE。如果你的应用程序只需要读取注册表值,你可能需要KEY_QUERY_VALUEKEY_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站点获取。祝你编码和调试愉快!;)

© . All rights reserved.