18.08.2017, 12:47 | #1 |
Участник
|
RGB - HEX цвета как правильно переводить
Привет всем.
Столкнулся с проблемой подбор цветов. Похоже в аксапте неверно сделан перевод из RGB кодировки цвета в HEX WinApi класс методы X++: client static container getSysColor(int hColor) { int rgb; DLL _winApiDLL = new DLL(#UserDLL); DLLFunction _getSysColor = new DLLFunction(_winApiDLL, 'GetSysColor'); _getSysColor.returns(ExtTypes::DWord); _getSysColor.arg(ExtTypes::DWord); rgb = _getSysColor.call(hColor); return [rgb & 0xff, (rgb & 0xff00)>>#offset8 , (rgb & 0xff0000)>>#offset16]; } X++: static client server int rgb2int(RGBint r, RGBint g, RGBint b) { return r + g<<#offset8 + b<<#offset16; } X++: client server static container rgBint2Con(int rgb) { return [rgb & 0xff, (rgb & 0xff00)>>8 , (rgb & 0xff0000)>>16]; } Странно как-то. Возможно я что-то не понимаю, поправьте меня если я неправ. Как обнаружил. Использовал на форме HTML контрол. Взял цвет фона меню/кнопки из стандартной цветовой схемы winXP RGB (212, 208, 200) Перевел таким кодом X++: info(Global::int2Hex(Winapi::rgb2int(212, 208, 200), 6)); X++: info(Global::int2Hex(Winapi::rgb2int(0, 0, 255), 6)); а везде в аксапте при формировании цвета в HTML разметке FF0000 - это красный ! Скормил сайту https://colorscheme.ru/color-converter.html RGB (212, 208, 200) и RGB (0, 0, 255) получил D4D0C8 и #0000FF Где собака порылась ? P.S. Ax2009 приложение SP5 Последний раз редактировалось Logger; 18.08.2017 в 13:14. |
|
18.08.2017, 14:38 | #2 |
Дмитрий Ерин
|
В CSS/HTML принят "прямой" порядок записи: #RRGGBB. Думаю, чисто для удобства, чтобы несчастным дизайнерам не приходилось мозг выворачивать Как оно на самом деле хранится в памяти - другой вопрос, но записывать принято именно так.
А в WinAPI - принят обратный порядок (для хранения в памяти), где Красный - младший байт, Зеленый следующий, Синий - старший. То есть шестнадцатеричное представление 32-битного числа, кодирующего цвет, будет таким: 0х00BBGGRR (старшие нули иногда отвечают за прозрачность, а иногда просто игнорируются - зависит от конкретного ПО). Если непонятно написал, можно свериться с википедией (см. раздел COLORREF) : https://ru.wikipedia.org/wiki/RGB То есть в вашем случае источником непонимания стала функция int2hex(), которая показывает "честное" представление числа в памяти, а не удобную для дизайнеров запись. |
|
|
За это сообщение автора поблагодарили: Logger (3), mazzy (2). |
18.08.2017, 14:47 | #3 |
Участник
|
Теперь понятно почему тут \Classes\SysCompare\style
использован контейнер при переводе. Избежали таким образом ошибки. X++: str color2Hex(container _rgb) { int r, g, b; [r,g,b] = _rgb; return int2Hex(r,2)+int2Hex(g,2)+int2Hex(b,2); } ... //Query Windows for Display settings activeCaption = color2Hex(WinAPI::getSysColor(#COLOR_ACTIVECAPTION)); gradientActiveCaption = color2Hex(WinAPI::getSysColor(#COLOR_GRADIENTACTIVECAPTION)); |
|