VB提取软件的ICO图片保存出来提示此文件的版本与运行的windows不兼容

狼二羊 2018-01-22 03:51:43
我的windows版本是64..保存出来的图片提示不兼容。

Private Declare Function extracticon& Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByValnIconIndex As Long)
Private Declare Function DrawIcon& Lib "user32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long)

Private Sub Command1_Click()

'获取程序图标
Dim X As Integer, myval As Integer
CommonDialog1.Filter = "EXE 文件|*.EXE"
CommonDialog1.ShowOpen
Picture1.Cls
hIcon = extracticon(0, CommonDialog1.filename, 0)
X = DrawIcon(Picture1.hDC, 5, 5, hIcon)
End Sub

Private Sub Command2_Click()

'图标另存为
Dim filename As String
On Error Resume Next
Picture1.Picture = Picture1.Image
CommonDialog1.DialogTitle = "保存"
CommonDialog1.Flags = cdlOFNHideReadOnly Or cdlOFNOverwritePrompt
CommonDialog1.Filter = "位图文件(*.ico)|*.ico"
CommonDialog1.ShowSave
If Err = 32755 Then Exit Sub
filename = CommonDialog1.filename
If filename <> "" Then
SavePicture Picture1.Picture, filename
End If

End Sub

...全文
550 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2018-01-23
  • 打赏
  • 举报
回复
对了,还说一点: 你在用 DrawIcon( )这个API函数“画”了图标之后,应该要“把图标句柄销毁”。 这才是“正确应用API的流程”。 执行:Call DestroyIcon(hIcon) 你自己添加这个API函数的声明。
舉杯邀明月 2018-01-23
  • 打赏
  • 举报
回复
遇到一个怪事了。 在IDE中,把你的代码复制下来、修正,始终画不图标(关键是 hIcon = ExtractIcon( )那儿,返回值为0); 找以前我写的代码、也是用过 ExtractIcon( ) 获取图标句柄、再画图标的程序代码来看,   虽然用法有点差异,但至少是“没有错误”啊…… 改成我之前的用法,照样画不出来…… (晚上的计算机,已经“重启”过的了) 因此“先不管这个”,编译成exe、运行、打开一个exe(这回打开的是我自己编译的VB程序),竟然把图标画出来了…………   然后,再随便找一些别的exe来试,都能画出来。 再回到“VB6”中来,没想到在IDE中,它居然鬼使神差的、也能画出图标来了!!!!   同样,随便打开哪个exe,都能把它的图标画出来! 真TMD太诡异了!!! 现在,再说楼主的问题吧: 把你的Picture1的 AutoRedraw属性,设置成True(设计时设置,或用代码在“画”之前设置都可以)就行了。 这个设置是“关键点”。 其次,你在“保存”代码中,有一句:Picture1.Picture = Picture1.Image 这个其实没必要的,只要在 SavePicture时,记住传递 “Picture1.Image”就可以了。这样就能保存“画上去的东西”。 楼主还应该清楚一点:VB6的 SavePicture ,只能保存BMP格式的图片。 即使你给它其它的“类型”,它照样是BMP! 别被“文件类型”迷惑了…… 如果要保存其它格式,必须用AP函数I、以及相关的“图像数据编码转换”,才能实现。
赵4老师 2018-01-23
  • 打赏
  • 举报
回复
引用 12 楼 Chen8013 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] 如果是我,使用Icon Workshop软件。
如果是我,使用 ResHacker 软件。 不知道你说的“Icon Workshop软件”除了自己画(或修改已有的)图标之外,有从exe、dll中提取图标的功能吗? 就算“制作图标”,IconXP 恐怕功能也不会比你说的 Icon Workshop差! 然而此软件却“很苗条”,我用的3.35版的,exe只有3.62MB,并且是只需要它的这个exe文件就可以运行。 (安装一次,只要保留好“安装后的目录”,重装系统、更换系统后都可以直接运行) 其它的帮助文件、模板文件之类的,其实完全可以不要。 虽然目前“磁盘空间根本不是个问题”,但动不动就来个几十MB、几百MB的软件,也是有点让人恶心的事。 明明是“很小巧”体积就可以做成的,为何偏偏要做得那么大呢!!! [/quote] 一眼IconXP去。
赵4老师 2018-01-23
  • 打赏
  • 举报
回复
AutoRedraw 属性 返回或设置从图形方法到持久图形.的输出。 语法 object.AutoRedraw [= boolean] AutoRedraw 属性语法包含下面部分: 部分 描述 object 对象表达式,其值是“应用于”列表中的一个对象。 Boolean 布尔表达式,指定如何重绘对象,“设置值”中有详细描述。 设置值 boolean 的设置值如下: 设置值 描述 True 使 Form 对象或 PictureBox 控件的自动重绘有效。图形和文本输出到屏幕,并存储在内存的图象中。该对象不接受绘制事件,必要时,用存储在内存中的图象进行重绘。 False (缺省值)使对象的自动重绘无效,且将图形或文本只写到屏幕上。 当需要重画该对象时,Visual Basic 会激活对象绘制事件。 说明 使用下列图形方法工作,如:Circle、Cls、Line、Point、Print 和 Pset,该属性极为重要。利用这些方法,在改变对象大小或隐藏在另一个对象后又重新显示的情况下,设置 AutoRedraw 为 True,将在 Form 或 PictureBox 控件中自动重绘输出。 运行时 在程序中设置 AutoRedraw,可以在画持久图形(如背景色或网格)和临时图形之间切换。如果设置 AutoRedraw 为 False,以前的输出成为背景屏幕的一部分。当 AutoRedraw 设置为 False,用 Cls 方法清除绘图区时不会删除背景图形。把 AutoRedraw 改回 True 后,再用 Cls 将清除背景图形。 注意 如果设置 BackColor 属性,所有图形和文本,包括持久图形,都被清除。一般来说,除非 AutoRedraw 设置为 True,所有图形都需用 Paint 事件显示。 要取回在 AutoRedraw 设置为 True 时创建的持久图形,用 Image 属性。当 AutoRedraw 设置为 True 时,用对象的 hDC 属性可以将持久图形传送给Windows API。 如果设置窗体的 AutoRedraw 属性为 False,然后最小化该窗体,则将 ScaleHeight 和 ScaleWidth 属性设置为图标大小。在 AutoRedraw 设置为 True 时,ScaleHeight 和 ScaleWidth 保持为恢复窗口的尺寸。如果设置 AutoRedraw 属性为 False,Print 方法将在诸如 Image 和 Shape 等图形控件的顶部打印。
狼二羊 2018-01-23
  • 打赏
  • 举报
回复
引用 9 楼 Chen8013 的回复:
遇到一个怪事了。 在IDE中,把你的代码复制下来、修正,始终画不图标(关键是 hIcon = ExtractIcon( )那儿,返回值为0); 找以前我写的代码、也是用过 ExtractIcon( ) 获取图标句柄、再画图标的程序代码来看,   虽然用法有点差异,但至少是“没有错误”啊…… 改成我之前的用法,照样画不出来…… (晚上的计算机,已经“重启”过的了) 因此“先不管这个”,编译成exe、运行、打开一个exe(这回打开的是我自己编译的VB程序),竟然把图标画出来了…………   然后,再随便找一些别的exe来试,都能画出来。 再回到“VB6”中来,没想到在IDE中,它居然鬼使神差的、也能画出图标来了!!!!   同样,随便打开哪个exe,都能把它的图标画出来! 真TMD太诡异了!!! 现在,再说楼主的问题吧: 把你的Picture1的 AutoRedraw属性,设置成True(设计时设置,或用代码在“画”之前设置都可以)就行了。 这个设置是“关键点”。 其次,你在“保存”代码中,有一句:Picture1.Picture = Picture1.Image 这个其实没必要的,只要在 SavePicture时,记住传递 “Picture1.Image”就可以了。这样就能保存“画上去的东西”。 楼主还应该清楚一点:VB6的 SavePicture ,只能保存BMP格式的图片。 即使你给它其它的“类型”,它照样是BMP! 别被“文件类型”迷惑了…… 如果要保存其它格式,必须用AP函数I、以及相关的“图像数据编码转换”,才能实现。
谢谢大佬啊,关键问题就是那个Picture1的 AutoRedraw属性没设置true, 感觉要蠢死
舉杯邀明月 2018-01-23
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
如果是我,使用Icon Workshop软件。
如果是我,使用 ResHacker 软件。 不知道你说的“Icon Workshop软件”除了自己画(或修改已有的)图标之外,有从exe、dll中提取图标的功能吗? 就算“制作图标”,IconXP 恐怕功能也不会比你说的 Icon Workshop差! 然而此软件却“很苗条”,我用的3.35版的,exe只有3.62MB,并且是只需要它的这个exe文件就可以运行。 (安装一次,只要保留好“安装后的目录”,重装系统、更换系统后都可以直接运行) 其它的帮助文件、模板文件之类的,其实完全可以不要。 虽然目前“磁盘空间根本不是个问题”,但动不动就来个几十MB、几百MB的软件,也是有点让人恶心的事。 明明是“很小巧”体积就可以做成的,为何偏偏要做得那么大呢!!!
赵4老师 2018-01-23
  • 打赏
  • 举报
回复
如果是我,使用Icon Workshop软件。
狼二羊 2018-01-22
  • 打赏
  • 举报
回复
引用 7 楼 Chen8013 的回复:
[quote=引用 6 楼 qq_30519247 的回复:] [quote=引用 4 楼 Chen8013 的回复:] 你“画”在PictureBox上面的,保存时不是保存Picture属性,而是应该保存它的“.image属性”。 SavePicture Picture1.Image, filename
难道是PictureBox的backcolor属性的问题?[/quote] 你点Command1之后,那个“图标”画在Picture1上了吗? 我把你的代码复制来测试,hIcon = extracticon(0, CommonDialog1.filename, 0) 结果hIcon始终是0。  不过现在没空,不清楚是什么原因造成。 反正代码看起来是没错的,extracticon( ) 的第1个参数我改成传App.hInstance也是一样。 [/quote] 画在上面了... 就是始终没有获取到那个图标。。。 大神有空帮忙看看吧
舉杯邀明月 2018-01-22
  • 打赏
  • 举报
回复
引用 6 楼 qq_30519247 的回复:
[quote=引用 4 楼 Chen8013 的回复:] 你“画”在PictureBox上面的,保存时不是保存Picture属性,而是应该保存它的“.image属性”。 SavePicture Picture1.Image, filename
难道是PictureBox的backcolor属性的问题?[/quote] 你点Command1之后,那个“图标”画在Picture1上了吗? 我把你的代码复制来测试,hIcon = extracticon(0, CommonDialog1.filename, 0) 结果hIcon始终是0。  不过现在没空,不清楚是什么原因造成。 反正代码看起来是没错的,extracticon( ) 的第1个参数我改成传App.hInstance也是一样。
狼二羊 2018-01-22
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
你“画”在PictureBox上面的,保存时不是保存Picture属性,而是应该保存它的“.image属性”。 SavePicture Picture1.Image, filename
难道是PictureBox的backcolor属性的问题?
狼二羊 2018-01-22
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
你“画”在PictureBox上面的,保存时不是保存Picture属性,而是应该保存它的“.image属性”。 SavePicture Picture1.Image, filename
改成image了,也还是不好用。。。这问题到底出在哪
舉杯邀明月 2018-01-22
  • 打赏
  • 举报
回复
你“画”在PictureBox上面的,保存时不是保存Picture属性,而是应该保存它的“.image属性”。 SavePicture Picture1.Image, filename
狼二羊 2018-01-22
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
你这个“问题”,跟Windows版本一点关系都没有。 VB6的SavePicture保存的是BMP格式的图片,根本不是“ico”格式的图标,   别以为你把扩展名改为.ico,它就是“图标”了。 应该用API直接提取图标的“资源数据”,用Binary模式直接写到ico文件,   或者你找一下VB6保存“图标”的代码,按正规的“图标格式”写入ico文件才行。
我改成bmp,可是保存出来的图片是个空白的背景。。。。
舉杯邀明月 2018-01-22
  • 打赏
  • 举报
回复
你这个“问题”,跟Windows版本一点关系都没有。 VB6的SavePicture保存的是BMP格式的图片,根本不是“ico”格式的图标,   别以为你把扩展名改为.ico,它就是“图标”了。 应该用API直接提取图标的“资源数据”,用Binary模式直接写到ico文件,   或者你找一下VB6保存“图标”的代码,按正规的“图标格式”写入ico文件才行。
狼二羊 2018-01-22
  • 打赏
  • 举报
回复

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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