根据文件扩展名显示对应的图标问题
cFilename='.xls' && 文件类型,如.xls .jpg 等等
utype=1 && 图标类型,0为大图标,1为小图标
Declare Integer SHGetFileInfo In shell32 String pszPath,Long dwFileAttributes,String @psfi,Long cbFileInfo,Long uFlags
Declare Integer GetDC In user32 Integer HWnd
Declare Short DrawIcon In user32 Integer hDC,Integer X,Integer Y,Integer hIcon
Declare Short DestroyIcon In user32 Integer hIcon
Declare Integer ReleaseDC In user32 Integer HWnd,Integer hdc
Local cBuffer,nResult,hIcon,lhDC
cBuffer=Replicate(Chr(0),1024)
nResult=SHGetFileInfo(cFilename,utype,@cBuffer,1024,272)
hIcon=CToBin(Substr(cBuffer,1,4),'4rs')
lhDC=GetDC(Thisform.HWnd)
DrawIcon(lhDC,0,0,hIcon)
DestroyIcon(hIcon)
ReleaseDC(Thisform.HWnd,lhDC)
上面这段代码,是十豆三老师在http://bbs.csdn.net/topics/390294824帖中的回复,如何将该段代码中的结果(不同文件的扩展名显示对应图标)赋值给:
THISFORM.IMAGE1.PICTURE=????
先谢谢了!
------解决思路----------------------Clear Resources
cFilename='.docx' && 文件类型,如.xls .jpg 等等
Declare Integer OleCreatePictureIndirect In oleaut32 String @lpPictDesc,String @riid,Long fOwn,Object @lplpvObj
Declare Integer SHGetFileInfo In shell32 String pszPath,Long dwFileAttributes,String @psfi,Long cbFileInfo,Long uFlags
Declare Integer GetDC In user32 Integer HWnd
Declare Short DrawIcon In user32 Integer hDC,Integer X,Integer Y,Integer hIcon
Declare Short DestroyIcon In user32 Integer hIcon
Declare Integer ReleaseDC In user32 Integer HWnd,Integer hdc
#Define SHGFI_ICON 0x000000100 && 获得图标
#Define SHGFI_USEFILEATTRIBUTES 0x000000010 && 不检测第一个参数所指定的文件是否存在
#Define SHGFI_LARGEICON 0x000000000 && Get large Icon
#Define SHGFI_SMALLICON 0x000000001 && Get small Icon
#Define PICTYPE_ICON 3
#Define GUID_Icon 0h8109F87B32BF1A108BBB00AA00300CAB && 0h0004020000000000C000000000000046
Local cBuffer,nResult,hIcon,lhDC,lcPictDesc,lqGuid,loIconObj
utype=1 && 图标类型,0为大图标,1为小图标
cBuffer=Replicate(Chr(0),1024)
nResult=SHGetFileInfo(cFilename,utype,@cBuffer,1024,SHGFI_ICON+SHGFI_LARGEICON+SHGFI_USEFILEATTRIBUTES)
hIcon=CToBin(Substr(cBuffer,1,4),'4rs')
lcPictDesc=BinToC(16,"4RS")+; && Size of Structure
BinToC(PICTYPE_ICON,"4RS")+; && Type of Image
BinToC(hIcon,"4RS")+; && Image Handle
BinToC(0,"4RS")
lqGuid=GUID_Icon
loIconObj=0
OleCreatePictureIndirect(@lcPictDesc,@lqGuid,1,@loIconObj)
If Vartype(loIconObj)='O'
lcIconFileName=Sys(2015)+'.ico'
SavePicture(loIconObj,lcIconFileName)
Thisform.Image1.Picture=lcIconFileName
Endif
lhDC = GetDC(Thisform.HWnd)
DrawIcon(lhDC,0,0,hIcon)
DestroyIcon(hIcon)
ReleaseDC(Thisform.HWnd,lhDC)
------解决思路----------------------1. 当 SHGetFileInfo 函数用来取图标时,第二个参数是没什么意义的,所以设置0或1都没有区别,要指定是取那种类型的图标,应该在第5个参数中指定,例如:
SHGFI_ICON+SHGFI_LARGEICON+SHGFI_USEFILEATTRIBUTES 用来指定取大图标
SHGFI_ICON+SHGFI_SMALLICON+SHGFI_USEFILEATTRIBUTES 用来取小图标
SHGFI_ICON+SHGFI_SHELLICONSIZE+SHGFI_USEFILEATTRIBUTES 用来取shell显示尺寸的图标
2. 用 vfp 的 SavePicture 或者 win32api 的 OleSavePictureFile 都只能保存 16 色的图片,这些函数在 gdiplus 出现后,可以说都已经过时了,现在很难碰到只使用 16 色图片的人
3. 用 SHGetFileInfo 函数取出图标后,得到的是图标句柄,你可以使用 gdiplus 将它保存为文件,然后指定给 Image.Picture 使用,关于保存为文件,你可以看看不久前的这个帖子:http://bbs.csdn.net/topics/390717978,参考其中 GdipCreateBitmapFromHICON 和 GdipSaveImageToFile 函数的用法
4. 如果不希望创建图片文件,也可以将图标转成图形数据流,然后直接赋值给 Image.PictureVal 使用
先自己试试能否按上面的描述解决问题,不行我再贴些示例代码