用 PictureVal 直接在 Image 控件上显示系统默认文件类型的图标

原创 2014年03月30日 11:37:59

表单上加一个 Image 和 CommandButton 控件,按钮的 Click 中贴下面代码:

If Version(5) < 900 or Val(GetWordNum(Version(4), 4, '.')) < 5815
    MessageBox('版本太低,至少要 vfp9sp2(5815)。', '')
    Return
EndIf

Local cFile, nSize, cSFI, nBuf, nWidth, nHeight, nSize, cPicVal
Local hIcon, hTk, hBmp, pMem, hStream

* ------------------------------------------------------------------------------
* -- 提取某类或某个文件的默认图标(在 Windows 文件夹中显示的图标)
m.cFile = InputBox('指定要提取图标的文件扩展名或留空待选定某个确定的文件:')
m.nSize = 0        && 0/1 - 大/小图标
* ------------------------------------------------------------------------------
Do case
Case Empty(m.cFile)
    m.cFile = GetFile()
Case Empty(JustExt(m.cFile))
    m.cFile = ForceExt('sample', m.cFile)
EndCase
If Empty(m.cFile)
    Return
EndIf

Declare Long SHGetFileInfo in shell32 String, Long, String @, Long, Long
Declare Long GdiplusStartup in GDIPlus Long @, String @, Long @
Declare Long GdiplusShutdown in GDIPlus Long
Declare Long GdipCreateBitmapFromHICON in GDIPlus Long, Long @
Declare Long GdipGetImageHeight in GDIPlus Long, Long @
Declare Long GdipGetImageWidth in GDIPlus Long, Long @
Declare Long GdipSaveImageToStream In GDIPlus Long, Long, String, Long
Declare Long GdipDisposeImage In GDIPlus Long
Declare Long GlobalAlloc in win32api Long, Long
Declare Long GlobalFree in win32api Long
Declare Long CreateStreamOnHGlobal in ole32 Long, Long, Long @
Declare Long ReleaseStgMedium in ole32  String

m.cSFI = Replicate(Chr(0), 4*3 + 260 + 80)
SHGetFileInfo(m.cFile, 0, @ m.cSFI, Len(m.cSFI), 0x100+0x10+m.nSize)
m.hIcon = CToBin(Left(m.cSFI,4),'4rs')

m.hTk = 0
m.nBuf = 0h01 + Replicate(Chr(0),15)
GdiplusStartup(@ m.hTk, @m.nBuf, 0)
m.hBmp = 0
GdipCreateBitmapFromHICON(m.hIcon, @ m.hBmp)
m.nWidth = 0
m.nHeight = 0
GdipGetImageWidth(m.hBmp, @ m.nWidth)
GdipGetImageHeight(m.hBmp, @ m.nHeight)
    
m.nSize = m.nWidth * m.nHeight * 4 + 64
m.pMem = GlobalAlloc(0x40, m.nSize)
m.hStream = 0
CreateStreamOnHGlobal(m.pMem, 0, @ m.hStream)
GdipSaveImageToStream(m.hBmp, m.hStream, 0h06F47C55041AD3119A730000F81EF32E, 0)
m.cPicVal = Sys(2600, m.pMem, m.nSize)

ReleaseStgMedium(BinToC(4,'rs')+BinToC(m.hStream,'rs')+BinToC(0,'rs'))
GlobalFree(m.pMem)

GdipDisposeImage(m.hBmp)
GdiplusShutdown(m.hTk)

* -----------------------------------------------------
Thisform.Image1.PictureVal = m.cPicVal
* -----------------------------------------------------


不要学习代码,要学会思考

英文:Yevgeniy Brikman 译文:伯乐在线 - 赖信涛 链接:http://blog.jobbole.com/92285/ 这是一个人人都在学习编程的时代:Code.org请了比尔·...

C#监测全局键盘与鼠标事件

在C#中一般不能用SetWindowHookEx监视全局键盘与鼠标事件,微软给出的解释是托管程序不能与非托管共享链接库交互,在网上找了老半天才发现了这个解决方案,拿出来与大家分享一下,希望可以节约对这...
  • ferlydf
  • ferlydf
  • 2011年05月09日 17:24
  • 259

Java获取系统文件类型图标并显示在JSP上

在网站制作中通常需要上传附件,而对于附件我们往往希望在其名称前面有类似于Windows系统中的类型图标,那么怎么根据附件的类型来显示不同的图标呢?目前有两种解决方案:  第一种:将所有类型文件的图标图...

Java获取系统文件类型图标并显示在JSP上

转自: 在网站制作中通常需要上传附件,而对于附件我们往往希望在其名称前面有类似于Windows系统中的类型图标,那么怎么根据附件的类型来显示不同的图标呢?目前有两种解决方案:  ...
  • k678mh
  • k678mh
  • 2014年08月04日 17:28
  • 416

获取并显示一个文件类型图标

  • 2014年07月25日 15:35
  • 3KB
  • 下载

获取各文件类型在系统中注册的图标

作者:野比 (conmajia@gmail.com) 时间:May, 2012 封面图片为野比原创,请勿未经允许私自引用 下载 DEMO 下载源码 (...

php 上传文件显示文件类型图标

  • 2016年01月04日 10:43
  • 426KB
  • 下载

FileTypesMan-更改Windows 7文件类型的默认图标

原文链接:http://www.bzdiao.com/filetypesman/ 对于美化一族来说,和别人不同,而且整体视觉效果不错,是他们最大的追求!如果,你想改变一下一成不变的文件类型的默认...

SHGetFileInfo 显示文件类型图标

需要显示远程目录下文件跟文件夹的图标,但是软件并不支持直接获取远程目录下的图标,这时候就需要读取本机对应的目录图标和对应类型文件图标。 初始化的时候。需要将Imagelist设置给ListCtrl控...
  • wowbell
  • wowbell
  • 2011年12月26日 17:53
  • 3760
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用 PictureVal 直接在 Image 控件上显示系统默认文件类型的图标
举报原因:
原因补充:

(最多只允许输入30个字)