如何取得可执行文件的图标?要源代码。 听说一个可执行文件里还有几种图标:小图标,大图标,不同分辨率的图标,具体怎样分辨呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.csdn.net/cnshare/soft/9/9199.shtm void CSampleView::OnDraw(CDC* pDC){//画笔程序的图标获取 HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("Pbrush.exe"),0); if(hIcon&& hIcon!=(HICON)-1) pDC->DrawIcon(10,10,hIcon);} http://www.csdn.net/cnshare/soft/9/9199.shtm 两种方法: (1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle; (2) SDK函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等。 Example(1): 在程序窗口左上角显示 NotePad图标. void CSampleView: OnDraw(CDC * pDC) { if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0, &stFileInfo,sizeof(stFileInfo),SHGFI_ICON)) { pDC ->DrawIcon(10,10,stFileInfo.hIcon) } } Example(2):同样功能,Use ExtractIcon Function void CSampleView:: OnDraw(CDC *pDC) { HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T ("NotePad.exe"),0) if (hIcon &&hIcon!=(HICON)-1) pDC->DrawIcon(10,10,hIcon) } 说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点. 作者:Future Studio.徐景周 下面让我们来看看如何来具体用它们来实现: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 workif( (hLibrary = LoadLibraryEx( szOpenFileName, NULL, LOAD_LIBRARY_AS_DATAFILE )) == NULL ){// Failed to load - abortMessageBox( szOpenFileName+ "文件载入错误,必须是WIN32的文件!", "错误", MB_OK );return;}// Store the infoEDII.szFileName =szOpenFileName;EDII.hInstance = hLibrary;// Fill in the listbox with the icons availableif( ! 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);}} SHFILEINFO sfi;SHGetFileInfo("d:\\smartdrv.exe",0,&sfi,sizeof(sfi),SHGFI_ICON);HICON hIcon = sfi.hIcon;CClientDC Clientdc(this);Clientdc.DrawIcon(10,10,hIcon);Clientdc.DeleteDC;也可以使用ExtractIcon()函数,该函数原型为:HICON ExtractIcon( HINSTANCE hInst, // 实例句柄 LPCTSTR lpszExeFileName, // 文件名 UINT nIconIndex // 图标索引);参数hInst [in] 调用该函数的应用程序句柄. lpszExeFileName [in] 指向空字符串结尾的可执行文件,DLL,或图标文件名. nIconIndex [in] 指定基于0的图标索引.例如,如果值为0,函数返回指定文件开始图标的句柄. 如果值为-1,函数返回指定文件中图标的数量.如果文件是一个可执行文件或DLL,返回值是RT_GROUP_ICON资源号.如果文件是一个.ICO文件,返回值为1. 必须调用DestroyIcon来销毁由ExtractIcon返回的图标句柄CClientDC clientDc(this);HICON hIcon = ExtractIcon(AfxGetApp()->m_hInstance,"C:\\Program Files\\Outlook Express\\msimn.exe",1);clientDc.DrawIcon(10,10,hIcon);//返回图标数目HICON hIcon = ExtractIcon(AfxGetApp()->m_hInstance,"C:\\Program Files\\Outlook Express\\msimn.exe",-1);CString str;str.Format("%d",hIcon);AfxMessageBox(str);DestroyIcon(hIcon);----------------------------------------------- 关于io完成端口的几个问题 MFC 菜单小问题 如何创建多个同名线程并各自运行!!!~有用...... 请教高手关于MFC中CMap的用法,急等!!!! 小问题 为什么显示无模式对话框总是有问题,大家帮帮忙!!!!!!!!!!!!!!!! 求一个简单的多线程应用程序! VC6.0的动态链接库如何生成.Lib 请问怎样设置Static(静态文本框)的背景色? 简单问题:怎样在MFC Project中加入一个只有16*16的图标。 UP都有分~奇怪::为修改屏保密码的按钮不见了!(Win2000Pro2) 初学CSocket极简单问题!
{//画笔程序的图标获取
HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("Pbrush.exe"),0);
if(hIcon&& hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon);
}
(1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle;
(2) SDK函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等。
Example(1):
在程序窗口左上角显示 NotePad图标.
void CSampleView:
OnDraw(CDC * pDC)
{
if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
{
pDC ->DrawIcon(10,10,stFileInfo.hIcon)
}
}
Example(2):同样功能,Use ExtractIcon Function
void CSampleView:: OnDraw(CDC *pDC)
{
HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
("NotePad.exe"),0)
if (hIcon &&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon)
}
说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点.
下面让我们来看看如何来具体用它们来实现: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);
}
}
HICON hIcon = sfi.hIcon;
CClientDC Clientdc(this);
Clientdc.DrawIcon(10,10,hIcon);
Clientdc.DeleteDC;也可以使用ExtractIcon()函数,该函数原型为:HICON ExtractIcon(
HINSTANCE hInst, // 实例句柄
LPCTSTR lpszExeFileName, // 文件名
UINT nIconIndex // 图标索引
);参数
hInst
[in] 调用该函数的应用程序句柄.
lpszExeFileName
[in] 指向空字符串结尾的可执行文件,DLL,或图标文件名.
nIconIndex
[in] 指定基于0的图标索引.例如,如果值为0,函数返回指定文件开始图标的句柄.
如果值为-1,函数返回指定文件中图标的数量.如果文件是一个可执行文件或DLL,返回值是RT_GROUP_ICON资源号.
如果文件是一个.ICO文件,返回值为1. 必须调用DestroyIcon来销毁由ExtractIcon返回的图标句柄CClientDC clientDc(this);HICON hIcon = ExtractIcon(AfxGetApp()->m_hInstance,"C:\\Program Files\\Outlook Express\\msimn.exe",1);
clientDc.DrawIcon(10,10,hIcon);//返回图标数目
HICON hIcon = ExtractIcon(AfxGetApp()->m_hInstance,"C:\\Program Files\\Outlook Express\\msimn.exe",-1);
CString str;
str.Format("%d",hIcon);
AfxMessageBox(str);DestroyIcon(hIcon);
-----------------------------------------------