purebasic.info

PureBasic forum
Текущее время: Вс окт 20, 2019 9:15 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Создать градиент с помощью GdiPlus
СообщениеДобавлено: Чт окт 03, 2019 3:24 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
Решено
Создал тему в OffTop потому что мне надо это для языка JScript. Пускай будет на PureBasic, я хоть смогу разобраться.
Я для AkelPad сделал скрипт, он уже есть в моей сборке AkelPad, там можно выбрать его в меню "Моё -> Регулировка цвета меток", а редактировать его можно в "AkelPad\AkelFiles\Plugs\Scripts\HighLight_HSB.js" и запускать по F5.
Там есть функция "DrawLBColor1" где я попытался нарисовать градиент в аналоге TextGadget. На данный момент в этом TextGadget рисует функция DrawLBColor заливая цветом, я меняю индексы функции, чтобы вместо заливки использовался градиент, но на данный момент с градиентом не работает. В будущем конечно я хочу вместо загрузки файла Spektr.bmp использовать рисование градиента функциями GdiPlus. Как вариант можно попробывать base64, но думаю функции GdiPlus будут компактнее в коде.
У меня функция возвращает 18, то есть GdiplusNotInitialized = 18, посмотреть возвращаемый код можно тут. Теоретически формат вызова у меня правильный, это можно видеть в аналогичных функциях WinAPI, в той же DrawLBColor. Параметры функции я брал в AutoIt3 с работающих примерах (код функций из Include\GDIPlus.au3) а также перепроверял параметры на оф.сайтах WinAPI.
Чтобы посмотреть ничего не скачивая вот функция

Разобрался, это уже готовая функция
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Draw_SPEKTR(aDlg) {
        hDC = oSys.Call("User32::GetDC",  aDlg[ID_SPEKTR].HWND); // получаем контекст устройства
        w = 260
        var Color
        for(var i = 1; i <= w; i++) {
                arr_hsb[0] = i*360/w
                hsb_to_rgb()
                Color = ((arr_rgb[2] << 8) + arr_rgb[1] << 8) + arr_rgb[0]; // rgb to int
                hPen = oSys.Call("gdi32::CreatePen", 0 /* PS_SOLID */ , 1, Color);
                oSys.Call("Gdi32::SelectObject", hDC, hPen);
                oSys.Call("gdi32::MoveToEx", hDC, i, 0, 0); // перемещаем позицию
                oSys.Call("gdi32::LineTo", hDC, i, 4);
                oSys.Call("Gdi32::DeleteObject", hPen);
        }
}



Градиент ведь не является спектром, пришлось рисовать как и раньше по одной линии


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB