从EXE或DLL等中取ICO

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值