我试图在VB6中模拟Color.ToArgb()Net函数。
对于我的尝试,我选择了红色。
在.NET中我得到了结果
Color.Red.ToArgb() = -65536
但是,我无法在VB6中重现这一点。
我的函数RGBToARGB(vbRed,255)返回-16776961
Public Function RGBToARGB(ByVal uColor As Long, ByVal uAlpha As Integer) As Long
Dim newColor As Long
' To add an Alpha channel to the RGB, simply
If uAlpha > 127 Then
newColor = uColor Or ((uAlpha - 128) * &H1000000 Or &H80000000)
Else
newColor = uColor Or (uAlpha * &H1000000)
End If
RGBToARGB = newColor
End Function
有人看到我做错了什么/不同于.NET版本吗?
答案 0 :(得分:2)
你的功能是正确的。
结果不同的原因是因为VB6和VB.NET中颜色值的字节顺序不同。 VB6中的vbRed
是一个等于255
(&H0000FF
)的常量,而.NET的红色是&HFF0000
。
如果您将自己的功能称为RGBToARGB(&HFF0000, 255)
,则会提供您期望的结果。
这就是ColorTranslator.FromOle
的原因。 ColorTranslator.FromOle(vbRed)
会给你Color.Red
。
答案 1 :(得分:1)
可能有更优化的方法来做到这一点,但这应该有效:
Function RGB24ToARGB(ByVal RGB24 As Long, ByVal Alpha As Byte) As Long
RGB24ToARGB = CLng(Alpha And Not &H80) * &H1000000
If Alpha And &H80 Then RGB24ToARGB = RGB24ToARGB Or &H80000000
RGB24ToARGB = RGB24ToARGB _
Or (RGB24 And &HFF&) * &H10000 _
Or (RGB24 And &HFF00&) _
Or (RGB24 And &HFF0000) \ &H10000
End Function