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的,那该用什么呢???这是我想问的最关键的问题描述的不很清晰,大家看的懂吧?帮帮忙,谢谢!!!!!!!

解决方案 »

  1.   

    你可以创建一个Static是ICO类型的,然后使用SendMessage设置图标。
      

  2.   

    SendMessage 发送 WM_SETICON 消息?
    我测试过了。。没反映,不知道为了点什么郁闷!!
      

  3.   

    还是要请大侠们帮我研究了好久还是不行
    换成使用 LoadLibrary 代替 GetModuleHandle 依然是无法加载到 EXE 文件的图标
    获取关联图标所在文件的路径倒是找到了2个API可以实现: FindExecutable 和 AssocQueryString,可是也没大用。。这2个都是只能取到关联所在的文件路径,而不知道关联到哪个图标(就是图标索引找不到,既注册表 DefaultIcon 项的值之中“,”符号后面那个数),不知道有无API实现该功能总之 LoadLibrary/GetModuleHandle/FindExecutable/AssocQueryString 这些都是无法满足我获取到有效的 CreateWindowEx 中有效的倒第2个参数 hInstance 这个句柄的求啊求。。到底咋才可以呢?PS:我不要在回调函数中画上去那种,只是要实现在创建时就显示哦。
      

  4.   

    晕,这种问题还是推荐你去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函数。说了那么多,给分了,嘿嘿~~~
      

  5.   

    现在的问题简单了。。经过测试发现,使用 LoadLibrary 即可。。但是目前有这么个问题:hInstance 这个参数使用 LoadLibrary DLL或EXE都没问题
    而lpWindowName 这个字符串就有问题了现在。
    一个文件的图标(无论是关联到别的DLL或EXE还是自己本身带图标资源的),在资源里面这个图标有2种方法表示图标的标识符:一种是纯数字的,另一种是文本串的。开始我没考虑到这问题。所以遇到给定文件是EXE时,我直接传 lpWindowName 是“#1”,所以才取不出来。而我在程序里是使用获取注册表 DefaultIcon 项来找到文件所关联到的图标路径名称以及图标索引的,如果按照这种方法下去,我就要知道,如何通过注册表里这个图标索引,找到真正的图标标识符的:
    比如:
    给定一个DOC文件,在注册表里他的 DefaultIcon 为:
    C:\WINDOWS\Installer\{90110804-6000-11D3-8CFE-0150048383C9}\wordicon.exe,1
    其中:C:\WINDOWS\Installer\{90110804-6000-11D3-8CFE-0150048383C9}\wordicon.exe 这个文件使用 LoadLibrary 完全可以加载的。但是那个“,1” 其实代表的是第一个图标,而不是真正的图标标示符,查看资源可以看到,wordicon.exe 这里第一个图标资源的标识符是200,也就是说我给上述的 lpWindowName 参数传递“#200”,其实完全就可以实现在创建时就显示出这个WORD文档的图标了所以目前我的问题变为一句:
    通过注册表查到的:
    C:\WINDOWS\Installer\{90110804-6000-11D3-8CFE-0150048383C9}\wordicon.exe,1
    类似这样的语句,我如何通过其索引(这里的是1)查到在前面文件里真正的资源标识符(例子中是200,当然有的还不一定是数字,比如某些EXE的就是“MAINICON”)PS:当然,如果不用通过注册表而直接使用某些API可以从一个给定文件直接获取其关联图标的所在文件的路径以及图标标示符,那就是最完美的了(我曾经测试过FindExecutable/AssocQueryString/ExtractAssociatedIcon 但都未果)希望有兴趣的前辈们帮忙看看!!!谢谢啦!!!
      

  6.   

    感谢 6 楼。。你的这个方法我刚测试了下,通过
    不过我想问下,370是什么消息?我以为是 128呢(WM_SETICON)但是看我7楼的帖子,既然我已经测试到这个地步了,我就很想搞清楚,直接在创建时就显示该怎么做现在只差一步了。。就是通过索引怎么获取到图标标示符这个文本串。
      

  7.   

    只要是个PE文件LoadLibrary都可以载入。
    Me.Caption = LoadLibrary("C:\Windows\notepad.exe")
    MsgBox GetModuleHandle("notepad.exe")
      

  8.   

    发送什么消息?是WM_SETICON吗?
      

  9.   

    发送什么消息?是WM_SETICON吗?