0

具体来说,我正在尝试编写一个在不同的 Windows 系统上运行的 Windows 程序,主要是 XP 和 Win7 或 Win8。我希望它从系统文件中的某处加载系统默认图标(我也不知道)。这可能吗?我该怎么做?

例如,Text.txt 文件在 Windows XP 上有它的图标,但在 Win7 上有不同的图标。XP的回收站也不同于Win7的回收站。那么我在哪里可以将这个与系统相关的图标加载到我的程序中呢?ps 我使用的是 VC6,而不是 .NET。

4

1 回答 1

2

如果您想要特定类型文件的图标,您可以使用SHGetFileInfo. 例如,要获取文本文件的图标:

SHFILEINFO sfi;
if (SHGetFileInfo(L".txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES ))
{
    // you now have the icon in sfi.hIcon
    // remember to destroy it when you are done with it
    DestroyIcon(sfi.hIcon);
}

标志表示我们想要大SHGFI_ICON图标。您可以添加SHGFI_SMALLICON标志以获取小图标。

SHGFI_USEFILEATTRIBUTES表示我们传递的文件名不必存在 - 该函数将返回文件类的图标,而不是特定的现有文件。如果您想要特定文件的图标,则将文件的完整路径名传递给SHGetFileInfo函数并省略此标志。

如果您想要像回收站这样的系统文件夹的图标,这个功能也可以做到这一点。例如:

LPITEMIDLIST pidl;
if (SUCCEEDED(SHGetFolderLocation(0, CSIDL_BITBUCKET, 0, 0, &pidl)))
{
    SHFILEINFO sfi;
    if (SHGetFileInfo((LPCWSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_PIDL))
    {
        // you now have the icon in sfi.hIcon
        // remember to destroy it when you are done with it
        DestroyIcon(sfi.hIcon);
    }
    CoTaskMemFree(pidl);
}

SHGetFileInfo有关标志的完整列表,请参阅文档。并确保在使用这些函数之前已调用OleInitialize()CoInitializeEx()初始化 COM。

于 2013-09-30T06:44:18.143 回答