【问题标题】:Get icons for common file types获取常见文件类型的图标
【发布时间】:2010-10-06 03:58:27
【问题描述】:

我想在我的 dll 中获取常用文件类型的图标。我正在使用 vc++。我只有文件的文件扩展名和 mime 类型,我想根据这些文件获取文件的图标。

有人可以告诉我该怎么做吗? (vc++中可用的方法需要用户提供需要图标的文件的路径。我无权访问任何此类文件)

谢谢。

【问题讨论】:

    标签: c++ winapi visual-c++ icons


    【解决方案1】:

    外壳 API

    您可以通过调用 SHGetFileInfo()SHGFI_USEFILEATTRIBUTES 标志从 shell 中获取它们 - 此标志允许例程工作而无需实际存在传入的文件名,因此如果您有文件扩展名,只需弥补一个文件名,附加扩展名,然后传入。

    通过结合其他标志,您将能够检索:

    • 由系统配置决定的大图标或小图标SHGFI_ICON|SHGFI_LARGEICONSHGFI_ICON|SHGFI_SMALLICON
    • 由 shell 配置决定的大图标或小图标SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SHELLICONSIZESHGFI_ICON|SHGFI_SMALLICON|SHGFI_SHELLICONSIZE
    • shell 图像列表中图标的索引 以及相应的图像列表:SHGFI_SYSICONINDEX
    • 存储图标的实际模块的路径和文件名(以及该模块中的图标索引):SHGFI_ICONLOCATION

    示例

    // Load a System Large icon image
    SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO), 
       SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_LARGEICON);
    
    // Load a System Small icon image
    SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO), 
       SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON);
    
    // Load a Shell Large icon image
    SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO), 
       SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SHELLICONSIZE);
    
    // Load a Shell Small icon image
    SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO), 
       SHGFI_USEFILEATTRIBUTES 
       | SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_SMALLICON);
    

    如果要绘制这样的图标,请使用以下内容:

    // Draw it at its native size
    DrawIconEx( hDC, nLeft, nTop, hIcon, 0, 0, 0, NULL, DI_NORMAL );
    
    // Draw it at the System Large size
    DrawIconEx( hDC, nLeft, nTop, hIcon, 0, 0, 0, 
                NULL, DI_DEFAULTSIZE | DI_NORMAL );
    
    // Draw it at some other size (40x40 in this example)
    DrawIconEx( hDC, nLeft, nTop, hIcon, 40, 40, 0, NULL, DI_NORMAL );
    

    图标句柄和文件系统路径可以从SHFILEINFO结构中获取:

    typedef struct _SHFILEINFOA
    {
            HICON       hIcon;                      // out: icon
            int         iIcon;                      // out: icon index
            DWORD       dwAttributes;               // out: SFGAO_ flags
            CHAR        szDisplayName[MAX_PATH];    // out: display name (or path)
            CHAR        szTypeName[80];             // out: type name
    } SHFILEINFOA;
    

    请记住,您必须在完成后通过将hIcon 传递给DestroyIcon() 来释放获得的图标。

    【讨论】:

    • @jn:我喜欢你的例子,所以我结合了我们的答案并删除了我的。
    【解决方案2】:

    从注册表中识别图标信息、关联的文件类型和处理文件的程序并从文件中提取图标。 http://www.codeproject.com/KB/shell/iconextract.aspx

    【讨论】:

    • 坏主意 - Windows 版本之间可能会发生变化。坚持记录在案的界面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2021-12-19
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多