This tip is an update to “Translate Color Values”. That method converted numbers to strings, then performed string manipulation to get individual RGB values. This solution uses a concept near and dear to C programmers-unions-and is an order of magnitude faster.
With the RGB function, VB provides a neat and valuable tool for converting separate Red, Green, and Blue values into a single Long color value. However, VB doesn’t provide any way to convert this color value back to its constituent RGB values. Enter the much-feared LSet command, which copies the storage of one user-defined type (UDT) onto another.
Put this code in a module:
Public Type RGB_TYPE R As Byte G As Byte B As Byte Filler As ByteEnd TypePrivate Type RGB_FULL_TYPE lngRGB As LongEnd TypePublic Function ToRGB(ByVal vlngColor As Long) _ As RGB_TYPE Dim udtRGBFull As RGB_FULL_TYPE udtRGBFull.lngRGB = vlngColor ' Poor man's C Union LSet ToRGB = udtRGBFullEnd Function
To use this function, put a picture in a form's Picture property, and insert this code:
Private Sub Form_MouseUp(Button As Integer, _ Shift As Integer, X As Single, Y As Single) Dim udtRGB As RGB_TYPE udtRGB = ToRGB(Point(X, Y)) With udtRGB Me.Caption = "R=" & .R & " G=" & .G & _ " B=" & .B End WithEnd Sub
Click on different places on the picture. VB3 users must return the values differently, because before VB4 VB didn't support the return of a UDT.