Есть две задачи по конвертации разных форматов цвета:
1. OLE_COLOR в RGB
2. RGB в OLE_COLOR
Как я понимаю, OLE_COLOR используется исключительно в VB и все функции написаны в нем. Помогите переписать с одного языка на другой:
Private Function SwitchColor(OldCol As Long)
Dim Rval As Long, Gval As Long, Bval As Long
Rval = OldCol And 255
Gval = (OldCol And 65280) / 256
Bval = (OldCol And 16711680) / 65536
SwitchColor = (Rval * 65536) + (Gval * 256) + Bval
End Function
Здравствуйте, Аноним, Вы писали:
А>А это правильно, что ColorTranslator переводит и белый и прозрачный цвет как одно и тоже ? В RGB у них хотя бы альфа канал отличается ...
Даже судя по примеру из стартового собщения — правильно. В том примере альфа канал вообще никак не учитывается, и ColorTranslator его не учитывает, так что всё нормально
Биты, которые а ARGB используются под альфа-канал, в OLE_COLOR используются для идентификации специального цвета, например, цвета рабочего стола или цвета выделения, или цвета фона окна… так что под альфа-канал в OLE_COLOR попросту нет места.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _FRED_, Вы писали:
А>А это правильно, что ColorTranslator переводит и белый и прозрачный цвет как одно и тоже ? В RGB у них хотя бы альфа канал отличается ...
Видимо, так задумано.
Посмотрите реализацию рефлектором — увидите большой свитч и в конце делегирование к ToWin32, которая плевать хотела на альфа-канал.
Здравствуйте, _FRED_, Вы писали:
А>>А это правильно, что ColorTranslator переводит и белый и прозрачный цвет как одно и тоже ? В RGB у них хотя бы альфа канал отличается ...
_FR>Биты, которые а ARGB используются под альфа-канал, в OLE_COLOR используются для идентификации специального цвета, например, цвета рабочего стола или цвета выделения, или цвета фона окна… так что под альфа-канал в OLE_COLOR попросту нет места.
Более точно определение:
An OLE_COLOR is a Windows defined data type. It is 32 bits in size and closely resembles a Visual Basic Long Integer. The most significant byte may have one of three values. If it has a value of 0x00 then the remaining three bytes are used to define an RGB color where a byte is used per primary. If the most significant byte has a value of 0x80 then the remaining bytes define a system color such as vbButtonFace or vbWindowBackground. Finally, if the most significant byte has a value of 0x01 then the least significant byte defines an offset into an external palette.