关于 CreateWindowEx 静态控件带 SS_ICON 标志直接显示图标的问题
CreateWindowEx (扩展样式, “Static”, 图标标示符, 位或 (#SS_ICON, #SS_CENTERIMAGE, #WS_GROUP, #WS_CHILD, #WS_VISIBLE), 32, 64, 32, 32, lhWnd, 0, 实例句柄, 0)
先创建的窗口句柄是 lhWnd ,按照上述语法再写个静态控件带有 SS_ICON 标志时,他可以显示图标,并且参考MSDN的说明,直接显示图标依赖2个参数,就是上述的“图标标示符”和“实例句柄”,即 CreateWindowEx 的“lpWindowName”和“hInstance”参数,前一个指定加载的图标标示符文本,格式为“#num”。后一个是该图标所在模块的实例句柄。
比如上述语句换为:
CreateWindowEx (扩展样式, “Static”, “#16”, 位或 (#SS_ICON, #SS_CENTERIMAGE, #WS_GROUP, #WS_CHILD, #WS_VISIBLE), 32, 64, 32, 32, lhWnd, 0, GetModuleHandle (“shell32.dll”), 0)
这就可以在创建的静态控件中直接显示 我的电脑 图标
我的应用是这样的:
已知一个全路径文件,我想要获取他的图标或其关联图标,在创建这个静态控件时直接显示出来!
我的做法是先获取这个文件的后缀名,是exe的话直接取他的第一个图标,否则我是去查注册表 HKEY_CLASSES_ROOT 找关联类型,再查到某类型的 DefaultIcon 这个项,取得关联图标所在的文件和索引(这里可以实现了,但是不知道是否有更好的方法???)
我测试了,当给出的文件的图标是关联到 shell32.dll 中时,是可以正常显示的。但是如果关联到某个exe程序时,就没办法显示了。。。经查,GetModuleHandle 返回的是 0,错误码 126,即指定模块未发现。。。我想,这里是不该用 GetModuleHandle 这个API的,那该用什么呢???这是我想问的最关键的问题。。。
描述的不很清晰,大家看的懂吧?帮帮忙,谢谢!!!!!!!
[解决办法]
晕,这种问题还是推荐你去VC\SDK的那里发问,VB这边少有人回答的。
hStatic = CreateWindowEx(0, "Static", "Label", &H40000000 Or &H10000000 Or &H3, 0, 0, 50, 50, Form1.hWnd, 0, App.hInstance, 0)
&H3标志指定这个Static为一个ICO容器。
SendMessage hStatic,370,1,ByVal 图标句柄
这个SendMessage用法是发送一个设定ICO的消息给Static控件,第三个参数为1是小图标,0则是大图标。
最后一个参数为图标句柄,请传一个Long类型的值,并且使用ByVal方式。
PS:SHGetFileInfo函数可以取得一个文件的图标句柄。如果一个PE文件有多个图标,你要取得句柄请使用ExtractIcon函数,这个函数可以取得指定资源标示的图标句柄。如果你想取得一个PE文件的第一个图标可以使用ExtractAssociatedIcon函数。
说了那么多,给分了,嘿嘿~~~