根据文件扩展名显示对应的图标问题

lygcw9602 2014-03-29 01:17:09

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=????
先谢谢了!
...全文
1554 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
YUAN168 2014-05-09
  • 打赏
  • 举报
回复
DECLARE INTEGER SHGetFileInfo IN shell32; STRING pszPath,; LONG dwFileAttributes,; STRING @psfi,; LONG cbFileInfo,; LONG uFlags DECLARE INTEGER GdipCreateBitmapFromHICON IN gdiplus; INTEGER hicon,; INTEGER @hbitmap DECLARE INTEGER GdipGetImageHeight IN gdiplus; INTEGER img,; INTEGER @ imgheight DECLARE INTEGER GdipGetImageWidth IN gdiplus; INTEGER img,; INTEGER @ imgwidth DECLARE Long GdipSaveImageToFile IN Gdiplus LONG nativeImage, STRING cFile, ; STRING EncoderClsID,; STRING EncoderParameters DECLARE LONG GdipDisposeImage IN Gdiplus LONG nativeImage Declare Long GdipBitmapSetPixel in GdiPlus.dll ; Long nativeImage, Long x, Long y, Long argb Declare Long GdipBitmapGetPixel in GdiPlus.dll ; Long nativeImage, Long x, Long y, Long @argb DECLARE INTEGER GdiplusStartup IN gdiplus; INTEGER @token, STRING @INPUT, INTEGER OUTPUT FUNCTION SaveIco2Jpg **定义函数 LPARAMETERS cFilename as string,lcOutputFile as string,utype as long **cFilename 参数:文件类型,如.xls .mdb 等等 **lcOutputFile参数:保存到本地的文件名称,如 dbf.jpg **utype参数:图标类型,0为大图标,1为小图标 ******************************************* *算法制作:行者孙(QQ:310727570) ******************************************* *VFP应用程式算法群:12787940 ******************************************* declareAPIFunction() LOCAL hToken, cInput hToken = 0 cInput = PADR(CHR(1), 16, CHR(0)) GdiplusStartup(@hToken, @cInput, 0) LOCAL cBuffer,nResult,hIcon,hbitmap,argb,imgwidth,imgheigh,ClsID_JPG ClsID_JPG=0h01F47C55041AD3119A730000F81EF32E STORE 0 TO hbitmap,argb,imgwidth,imgheight cBuffer=REPLICATE(CHR(0),1024) nResult=SHGetFileInfo(cFilename,utype,@cBuffer,1024,272) hIcon=ctobin(SUBSTR(cBuffer,1,4),'4rs') GdipCreateBitmapFromHICON(hIcon,@hbitmap) GdipGetImageHeight(hbitmap,@imgheight) GdipGetImageWidth(hbitmap,@imgwidth) FOR i=0 TO imgwidth-1 FOR ii=0 TO imgheight-1 GdipBitmapGetPixel(hbitmap,i,ii,@argb) IF argb=0 GdipBitmapSetPixel(hbitmap,i,ii,0xFFFFFF) ENDI ENDF ENDF GdipSaveImageToFile(hbitmap,STRCONV(lcOutputFile+CHR(0),5),ClsID_JPG, NULL) GdipDisposeImage(hbitmap) ENDFUNC ========================================以上放到一个program.prg中 调用 =saveico2jpg(cFileName,"c:\app.jpg",0) this.image1.Picture="c:\app.jpg"
lygcw9602 2014-03-30
  • 打赏
  • 举报
回复
谢谢猫老师了,我先按你说的试试
都市夜猫 2014-03-29
  • 打赏
  • 举报
回复
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 使用 先自己试试能否按上面的描述解决问题,不行我再贴些示例代码
lygcw9602 2014-03-29
  • 打赏
  • 举报
回复
谢谢十豆三老师,试了下改进后的代码 常用文件的图标都能显示出来 utype=1 && 图标类型,0为大图标,1为小图标 此处设置为0与1 结果没有什么不同 还有最后生成的ICO文件,色彩失真,是不是与电脑的设置有关系?
十豆三 2014-03-29
  • 打赏
  • 举报
回复
关于图片完美提取请参考dkfdtf 版主的:提取可执行文件中图标 http://blog.csdn.net/dkfdtf/article/details/5678990
十豆三 2014-03-29
  • 打赏
  • 举报
回复
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)

2,748

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧