如何提取并保存图标资源

    技术2022-05-11  124

     

    如何提取并保存图标资源

    作者:徐景周

    下载示例源码(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 );

            }

        }

    }

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

     

    联系方式:

    EMAIL:jingzhou_xu@163.com

    未来工作室(Future Studio)

     


    最新回复(0)