如何提取并保存图标资源

原创 2002年01月15日 09:31:00
 

如何提取并保存图标资源<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

作者:徐景周

下载示例源码(http://www.csdn.net/cnshare/soft/9/9199.shtm)

 


     当你想要使用别的应用程序中的漂亮图标时,该怎么办呢?也许就会用到一些图标提取工具吧!那么,你知道它们是怎么实现的,想不想自己动手也做一个适合自己的图标提取工具呢?下面,就让我用我以前做过的一个工具<轻轻松松抓图标>来告诉你吧!它可以提取各种文件中的图标资源,并可将其保存为图标(ICO)、位图(BMP)两种格式。程序运行后界面如下:

 


在上面的例程中,我整合出一个图标类CIcons和与之相配的一个位图类CDib,其中包括Icons.h、Icons.cpp、Dib.h和Dib.cpp四个文件。在你的工程中直接加入这四个文件后,调用其类涵数,既可做出你自己的图标工具来。

下面让我们来看看如何来具体用它们来实现:

1、提取并显示出图标到左侧列表框中。

代码实现如下:

//读取各种资源内部图标并显示在左侧列表框中

void CIconSnapDlg::OnOK()

{   

CFileDialog fileDialog( TRUE,"*.ICO",NULL,NULL,"资源文件(*.ICO,*.BMP,*.EXE,*.DLL,*.ICL)|*.ICO;*.BMP;*.EXE;*.DLL;*.ICL||");

if (fileDialog.DoModal() == IDOK)

{      

     szOpenFileName=fileDialog.GetPathName();   

        szOpenFileExtName= fileDialog.GetFileExt ();

     szOpenFileExtName.MakeLower ();

 

     m_List.ResetContent (); //选清空左侧图标列表框

 

     //读取并显示ICON文件

        if(szOpenFileExtName =="ico")

     {

         lpIR=pIcons->ReadIconFromICOFile (szOpenFileName);     

         HICON hIcon;

         hIcon=ExtractIcon(AfxGetInstanceHandle(),szOpenFileName,0);

            if(hIcon!=NULL)

             m_List.AddString (szOpenFileName);

         CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);

        pStatic->SetIcon (hIcon);

     }

     else if(szOpenFileExtName == "bmp") //读取并显示BMP文件

     {

            pIcons->IconImageFromBMPFile (szOpenFileName,&lpIR->IconImages[0],TRUE);

         HICON hIcon;

         hIcon=pIcons->MakeIconFromResource (&lpIR->IconImages [0]);

         if(hIcon!=NULL)

             m_List.AddString (szOpenFileName);

            CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);

        pStatic->SetIcon (hIcon);

     }

        else //读取并显示EXE、DLL等资源文件

     {

        HINSTANCE  hLibrary;

 

        // Load the DLL/EXE - NOTE: must be a 32bit EXE/DLL for this to work

        if( (hLibrary = LoadLibraryEx( szOpenFileName, NULL, LOAD_LIBRARY_AS_DATAFILE )) == NULL )

        {

         // Failed to load - abort

         MessageBox( szOpenFileName+ "文件载入错误,必须是WIN32的文件!", "错误", MB_OK );

         return;

        }

        // Store the info

        EDII.szFileName =szOpenFileName;

        EDII.hInstance = hLibrary;

   

        // Fill in the listbox with the icons available

        if( ! EnumResourceNames( EDII.hInstance, RT_GROUP_ICON, (ENUMRESNAMEPROC )MyEnumProcedure, (LPARAM)GetSafeHwnd()) )

        {

         MessageBox( "列举图标资源名时出错!", "错误", MB_OK );

         return;

        }

     }

 

     m_List.SetCurSel (0);

     if( m_List.GetCount()  == 0 )

     {

         MessageBox( "此文件中没有图标资源!", "错误", MB_OK );

         //无图标资源,置保存和复制按钮为无效状态

         m_Copy.EnableWindow (false);

         m_SaveAs.EnableWindow (false);

         return;

     }

        //有图标资源,置保存和复制按钮为有效状态

     m_Copy.EnableWindow (true);

     m_SaveAs.EnableWindow (true);

 

     //刷新调用OnPaint来显示图标

     InvalidateRect(NULL,TRUE);

}  

}

OnPaint()涵数中加入下面代码用来具体显示提取出的图标或位图资源。

//根据左侧图标列表,利用OnPaint()来更新右侧相应图标

LPTSTR lpIconID;

HICON hIcon;

if((lpIconID=(LPTSTR)m_List.GetItemData(m_List.GetCurSel()))!=(LPTSTR)LB_ERR )

{

 if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl")

 {

       hIcon=pIcons->GetIconFromInstance(EDII.hInstance,lpIconID);

   CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);

   pStatic->SetIcon (hIcon);

 }

}

2、如何将提取出的图标资源保存为Ico或Bmp格式。

//保存图标资源为ICO或BMP格式文件

void CIconSnapDlg::OnButtonSaveas()

{

    LPTSTR lpIconID;

 

    CFileDialog fileDialog( FALSE,"*.ICO",NULL,NULL,"图标文件(*.ICO)|*.ICO|位图文件(*.BMP)|*.BMP||");

    if (fileDialog.DoModal() == IDOK)

    {

        szSaveFileName=fileDialog.GetPathName();   

        szSaveFileExtName= fileDialog.GetFileExt ();

        szSaveFileExtName.MakeLower ();

 

        if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl")

           if((lpIconID=(LPTSTR)m_List.GetItemData (m_List.GetCurSel()))!= (LPTSTR)LB_ERR)

                lpIR=pIcons->ReadIconFromEXEFile (szOpenFileName,lpIconID);

        if(szSaveFileExtName=="bmp")

        {

          if(lpIR!=NULL && m_List.GetCount ()>0)

          {

            BeginWaitCursor();

            pIcons->IconImageToBMPFile (szSaveFileName,&lpIR->IconImages [0]);

            EndWaitCursor();

          }

          else

            MessageBox( "没有可保存的图标资源!", "错误", MB_OK );

        }

        else if(szSaveFileExtName=="ico")

        {

          if(lpIR!=NULL && m_List.GetCount ()>0)

          {

            BeginWaitCursor();

            pIcons->WriteIconToICOFile (lpIR,szSaveFileName);

            EndWaitCursor();

          }

          else

            MessageBox( "没有可保存的图标资源!", "错误", MB_OK );

        }

    }

}

以上代码的详细实现,请在下载后源码后,仔细参看既可。

 

联系方式:

地址:陕西省西安市劳动路2号院六单元

邮编:710082

作者EMAIL:jingzhou_xu@163.net

未来工作室(Future Studio)

 

GetIcons:C#提取应用程序的图标资源

在写C#窗口程序时,看厌了默认的图标,想更换下图标,可是电脑中的图标文件(.ico)很少。于是,想到写个程序来提取其他程序中的图标资源。 【网通】点击这里下载全部源程序     【电信、...
  • pengqianhe
  • pengqianhe
  • 2012年09月24日 16:44
  • 2447

一个从EXE、DLL文件中提取、存取图标完整程序

       作为一名程序员,会经常为制作、设计程序图标费尽心思,当我们看到许多应用软件的图标非常漂亮的时候,是多么的羡慕!我们可不可以借鉴一下他们的图标?完全可以!我们利用 ExtractIcon ...
  • CoolDesigner
  • CoolDesigner
  • 2002年01月14日 09:13
  • 2297

C++ GDI+提取系统文件或文件夹的图标,保存为透明图片

介绍一种提取文件或者文件夹的图标的方法,保存为背景透明的PNG图标。
  • aoshilang2249
  • aoshilang2249
  • 2014年07月30日 17:51
  • 2245

获取.exe/.dll/.icon文件的Icon图标资源

获取.exe/.dll/.icon文件的Icon图标资源
  • qq2399431200
  • qq2399431200
  • 2014年01月04日 19:23
  • 2964

C#读取并保存导出Resource资源文件

using System.IO; using System.Runtime.Serialization.Formatters.Binary; //filename 资源文件里面的文件名称 ...
  • Sky_Cat
  • Sky_Cat
  • 2016年08月21日 19:36
  • 3395

获取exe文件中的图标

public Icon[] myicon=new Icon[1000];        public int currentIndex=0;        [System.Runtime.Intero...
  • LeoMaya
  • LeoMaya
  • 2007年10月21日 00:39
  • 733

从其他应用程序中提取图标

问题由来苦逼个人码农没有设计师给设计图标,只能到处找icon,但总是很难找到合适的。其实从现有的软件中提取图标出来是个不错的方法,于是问题便来了。方法使用图标提取软件这种软件貌似只能提取一个exe的图...
  • sunnyloves
  • sunnyloves
  • 2015年10月31日 11:14
  • 1550

游戏资源提取方法

 游戏资源包括了游戏的图片、文字、音乐、动画和其他数据资源。虽然很多游戏的资源都是开放的或者采用通用格式压缩的,但也不少游戏是经特殊格式打包过了,要想得到这些资源可以寻找专用的资源提取工具。可是 如果...
  • luozhuang
  • luozhuang
  • 2007年10月04日 14:54
  • 10156

unity3D 如何提取游戏资源

首先感谢 雨松MOMO 的一篇帖子 教我们怎么提取 .ipa 中的游戏资源。教我们初步的破解unity3d资源的基本方法 附上原帖的链接: http://www.xuanyusong.com/ar...
  • cbbbc
  • cbbbc
  • 2016年03月26日 10:53
  • 3062

WinAPI: ExtractIcon - 获取 EXE、DLL 或 ICO 文件中的图标

//声明: ExtractIcon(   hInst: HINST;          {调用函数的程序实例}   lpszExeFileName: PChar; {文件路径; 文件可以是 *.ex...
  • younizhizu2016
  • younizhizu2016
  • 2016年07月17日 12:54
  • 161
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何提取并保存图标资源
举报原因:
原因补充:

(最多只允许输入30个字)