电脑教程中文网
首页  动态网站建设学习 程序  笑话  论坛 娱乐  交友 ADSL  峄城  成功者
中文名:电脑教程中文网,收集了大量的电脑教程! 编程技术文档 游戏开发 笑话站暂时关闭 设为首页
网页设计 HTML | Dreamweaver | CSS | Firework | FrontPage WEB开发 ASP | JSP | PHP | .NET | CGI | JS | VBS | XML | IIS6 | Apache | PWS
程序设计 Java | C++ |VC++ | C# | Delphi | VB | C语言 | 汇编 | Pascal | Perl 数据库 MSSQL | MySQL | Access | VF | Oracle | DB2 | SYBASE |
办公软件 Word | Excel | WPS | PowerPoint 动画平面 Photoshop | ACDSee | 3Dmax | Flash | Coreldraw |
操作系统 Windows 2000 | Windows XP | Windows 2003 | SCO Unix | Windows Vista | unix、Linux | 综合| 服务器 | 系统安全| 黑客技术
其  他 UltraDev | DOS | UML | PWS | Powerbuilder | 开发心得 | 设计理念 | 病毒库 | 其他 | LightTPD (分类排序给您带来不便请谅解)
推  荐: Java文档500篇》《ASP.NET与相关数据库技术高级指南》《TC图形函数详解》《C函数速查手册》《C语言编程宝典之一》《MFC深入浅出》《黑客零起点》《VC++ 编程指南》《JScript 用户指南》 《CSS教程宝典》《Microsoft Jet SQL 参考》《delphi技巧集合》《MySQL 4.1.0 中文参考手册》《MySQL中文手册
【导航】 您现在的位置 : 首页 - VC教程 - 《VC++实例教程篇[收集]》- 如何实现提取并保存图标资源

如何实现提取并保存图标资源

日期:2005-8-15 18:00:26    作者:佚名   人气:   来源:网络




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




网站首页 - 友情链接 - 公司简介 - 联系方式 - 广告投放 - 客户服务 - 错误报告 - 免责声明 - About us
CLDE.NET电脑教程中文网版权所有 未经许可禁止镜象和复制本站资料 MSN:CLDE_NET@hotmail.com
技术支持:CLDE.NET信息中心 鲁ICP备05039940号 友情链接QQ:784079(隐)