如何根据文件类型得到其对应的系统图标文件?

bugyouth 2003-08-20 04:16:56
如题
...全文
315 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlhcc 2003-09-13
  • 打赏
  • 举报
回复

我还可以把它保存为ico文件,代码绝对好用。

void SaveIcon(HICON hIconToSave, LPCTSTR sIconFileName)
{
if(hIconToSave==NULL || sIconFileName==NULL)
return;
//warning: this code snippet is not bullet proof.
//do error check by yourself [masterz]
PICTDESC picdesc;
picdesc.cbSizeofstruct = sizeof(PICTDESC);
picdesc.picType = PICTYPE_ICON ;
picdesc.icon.hicon = hIconToSave;
IPicture* pPicture=NULL;
OleCreatePictureIndirect(&picdesc, IID_IPicture, TRUE,(VOID**)&pPicture);
LPSTREAM pStream;
CreateStreamOnHGlobal(NULL,TRUE,&pStream);
LONG size;
HRESULT hr=pPicture->SaveAsFile(pStream,TRUE,&size);
char pathbuf[1024];
strcpy(pathbuf,sIconFileName);
CFile iconfile;
iconfile.Open(pathbuf, CFile::modeCreate|CFile::modeWrite);
LARGE_INTEGER li;
li.HighPart =0;
li.LowPart =0;
ULARGE_INTEGER ulnewpos;
pStream->Seek( li,STREAM_SEEK_SET,&ulnewpos);
ULONG uReadCount = 1;
while(uReadCount>0)
{

pStream->Read(pathbuf,sizeof(pathbuf),&uReadCount);
if(uReadCount>0)
iconfile.Write(pathbuf,uReadCount);
}
pStream->Release();
iconfile.Close();
}
zlhcc 2003-09-13
  • 打赏
  • 举报
回复
stFileInfo.hIcon就是我们所需要的 该 ico的句柄
zlhcc 2003-09-13
  • 打赏
  • 举报
回复
这个我做过。
请使用 SHGetFileInfo。

HICON hIcon;

// 获取当前驱动器信息
int a = GetLogicalDrives();

// 提取指定路径对象(文件、文件夹、驱动器)的图标
SHFILEINFO stFileInfo;
if( :: SHGetFileInfo(_T("h:\\"),0,
//&stFileInfo,sizeof(stFileInfo),SHGFI_ICON ))
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON|SHGFI_SMALLICON ))
{
hIcon = stFileInfo.hIcon;
}

m_img.Create(16, 16, ILC_MASK, 0, 4);
m_img.Add(hIcon); // 将图标添加到图像列表中

// 将图像列表和列表控件相关联
m_list.SetImageList(&m_img,LVSIL_SMALL);

m_list.InsertItem(0, "hehe", 0);
morebright 2003-09-13
  • 打赏
  • 举报
回复
SHGetFileInfo、ExtractAssociatedIcon等函数好象不能返回不存在的文件的图标. (如果根据不同的扩展名创建一个假文件, 获取图标后又删除, 未免太不专业了吧)能不能根据扩展名取得相关图标? 或其它方式?请专家指点该如何去做到?
回答:

SHGetFileInfo可以按文件类型取图标,如:
SHFILEINFO sfi;
HIMAGELIST hil;

ZeroMemory(&sfi,sizeof(sfi));
hil = SHGetFileInfo(".zip",
FILE_ATTRIBUTE_NORMAL,
&sfi,
sizeof(sfi),
SHGFI_USEFILEATTRIBUTES|SHGFI_ICON);
取得本身程序所在目录
ExtractFilePath(Application->ExeName) 先用GetModuleFileName()获得程序的全路径,再用AfxGetApp()->m_pszExeName获得程序名





我抄网上的。
bugyouth 2003-08-21
  • 打赏
  • 举报
回复
有没有人知道?
bugyouth 2003-08-20
  • 打赏
  • 举报
回复
up
bugyouth 2003-08-20
  • 打赏
  • 举报
回复
up
tigerfox 2003-08-20
  • 打赏
  • 举报
回复
查注册表,不过太笨了。

应该有简单的方法,我不会,帮你UP

bugyouth 2003-08-20
  • 打赏
  • 举报
回复
up
bugyouth 2003-08-20
  • 打赏
  • 举报
回复
up

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧