c语言源文件保存后的图标,如何实现提取并保存图标资源

本文介绍了一个用于提取和显示不同文件类型(如ICO、BMP、EXE、DLL等)中图标资源的工具——轻轻松松抓图标。通过整合图标类CIcons和位图类CDib,该程序可以读取图标文件并将其显示在列表框中。当选择ICO或BMP文件时,会直接加载图标;对于EXE和DLL文件,则通过加载库并枚举资源来获取图标。程序还提供了保存和复制图标的选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

121700101.jpg

图一

在上面的例程中,我整合出一个图标类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;

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值