24小时热门版块排行榜    

查看: 140  |  回复: 0
当前主题已经存档。

zsglly

木虫 (著名写手)

[交流] 如何提取并保存图标资源

 当你想要使用别的应用程序中的漂亮图标时,该怎么办呢?也许就会用到一些图标提取工具吧!那么,你知道它们是怎么实现的,想不想自己动手也做一个适合自己的图标提取工具呢?下面,就让我用我以前做过的一个工具<轻轻松松抓图标>来告诉你吧!它可以提取各种文件中的图标资源,并可将其保存为图标(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 );
}
}
}

[ Last edited by 幻影无痕 on 2006-11-17 at 08:22 ]
回复此楼
做人要厚道啊!厚道啊!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zsglly 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考博] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 jCd0dEvKHShX 2026-08-29 6/300 2026-08-30 19:13 by hZiFeudZyoGR
[博后之家] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +3 jCd0dEvKHShX 2026-08-29 4/200 2026-08-30 19:13 by hZiFeudZyoGR
[硕博家园] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +3 G6APbkg8SA6w 2026-08-29 4/200 2026-08-30 18:53 by hZiFeudZyoGR
[论文投稿] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +5 gy1nBQXYQJqL 2026-08-29 5/250 2026-08-30 18:29 by hZiFeudZyoGR
[公派出国] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +5 gy1nBQXYQJqL 2026-08-29 5/250 2026-08-30 18:07 by hZiFeudZyoGR
[博后之家] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +7 gy1nBQXYQJqL 2026-08-29 8/400 2026-08-30 18:07 by hZiFeudZyoGR
[考博] 找导师 +6 yuanjiabao 2026-08-29 7/350 2026-08-30 14:40 by 生科新手
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +5 gy1nBQXYQJqL 2026-08-29 8/400 2026-08-30 12:14 by l0VvVHGBGRLv
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +6 ASdOkHsho7FD 2026-08-28 9/450 2026-08-30 11:19 by l0VvVHGBGRLv
[考博] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 ASdOkHsho7FD 2026-08-28 6/300 2026-08-30 11:10 by l0VvVHGBGRLv
[考研] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 gy1nBQXYQJqL 2026-08-29 4/200 2026-08-30 06:57 by ZPa0EcMwuECS
[教师之家] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +5 ASdOkHsho7FD 2026-08-28 8/400 2026-08-30 05:48 by ZPa0EcMwuECS
[基金申请] 为什么到现在没收到通知? +4 tannykie 2026-08-29 4/200 2026-08-29 17:14 by lmz0216
[基金申请] 2026年叶企孙基金 +4 bud_bud 2026-08-27 7/350 2026-08-29 07:23 by foolishmani
[基金申请] 为什么资助数各大高校都创新高,自己申请怎么就这么难 +12 Kittylucky 2026-08-27 13/650 2026-08-29 00:04 by superceng
[文学芳草园] 梦想 +3 myrtle 2026-08-26 3/150 2026-08-27 10:01 by angelyueyi
[基金申请] 国合里面能看到了 +7 一怀馨秋 2026-08-26 7/350 2026-08-26 11:23 by zhaosm1982
[基金申请] 项目信息和经费信息在系统里都可以看到了 +6 wittyboy 2026-08-26 14/700 2026-08-26 10:55 by wittyboy
[基金申请] 国合可查了 +3 paperzjh 2026-08-26 3/150 2026-08-26 10:41 by LemmonTr
[基金申请] 明天应该可查了!? +6 chengyan1220 2026-08-23 6/300 2026-08-25 19:45 by zfd97
信息提示
请填处理意见