怎样获得系统图标
编号:QA004556
建立日期: 2002年3月2日 最后修改日期:2002年3月2日
所属类别:
turtlevan:
操作系统: Windows9X
编程工具: VC++
问题: 怎样获得系统图标,比如硬盘的图标,光盘的图标,各种文件类型的图标,打开的和关闭的文件夹的图标?就像资源管理器里那样?
水平: 刚入门
回答:
这些系统图标都保存在shell32.dll中。不过Windows在显示图标时先检查注册表:
Hkey_Local_Machine\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons
下的值,如果在这里发现了设置好的值,则使用这里设置的结果。例如:
"3"="C:\\MyIcons.dll,7"
表示将关闭的文件夹的图标修改为C:\MyIcons.dll中的第7个图标。
象TweakUI等应用程序可以修改默认的系统图标,实际上就是在这里写入相应的值。
0 |
默认 图标 |
|
1 |
默认的 .doc 图标
* |
|
2 |
可执行文件图标 |
|
3 |
关闭的文件夹图标 |
|
4 |
打开的文件夹图标 |
|
5 |
5.25' 驱动器图标 |
|
6 |
3.5' 驱动器图标 |
|
7 |
可移动的驱动器图标 |
|
8 |
硬盘驱动器图标 |
|
9 |
网络驱动器图标 |
|
10 |
断开的网络驱动器图标 |
|
11 |
CD-ROM驱动器图标 |
|
12 |
RAM驱动器图标 |
|
13 |
整个网络图标 |
|
14 |
网络连接图标 u |
|
15 |
网络工作站图标 |
|
16 |
本地打印机图标
* |
|
17 |
网络图标 u |
|
18 |
网络工作组图标 u |
|
19 |
程序组图标 s |
|
20 |
文档图标 s |
|
21 |
设置图标 s |
|
22 |
查找图标 s |
|
23 |
帮助图标 s |
|
24 |
运行图标 s |
|
25 |
睡眠图标 s |
|
26 |
Docking Station 图标
u |
|
27 |
关机图标 s |
|
28 |
共享图标 t |
|
29 |
快捷方式的箭头图标
t |
|
30 |
大箭头图标 u |
|
31 |
空回收站图标 * |
|
32 |
满的回收站图标
* |
|
33 |
拨号网络图标 * |
|
34 |
桌面图标 |
|
35 |
控制台图标
* |
|
36 |
程序组图标 s |
|
37 |
打印机文件夹图标
* |
|
38 |
字体文件夹图标
* |
|
39 |
Windows旗帜图标
* |
|
40 |
Audio CD 图标 |
|
后面标有符号的说明有特殊用法:
* 这些图标可以在注册表的其他地方的设置。(后面会提到。)
t 这些图标必须是空白背景。
s 这些图标将用在开始菜单上。
u 这些图标可能并没有使用或不能通过注册表修改。
下面是一个简单的例子,用来读取系统图标:
HICON CShellList::GetShellIcon( int nIndex )
{
HICON hIcon = NULL;
HKEY hkeyShellIcons;
if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Icons"), 0, KEY_READ, &hkeyShellIcons) == ERROR_SUCCESS)
{
TCHAR szBuffer[ MAX_PATH * sizeof TCHAR];
DWORD dwSize = MAX_PATH * sizeof TCHAR;
TCHAR szIndex[4];
wsprintf( szIndex, _T("%d"), nIndex );
if (RegQueryValueEx( hkeyShellIcons, szIndex, NULL, NULL, (LPBYTE)szBuffer, &dwSize) == ERROR_SUCCESS)
{
CString strFile, strIndex;
AfxExtractSubString( strFile, szBuffer, 0, _T(',') );
AfxExtractSubString( strIndex, szBuffer, 1, _T(',') );
ExtractIconEx( strFile, atoi(strIndex), NULL, &hIcon, 1 );
}
RegCloseKey( hkeyShellIcons );
}
// Add folder images
if (!hIcon)
ExtractIconEx(_T("SHELL32.DLL"), nIndex, NULL, &hIcon, 1);
return hIcon;
}
还有一些图标可以在Hkey_Classes_Root\CLSID下面的键中设置,包括上面的15、17、31、32、33、35、37和38 。这些图标有:
1、我的计算机
HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\
DefaultIcon\
默认值 = explorer.exe,0
2、、网络邻居
HKEY_CLASSES_ROOT\CLSID\{208D2C60-3AEA-1069-A2D7-08002B30309D}\
DefaultIcon\
默认值= shell32.dll,17
3、回收站
HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\
DefaultIcon\
默认值= shell32.dll,32
空的默认值= shell32.dll,31
满的默认值= shell32.dll,32
4、收件箱
HKEY_CLASSES_ROOT\CLSID\{00020D75-0000-0000-C000-000000000046}\
DefaultIcon\
默认值= c:\exchange\exchng32.exe
5、、Internet Explore
Internet Explore 4.0以上:
HKEY_CLASSES_ROOT\CLSID\{FBF23B42-E3F0-101B-8488-00AA003E56F8}\
DefaultIcon\
默认值=C:\Program Files\Internet Explorer\iexplore.exe,-32528
Internet Explorer Version 3.x:
HKEY_CLASSES_ROOT\CLSID\{FBF23B42-E3F0-101B-8488-00AA003E56F8}\
DefaultIcon\
默认值= C:\Program Files\Internet Explorer\iexplore.exe,0"
此问题由李海回答。
| |
|
|
| |
|
|