VB.NET 淡出按钮正确
VB.NET Fading out button properly
如何正确淡出 out/in VB.NET 中的按钮?我可以淡化 out/in 标签使用:
Controls(i).ForeColor = Color.FromArgb(255, alpha, alpha, alpha)
(其中 Controls(i)
是来自 For
Next
循环遍历 Me.Controls
中所有控件的标签;alpha
是 RGB 的值,也来自 For
Next
循环)。
这 不 对我的按钮有用,因为更改 ForeColor
会使其余按钮的 UI 可见!
因此,我尝试的方法是使用已保存的 Resource
按钮图像(来自屏幕截图)并创建一个褪色的 in/out 版本以显示为 PictureBox
:
Public Function SetImageOpacity(ByVal imgPic As Image, ByVal imgOpac As Double) As Image
Dim bmpPic As New Bitmap(imgPic.Width, imgPic.Height)
Dim grPic As Graphics = Graphics.FromImage(bmpPic)
Dim imgAtt As New ImageAttributes()
Dim cmxPic As New ColorMatrix()
cmxPic.Matrix33 = imgOpac
imgAtt.SetColorMatrix(cmxPic, ColorMatrixFlag.[Default], ColorAdjustType.Bitmap)
grPic.DrawImage(imgPic, New Rectangle(178, 144, bmpPic.Width, bmpPic.Height), imgPic.Width, imgPic.Height, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, imgAtt)
grPic.Dispose()
imgAtt.Dispose()
Return bmpPic
End Function
(其中 imgPic
是按钮的 Resource
图像,imgOpac
是 1 到 0 范围内的不透明度,其中 0 是透明的)。
然后我使用这张图片来设置我的 PictureBox
的图片:
picbox.Image = SetImageOpacity(My.Resources.Nextbutton, 1)
但是,我遇到一个小故障,即使 PictureBox
位于坐标 178, 144
,它显示的图像显示在表单的左边缘(即错误的 X 坐标), Y坐标正确!
我觉得这可能与我对 .DrawImage(
...)
的调用有关(在函数的第 8 行)- 但 the MSDN docs on this subject 对我来说非常不清楚。
如果之前有人问过,请link!
Graphics grPic
中的坐标是 client 相对于图像本身的坐标,而不是 Form 的坐标。所以 (0, 0) 是图像的左上角,不管该图像最终在某种控件中显示在哪里。
尝试将其更改为 (0, 0):
grPic.DrawImage(imgPic, New Rectangle(0, 0, bmpPic.Width, bmpPic.Height), imgPic.Width, imgPic.Height, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, imgAtt)
为什么不使用 for 循环将按钮控件的不透明度以 0.01 为增量从 1 更改为 0?
如何正确淡出 out/in VB.NET 中的按钮?我可以淡化 out/in 标签使用:
Controls(i).ForeColor = Color.FromArgb(255, alpha, alpha, alpha)
(其中 Controls(i)
是来自 For
Next
循环遍历 Me.Controls
中所有控件的标签;alpha
是 RGB 的值,也来自 For
Next
循环)。
这 不 对我的按钮有用,因为更改 ForeColor
会使其余按钮的 UI 可见!
因此,我尝试的方法是使用已保存的 Resource
按钮图像(来自屏幕截图)并创建一个褪色的 in/out 版本以显示为 PictureBox
:
Public Function SetImageOpacity(ByVal imgPic As Image, ByVal imgOpac As Double) As Image
Dim bmpPic As New Bitmap(imgPic.Width, imgPic.Height)
Dim grPic As Graphics = Graphics.FromImage(bmpPic)
Dim imgAtt As New ImageAttributes()
Dim cmxPic As New ColorMatrix()
cmxPic.Matrix33 = imgOpac
imgAtt.SetColorMatrix(cmxPic, ColorMatrixFlag.[Default], ColorAdjustType.Bitmap)
grPic.DrawImage(imgPic, New Rectangle(178, 144, bmpPic.Width, bmpPic.Height), imgPic.Width, imgPic.Height, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, imgAtt)
grPic.Dispose()
imgAtt.Dispose()
Return bmpPic
End Function
(其中 imgPic
是按钮的 Resource
图像,imgOpac
是 1 到 0 范围内的不透明度,其中 0 是透明的)。
然后我使用这张图片来设置我的 PictureBox
的图片:
picbox.Image = SetImageOpacity(My.Resources.Nextbutton, 1)
但是,我遇到一个小故障,即使 PictureBox
位于坐标 178, 144
,它显示的图像显示在表单的左边缘(即错误的 X 坐标), Y坐标正确!
我觉得这可能与我对 .DrawImage(
...)
的调用有关(在函数的第 8 行)- 但 the MSDN docs on this subject 对我来说非常不清楚。
如果之前有人问过,请link!
Graphics grPic
中的坐标是 client 相对于图像本身的坐标,而不是 Form 的坐标。所以 (0, 0) 是图像的左上角,不管该图像最终在某种控件中显示在哪里。
尝试将其更改为 (0, 0):
grPic.DrawImage(imgPic, New Rectangle(0, 0, bmpPic.Width, bmpPic.Height), imgPic.Width, imgPic.Height, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, imgAtt)
为什么不使用 for 循环将按钮控件的不透明度以 0.01 为增量从 1 更改为 0?