如何用picturebox扩缩背景透明的ico文件?

无·法 2010-01-11 05:52:23
先来看段代码:
Private Sub Command1_Click()
Me.Controls.Add "VB.PictureBox", "picTmp"
Me!picTmp.AutoRedraw = True
Me!picTmp.AutoSize = True
Me!picTmp.Appearance = 0
Me!picTmp.BorderStyle = 0
' Me!picTmp.BackColor = Command1.BackColor
Me!picTmp.Width = Command1.Picture.Width * 1.1
Me!picTmp.Height = Command1.Picture.Height * 1.1

Me!picTmp.PaintPicture Command1.Picture, 0, 0, Command1.Picture.Width * 1.1, Command1.Picture.Height * 1.1

Command1.Width = Command1.Width * 1.1
Command1.Height = Command1.Height * 1.1
Set Command1.Picture = Me!picTmp.Image

Me.Controls.Remove "picTmp"
End Sub

界面上就Command1一个控件,其style设置为1,picture属性添加了一个ico文件,上面的代码就是将控件和里面的ico图标都扩大1.1倍,处理方法很简单,创建了个临时的picturebox使用其PaintPicture方法扩缩好然后给command1,这样的就达到扩缩效果了。
问题是“按钮上的图标是扩缩了,可是背景是空白,与按钮本来的颜色显得格格不入”。(csdn不让上传图了,faint。)
有个方案就是给临时创建的皮cturebox背景色设置成和Command1的一致,也就是将上面被注释掉的一行拿掉,这样是可以解决。可是如果用了部分第三方按钮,本身并没有提供backcolor这样的属性,那么就不行了,事实就是如此。
所以必须对ico扩缩时仍旧使得它背景透明,各位有什么好方法阿?
...全文
180 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyserver 2010-01-13
  • 打赏
  • 举报
回复
一、需要保证图片格式为有透明背景的ICON、GIF或PNG。
二、如果是ICON或GIF,则直接使用Render方法绘制,在绘制时缩放;如果是PNG,则使用GDI+中的GdipDrawImageRectRectI函数绘制。
无·法 2010-01-13
  • 打赏
  • 举报
回复
我那段代码实际是要独立与应用程序之外的,通用化的。
如果选择给临时picturebox设置背景色,只有通过第三方控件提供获得背景色的接口。
虽然“设计时知道其背景色”、“很多时候用操作系统的默认按钮色”、“api通透”,可是这样都不行的。
我觉得直接扩缩ico文件应该是可以的,因为某些专业ico制作工具是可以办到的。
如果实在办不到,那么只有找厂商了,使用的第三方控件不止一种,大多数是有有backcolor属性的。
嗷嗷叫的老马 2010-01-13
  • 打赏
  • 举报
回复
路过,帮顶.
舉杯邀明月 2010-01-13
  • 打赏
  • 举报
回复
Mark ....
cbm6666 2010-01-12
  • 打赏
  • 举报
回复
"有个方案就是给临时创建的皮cturebox背景色设置成和Command1的一致"

因你这句话 我改变了思路, 也因为你的Command1早已有了图片 所以我将Command1整个图像当作Picture1的背景, 如此则不用考虑透明的问题.
cbm6666 2010-01-12
  • 打赏
  • 举报
回复
'添加 Command1 Picture1

Option Explicit
Private Declare Function PrintWindow Lib "user32" (ByVal Hwnd As Long, ByVal HDC As Long, ByVal nFlags As Long) As Long
Dim pic As New StdPicture, W&, H&
Private Sub Command1_Click()
'Command1.Style = 1 '设计时期设置
Command1.Width = Command1.Width * 1.1
Command1.Height = Command1.Height * 1.1
'*****************************************
With Picture1
.AutoSize = True
.BorderStyle = 0
.Picture = Command1.Picture
W = .Width * 1.1: H = .Height * 1.1
.AutoSize = False
.Width = Command1.Width
.Height = Command1.Height
.AutoRedraw = True
.Move Screen.Width
End With
'****************************************************
Set pic = Picture1.Picture
Set Picture1 = Nothing
PrintWindow Command1.Hwnd, Picture1.HDC, 0
Picture1.PaintPicture pic, (Command1.Width - W) \ 2, (Command1.Height - H) \ 2, W, H
'*****************************************************************
Set Command1.Picture = Picture1.Image
End Sub
Tiger_Zhao 2010-01-12
  • 打赏
  • 举报
回复
    Me!picTmp.BackColor = Command1.BackColor

把这个注释去掉,设置一样的背景色就可以了。
cbm6666 2010-01-12
  • 打赏
  • 举报
回复
忘了给你 GdiTransparentBlt的示例

这是让蓝色背景透明的代码

Option Explicit '强制宣告定义变量
Private Declare Function GdiTransparentBlt Lib "gdi32" (ByVal hdc1 As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal W1 As Long, ByVal H1 As Long, ByVal Hdc2 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal W2 As Long, ByVal H2 As Long, ByVal Color As Long) As Long
Dim W&, H&, TransColor& '定义变量
Private Sub Form_Load()
Me.BorderStyle = 0: Me.Caption = ""
Me.AutoRedraw = True: Me.KeyPreview = True
'将窗体居中显示 (屏幕宽度减去窗体的宽度)除以2 , (屏幕高度减去窗体的高度)除以2
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
TransColor = RGB(0, 0, 255)
W = Picture1.Width \ 15: H = Picture1.Height \ 15
Picture1.AutoRedraw = True
Picture1.Move Screen.Width
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set Form1 = Nothing
End
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then Unload Me
End Sub

Private Sub Form_Click()
GdiTransparentBlt Me.hDC, (Me.Width - W * 15) \ 2 \ 15, (Me.Height - H * 15) \ 2 \ 15, W, H, Picture1.hDC, 0, 0, W, H, TransColor
Me.Refresh
End Sub
chinaboyzyq 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 sysdzw 的回复:]
有个方案就是给临时创建的皮cturebox背景色设置成和Command1的一致,也就是将上面被注释掉的一行拿掉,这样是可以解决。可是如果用了部分第三方按钮,本身并没有提供backcolor这样的属性,那么就不行了,事实就是如此。
[/Quote]


Private Sub Command1_Click()
Me.Controls.Add "VB.PictureBox", "picTmp"
Me!picTmp.AutoRedraw = True
Me!picTmp.AutoSize = True
Me!picTmp.Appearance = 0
Me!picTmp.BorderStyle = 0
Me!picTmp.BackColor = &H8000000F '这里只要知道command1的背景色就可以了,并不需要有command1的backcolor属性
'第三按钮如果没有backcolor属性,大多数会是操作系统的默认按钮色
Me!picTmp.Width = Command1.Picture.Width * 1.1
Me!picTmp.Height = Command1.Picture.Height * 1.1

Me!picTmp.PaintPicture Command1.Picture, 0, 0, Command1.Picture.Width * 1.1, Command1.Picture.Height * 1.1

Command1.Width = Command1.Width * 1.1
Command1.Height = Command1.Height * 1.1
Set Command1.Picture = Me!picTmp.Image

Me.Controls.Remove "picTmp"
End Sub

'第二种处理方式
Private Sub Command1_Click()
Me.Controls.Add "VB.PictureBox", "picTmp"
Me!picTmp.AutoRedraw = True
Me!picTmp.AutoSize = True
Me!picTmp.Appearance = 0
Me!picTmp.BorderStyle = 0
' Me!picTmp.BackColor = Command1.BackColor
Me!picTmp.Width = Command1.Picture.Width * 1.1
Me!picTmp.Height = Command1.Picture.Height * 1.1
Me!picTmp.PaintPicture Command1.Picture, 0, 0, Command1.Picture.Width * 1.1, Command1.Picture.Height * 1.1
Command1.MaskColor = QBColor(15) '利用按钮的遮罩色(VB中叫屏蔽色)
Command1.UseMaskColor = True '使用按钮遮罩设置
Command1.Width = Command1.Width * 1.1
Command1.Height = Command1.Height * 1.1
Set Command1.Picture = Me!picTmp.Image

Me.Controls.Remove "picTmp"
End Sub
孤独剑_LPZ 2010-01-11
  • 打赏
  • 举报
回复
看看说明
VB声明
Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
说明
将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容。这个函数会在设备场景中定义一个目标矩形,并在位图中定义一个源图象。源矩形会根据需要进行伸缩,以便与目标矩形的大小相符
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hdc Long,目标设备场景
x,y Long,目标矩形左上角的x,y坐标,以逻辑坐标表示
nWidth,nHeight Long,目标矩形的宽度和高度,以逻辑坐标表示
hSrcDC Long,源设备场景。如光栅运算未指定一个源,则这个参数应为零
xSrc,ySrc Long,用源DC的逻辑坐标表示的源矩形左上角位置
nSrcWidth,nSrcHeight Long,分别指定用逻辑单位(以源DC为基础)传输的一幅图象的宽度和高度。如其中有一个参数的符号(指正负号)与对应的目标参数不符,位图就会在对应的轴上作镜像转换处理
dwRop Long,传输过程中进行的光栅运算。如刷子属于光栅运算的一部分,就使用选入目标DC的刷子
注解
可用GetDeviceCaps函数判断特定的设备场景是否支持此函数
不可选择对源位图进行剪切或旋转处理,源位图也不能是一个图元文件设备场景
无·法 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cbm666 的回复:]
GdiTransparentBlt或 StretchBlt 都能使图像伸缩, 并保持透明, PaintPicture或Bitblt是无法透明背景的
[/Quote]cbm666老师,有直接应用于上面这样的范例吗?
cBirdNO1NO1 2010-01-11
  • 打赏
  • 举报
回复
如果第三方按钮上加载了一个ICO,你可以在设计时知道其背景色呀!
cbm6666 2010-01-11
  • 打赏
  • 举报
回复
GdiTransparentBlt或 StretchBlt 都能使图像伸缩, 并保持透明, PaintPicture或Bitblt是无法透明背景的

7,762

社区成员

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

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