AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.08.2017, 12:47   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
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));
получил C8D0D4 (визуально такой цвет неправильный, так как если его поставить в текст html документа то цвет фона отдает в голубизну по сравнению с обычным фоном на формах. А если поставить D4D0C8 как выдает сайт https://colorscheme.ru/color-converter.html то тогда получается то что надо)

X++:
info(Global::int2Hex(Winapi::rgb2int(0, 0, 255), 6));
дает FF0000

а везде в аксапте при формировании цвета в 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  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
В 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  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Теперь понятно почему тут \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));
Теги
rgb

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно создать в коде X++ новый planned order (ReqPO, ReqTrans) rkorchagin DAX: Программирование 5 02.06.2016 18:00
Открытая сумма по счету-фактуре - как правильно вычислить? IKA DAX: Программирование 7 21.03.2011 19:46
aEremenko: Как правильно подобрать оборудование и понять, сколько оно будет стоить? Blog bot DAX Blogs 0 17.04.2007 12:00
Цвета в диаграмме Ганта Betscriber DAX: Функционал 3 09.03.2006 15:07

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:48.