分享
 
 
 

如何提取并保存图标资源

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

如何提取并保存图标资源

作者:徐景周

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

}

}

}

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

联系方式:

地址:陕西省西安市劳动路2号院六单元

邮编:710082

作者EMAIL:jingzhou_xu@163.net

未来工作室(Future Studio)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有