Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы немного преувеличиваете в следующем:
...
Поймите, перерисовка - это переписываение значений в массиве, и если нужно переписать 1000000 значений (примерное количество пикселей в изображении окна и в битмапе), то это будут не " тысячные доли секунды", а секунды.
Не преувеличиваю и пойму, отчего же. Посмотрите мои примеры, в этой ветке, там в движении FPS около 30-40 кадров в секунду. Кадров, Карл!
И каждый кадр отличается от другого не 100 пикселами, а 70-80% рабочей области. Я не говорю что с размером разрешения экрана данный FPS не сокращается. Сокращается. На экране 1980x1050 при движении больших участков до 12-17.
И, да. Я повсеместно использую кеширование, и некоторые оптимизации в поиске областей с устаревшим кешем (поиск грязных областей). Но это общепринятая практика, не думайте, что глаза кому то откроете.
Не преувеличиваю и пойму, отчего же. Посмотрите мои примеры, в этой ветке, там в движении FPS около 30-40 кадров в секунду. Кадров, Карл!
И каждый кадр отличается от другого не 100 пикселами, а 70-80% рабочей области. Я не говорю что с размером разрешения экрана данный FPS не сокращается. Сокращается. На экране 1980x1050 при движении больших участков до 12-17.
И, да. Я повсеместно использую кеширование, и некоторые оптимизации в поиске областей с устаревшим кешем (поиск грязных областей). Но это общепринятая практика, не думайте, что глаза кому то откроете.
Вы цифровую маску в памяти сохраняете после отсылки массива с изображением в ResoourceCreate()?
Если да, то ясно почему у Вас не тормозит. У меня это еще не реализовано. То есть, в моей реализации маска изображения не сохраняется. Поэтому для изменения любой части окна, приходится все окно воссоздавать в массиве. Это вызывает торможение.
Следующий шаг - построение системы сохранения цифровых масок и эффективная работа с конкретными областями. После этого, реакция элементов на события интерфейса тормозить не будет.
1. тем больше времени это займет (примерно от 250 милл.секунд до 2 секунды).
ого, ну и цифры.
на полный экран вообще тормозов не должно быть.
Что вы там рисуете?
---
если у вас используется CCanvas - проверьте деструктор - вы наверняка не делаете ResourceFree.
Это основная причина тормозов при работе с ресурсами. Постоянное создание без освобождения.
Вы цифровую маску в памяти сохраняете после отсылки массива с изображением в ResoourceCreate()?
Термин "цифровая маска" сами придумали? Мне яндекс выдает шлемы виртуальной реальности ). Да, кеширование в массивах. Лично я специально упирался в оптимизацию варианта с альфа каналом, т.к. хотел выжать максимум. Много съедается на "ручном" смешивании пикселов, чтобы были прозрачные элементы. Без расчета альфа канала интерфейс летает еще в несколько раз быстрее.
Термин "цифровая маска" сами придумали? Мне яндекс выдает шлемы виртуальной реальности ). Да, кеширование в массивах. Лично я специально упирался в оптимизацию варианта с альфа каналом, т.к. хотел выжать максимум. Много съедается на "ручном" смешивании пикселов, чтобы были прозрачные элементы. Без расчета альфа канала интерфейс летает еще в несколько раз быстрее.
Да, термин я придумал сам, но могу его поменять на более удобный, если предложите. )
Имеется ввиду, изображение обращенное в цифры представляющие цвета (уже после расчета альфа-канала), которые хранятся массиве. Этот массив посылается в ResourceCreate(), и создается изображение.
Я не пробывал оптимизировать работу с альфа-каналом, но это интересная мысль... У меня все объекты рисуются после расчета альфа-канала так как есть идея, сделать возможность менять прозрачность окон интерфейса. В будущем, думаю это можно будет реализовать. Мешают только поля ввода, которые создаются "обычными" объектами, и следовательно не меняют прозрачность... Но и это решаемо.
Решение проблемы торможения на событиях интерфейса вижу в первую очередь в сохранении изображений в массивах и ориентировании в его областях.
ого, ну и цифры.
на полный экран вообще тормозов не должно быть.
Что вы там рисуете?
---
если у вас используется CCanvas - проверьте деструктор - вы наверняка не делаете ResourceFree.
Это основная причина тормозов при работе с ресурсами. Постоянное создание без освобождения.
Обязательно попробую ResourceFree(), но мне кажется что проблема не в этом. (Я рисую окна настроек с элементами управления. Канвас к сожалению не использую, - другой подход.)
Дело в том, что если я создаю маленькое окно настроек, с несколькими чекбоксами, то визуально, они реагируют мгновенно, однако, если создаю окно большего размера (~700х500 пикселей или больше), то общая скорость реакции на события интерфейса падает в разы.
Анализируя проблему, я пришел к выводу, что дело в повторной инициализации массива и повторном расчете цветов всех пикселей на каждом событии интерфейса. Ведь функция расчитывает в районе 700*500 значений и инициализирует массив. Сама по себе инициализация массива тоже занимает время. Но, если сохранять изображение и менять только те значения цветов пикселей, которые относятся к конкретному элементу, то время реакции станет зависить уже от площади этого элемента...
Мне кажется, проблема в этом.
Анализируя проблему, я пришел к выводу, что дело в повторной инициализации массива и повторном расчете цветов всех пикселей на каждом событии интерфейса. Ведь функция расчитывает в районе 700*500 значений и инициализирует массив.
покажите код.
Функция "Нарисовать_элемент()" осуществляет создание всех деталей изображения окна. Сначала она создает массив изображения (который является как бы общим полотном рисования), и на нем рисует все компоненты (цифровым образом).
Для прорисовки каждого типа компонента, вызывается специальная функция, предназначенная для рисования именно этого типа: "Нарисовать_деталь_элемента()", "Установить_текст_на_элемент()","Создать_градиент", "Установить_лейбл_на_элемент()":
Посылаю код в нескольких частях, потому что редактор не принимает целиком.
void Нарисовать_элемент(int Окно, int Канвас, int смещение_по_x = 0, int смещение_по_y = 0)
{//Alert(__FUNCTION__);
int Номер_рисуемого_полотна = G_CORE[Окно][Канвас][_DROWING_CANVAS],
Имя_полотна = G_CORE[Окно][Канвас][_NAME],
//-----------------------------------------------------------------
//Тип канваса может быть _STRIP или _LABEL.
//-----------------------------------------------------------------
Тип_канваса = G_CORE[Окно][Канвас][_BITMAP_TYPE],
//-----------------------------------------------------------------
//Канвас может представлять из себя готовую картинку.
//В этом случае, индекс этой картинки будет прописан в свойствах канваса.
//(например картинка ползунка слайдера - самостоятельный канвас).
//-----------------------------------------------------------------
Индекс_лейбла_канваса = G_CORE[Окно][Канвас][_OBJECTS_BITMAP_INDEX],
//-----------------------------------------------------------------
//Текущее состояние канваса. Берем из свойства _CURRENT_STATE.
//-----------------------------------------------------------------
Текущее_состояние_канваса = G_CORE[Окно][Канвас][_CURRENT_SCENE],
//-----------------------------------------------------------------
//-----------
Состояние_детали,
Индекс_лейбла,
//------------------------------
Высота_полотна = G_CORE[Окно][Канвас][_Y_SIZE],
Ширина_полотна = G_CORE[Окно][Канвас][_X_SIZE],
//------------------------------
Массив_пикселей_полотна[],
//------------------------------
Размер_массива_пикселей_полотна = Высота_полотна * Ширина_полотна;
//----------------------------------------------------------
//Alert("Имя_элемента ",Имя_элемента," Окно ",Окно," Объект ",Объект);
//------------------------------------------------------------
int w;
//-------------------------------------------------------------
//Устанавливаем размеры массива основания элемента управления.
//Все детали этого элемента будут рисоваться на этом основании.
//Для прорисовки деталей элемента управления, будут вызываться
//функции (установать лейбл, установить текст и т.д...), и в каждую
//из них будет посылаться один и тот же массив пикселей элемента,
//размер которого мы сейчас устанавливаем. Детали будут рисоваться
//в том же массиве, уже поверх прежде нарисованных. На конечном этапе,
//будет вызываться функция "создать ресурс", и картинка элемента
//управления будет создана.
//-------------------------------------------------------------
ArrayResize(Массив_пикселей_полотна,Размер_массива_пикселей_полотна);
//-------------------------------------------------------------
//Создание основания самого элемента.
//----------------------------------------------------------------------
Установить_цвет_и_прозрачность_пикселей_изображения(Окно,Канвас,Текущее_состояние_канваса);
//---------------------------------------
switch(Тип_канваса)
{
case _STRIP: Нарисовать_деталь_элемента(Окно,Канвас,Канвас,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна); break;
//-------------------------------------------------------------------------------------------------------------
case _LABEL: if(Индекс_лейбла_канваса)
{
Установить_свойства_лейбла(Окно,Канвас,Индекс_лейбла_канваса,Текущее_состояние_канваса);
Установить_лейбл_на_Элемент(Окно,Канвас,Канвас,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Индекс_лейбла_канваса);
}
break;
//-------------------------------------------------------------------------------------------------------------
}
//-------------------------------------------------------------
//Alert("Размер_массива_пикселей_элемента ",Размер_массива_пикселей_элемента);
//-------------------------------------
//Установить_цвет_и_прозрачность_пикселей_изображения(Состояние_детали);
//--------------------------------------------------------------------------
//Делаем цикл по всем деталям элемента, и даже тем, которые находятся в списке
//объектов выше самого элемента. Поэтому цикл начинаем с начала списка объектов
//окна и идем в цикле до конца списка. Создаем все детали элемента, без относительно
//того, находятся ли они в последовательности или нет. При этом, обходим вторичное создание
//основания элемента с помощью условия.
//--------------------------------------------------------------------------
for(int Деталь_полотна = 1; Деталь_полотна < 500; Деталь_полотна++)
{
if(!G_CORE[Окно][Деталь_полотна][_NAME]){break;}
//---------------------------------------
int Номер_полотна_которому_принадлежит_деталь = G_CORE[Окно][Деталь_полотна][_DROWING_CANVAS];
int Тип_объекта_детали = G_CORE[Окно][Деталь_полотна][_OBJ_TYPE];
// Alert("Деталь_полотна ",Деталь_полотна," Номер_элемента_которому_принадлежит_деталь ",Номер_элемента_которому_принадлежит_деталь);
//---------------------------------------
if(Номер_полотна_которому_принадлежит_деталь == Канвас && Деталь_полотна != Канвас && Тип_объекта_детали == Obj_Pixel)
{ //Alert("Окно ",Окно," Канвас ",Канвас," Деталь_полотна ",Деталь_полотна," _GROUP_MAIN_OBJECT ",G_CORE[Окно][Деталь_полотна][_GROUP_MAIN_OBJECT]," Номер_рисуемого_элемента ",Номер_рисуемого_элемента);
//---------------------------------------
int Тип_детали = G_CORE[Окно][Деталь_полотна][_BITMAP_TYPE];
int Деталь_спрятана = G_CORE[Окно][Деталь_полотна][_OBJECT_HIDE];
int Реализация_сценария = G_CORE[Окно][Деталь_полотна][_OBJECT_ACTIVATED];
int Гланый_элемент_детали = G_CORE[Окно][Деталь_полотна][_GROUP_MAIN_OBJECT];
int Состояние_элемента = G_CORE[Окно][Гланый_элемент_детали][_CURRENT_STATE];
//---------------------------------------
int Высота_элемента = G_CORE[Окно][Гланый_элемент_детали][_Y_SIZE];
int Ширина_элемента = G_CORE[Окно][Гланый_элемент_детали][_X_SIZE];
//---------------------------------------
if(!Реализация_сценария)
{
//----------------------------------------------------------------------
//Определение текущего состояния объекта.
//----------------------------------------------------------------------
if(!Состояние_элемента || (Состояние_элемента == _NEUTRAL_STATE || Состояние_элемента == _NEUTRAL_HIGHLIGHTED || Состояние_элемента == _NEUTRAL_BLOCKED))
{
if(!Состояние_элемента || Состояние_элемента == _NEUTRAL_STATE) Состояние_детали = G_CORE[Окно][Деталь_полотна][_NEUTRAL_STATE];
if(Состояние_элемента)Состояние_детали = G_CORE[Окно][Деталь_полотна][Состояние_элемента];
//-------------------------------
Индекс_лейбла = G_CORE[Окно][Деталь_полотна][_OBJECTS_BITMAP_INDEX];
w = 1;
}
//----------------------------------------------------------------------
if(!w && (Состояние_элемента == _ACTIVATED_STATE || Состояние_элемента == _ACTIVATED_HIGHLIGHTED || Состояние_элемента == _ACTIVATED_BLOCKED))
{
Состояние_детали = G_CORE[Окно][Деталь_полотна][Состояние_элемента];
Индекс_лейбла = G_CORE[Окно][Деталь_полотна][_ACTIVATED_LABEL];
}
//----------------------------------------------------------------------
G_CORE[Окно][Деталь_полотна][_CURRENT_SCENE] = Состояние_детали;
w = 0;
}
//---------------------------------------
if(Реализация_сценария)Состояние_детали = G_CORE[Окно][Деталь_полотна][_CURRENT_SCENE];
//---------------------------------------
Установить_цвет_и_прозрачность_пикселей_изображения(Окно,Деталь_полотна,Состояние_детали);
//---------------------------------------
if(!Деталь_спрятана)
{
switch(Тип_детали)
{
case _STRIP: Нарисовать_деталь_элемента(Окно,Канвас,Деталь_полотна,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна); break;
//-------------------------------------------------------------------------------------------------------------
case _LABEL: if(Индекс_лейбла)
{
Установить_свойства_лейбла(Окно,Деталь_полотна,Индекс_лейбла,Состояние_детали);
Установить_лейбл_на_Элемент(Окно,Канвас,Деталь_полотна,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Индекс_лейбла);
}
break;
//-------------------------------------------------------------------------------------------------------------
case _TEXT_: Установить_текст_на_Элемент(Окно,Канвас,Деталь_полотна, Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Состояние_детали); break;
//-------------------------------------------------------------------------------------------------------------
case _BASE : if(G_CORE[Окно][Деталь_полотна][_GRADIENT])Нарисовать_деталь_элемента(Окно,Канвас,Деталь_полотна,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,1); break;
}
}
}
}
//--------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------
//Cоздаем ресурс.
//-------------------------------------------------------------------------------------------------------------
Создать_ресурс(Имя_полотна,Массив_пикселей_полотна,Ширина_полотна,Высота_полотна);
//-------------------------------------------------------------------------------------------------------------
//Устанавливаем координаты элемента.
//-------------------------------------------------------------------------------------------------------------
if(смещение_по_x != 0)ObjectSetInteger(0,Имя_полотна,OBJPROP_XDISTANCE,G_CORE[Окно][Канвас][_X] + смещение_по_x);
if(смещение_по_y != 0)ObjectSetInteger(0,Имя_полотна,OBJPROP_YDISTANCE,G_CORE[Окно][Канвас][_Y] + смещение_по_y);
if(смещение_по_x == 0)ObjectSetInteger(0,Имя_полотна,OBJPROP_XDISTANCE,G_CORE[Окно][Канвас][_X]);
if(смещение_по_y == 0)ObjectSetInteger(0,Имя_полотна,OBJPROP_YDISTANCE,G_CORE[Окно][Канвас][_Y]);
//-------------------------------------------------------------------------------------------------------------
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Нарисовать_деталь_элемента(
int Окно,
int Канвас,
int Деталь_полотна,
int &Массив_пикселей_полотна[],
int Высота_полотна,
int Ширина_полотна,
int Нарисовать_только_градиент = 0
)
{
//--------------------------------------------------------------------------
int Высота_детали = G_CORE[Окно][Деталь_полотна][_Y_SIZE];
int Длинна_детали = G_CORE[Окно][Деталь_полотна][_X_SIZE];
int Отступ_X = G_CORE[Окно][Деталь_полотна][_X] - G_CORE[Окно][Канвас][_X];
int Отступ_Y = G_CORE[Окно][Деталь_полотна][_Y] - G_CORE[Окно][Канвас][_Y];
int Индекс_пикселя = G_CORE[Окно][Деталь_полотна][_PIXEL_INDEX];
//--------------------------------------------------------------------------
int Градиент_рамки_детали = G_CORE[Окно][Деталь_полотна][_GRADIENT];
//--------------------------------------------------------------------------
//Alert("Нарисовать_деталь_элемента - Основание: Канвас ",Канвас," Деталь_полотна ",Деталь_полотна," [Деталь_полотна][_X] ",G_CORE[Окно][Деталь_полотна][_X]);
int Номер_пикселя_элемента;
//--------------------------------------------------------------------------
//Цикл по площади основания всего элемента.
//--------------------------------------------------------------------------
if(!Нарисовать_только_градиент)
{
for(int Ряд = 0; Ряд < Высота_полотна; Ряд++)
{
for(int Пиксель = 0; Пиксель < Ширина_полотна; Пиксель++)
{
if(
Ряд >= Отступ_Y
&& Ряд < (Отступ_Y + Высота_детали)
&& Пиксель >= Отступ_X
&& Пиксель <(Отступ_X + Длинна_детали)
)
{
Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Данные_пикселя[Индекс_пикселя][Цвет],Данные_пикселя[Индекс_пикселя][Непрозрачность]);
}
Номер_пикселя_элемента++;
}
}
}
//-----------------------------
Номер_пикселя_элемента = 0;
//-----------------------------
if(Градиент_рамки_детали)
{
int V_раскладка = 0;
int H_раскладка = 1;
int Тип_градиента_рамки = STANDART_GROUPS[Градиент_рамки_детали + 1];
int Ширина_градиента_рамки = STANDART_GROUPS[Градиент_рамки_детали + 2];
int Начало_первой_рамки = 0;
//----------------------
int Начало_второй_рамки = Ширина_градиента_рамки * 2;
int Начало_третьей_рамки = Ширина_градиента_рамки * 4;
int Начало_четвертой_рамки = Ширина_градиента_рамки * 6;
int Нижний_блик = Начало_четвертой_рамки + Ширина_градиента_рамки * 2;
int Верхний_блик = Нижний_блик + 2;
//----------------------
switch(Тип_градиента_рамки)
{
case _4_SIDES_GRADIENT:
//-----------------------
//Прототип функции
//Создать_градиент(Раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента,Длинна_градиента,Отступ_X,Отступ_Y,Начало_градиента, Отступ_линии_от_края);
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали,Отступ_X,Отступ_Y , Начало_первой_рамки, 1);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X,Отступ_Y,Начало_второй_рамки, 1);
//Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,4,Длинна_детали - 6,Отступ_X + 4,Отступ_Y + 15, Начало_второй_рамки, -1);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X + Длинна_детали - Ширина_градиента_рамки,Отступ_Y,Начало_третьей_рамки,-1);
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали - Ширина_градиента_рамки,Отступ_X + Ширина_градиента_рамки,(Отступ_Y + Высота_детали - Ширина_градиента_рамки),Начало_четвертой_рамки,-1);
//-----------------------
break;
//------------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------------------------------------
case _4_SIDES_GRADIENT_WITH_DOWN_RIGHT_BLICK:
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали,Отступ_X,Отступ_Y , Начало_первой_рамки, 1);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X,Отступ_Y,Начало_второй_рамки, 1);
//Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,4,Длинна_детали - 6,Отступ_X + 4,Отступ_Y + 15, Начало_второй_рамки, -1);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X + Длинна_детали - Ширина_градиента_рамки,Отступ_Y,Начало_третьей_рамки,-1);
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали - Ширина_градиента_рамки,Отступ_X + Ширина_градиента_рамки,(Отступ_Y + Высота_детали - Ширина_градиента_рамки),Начало_четвертой_рамки,-1);
//-----------------------
//-----------------------
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,1,Длинна_детали,Отступ_X,(Отступ_Y + Высота_детали),Нижний_блик,0);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,1,(Отступ_X + Длинна_детали + 1),Отступ_Y,Нижний_блик,0);
break;
//------------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------------------------------------------
case _4_SIDES_GRADIENT_WITH_TOP_LEFT_BLICK:
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали,Отступ_X,Отступ_Y , Начало_первой_рамки, 1);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X,Отступ_Y,Начало_второй_рамки, 1);
//Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,4,Длинна_детали - 6,Отступ_X + 4,Отступ_Y + 15, Начало_второй_рамки, -1);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X + Длинна_детали - Ширина_градиента_рамки,Отступ_Y,Начало_третьей_рамки,-1);
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали - Ширина_градиента_рамки,Отступ_X + Ширина_градиента_рамки,(Отступ_Y + Высота_детали - Ширина_градиента_рамки),Начало_четвертой_рамки,-1);
//-----------------------
//-----------------------
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,1,Длинна_детали + 2,Отступ_X,(Отступ_Y + Высота_детали),Нижний_блик,0);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали + 1,1,(Отступ_X + Длинна_детали + 1),Отступ_Y - 1,Нижний_блик,0);
//-----------------------
//-----------------------
//-----------------------
Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали + 4,Отступ_X - 2,Отступ_Y - 2 , Верхний_блик, 0);
//-----------------------
Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали + 3,Ширина_градиента_рамки,Отступ_X - 2,Отступ_Y - 2,Верхний_блик, 0);
break;
//------------------------------------------------------------------------------------------------------------------------------------------------------------------
}
}
//-----------------------------
}
//--------------------------------------------------
void Создать_градиент(
int Раскладка,
int Градиент_рамки_детали,
int &Массив_пикселей_полотна[],
int Высота_полотна,
int Ширина_полотна,
int Высота_градиента,
int Длинна_градиента,
int Отступ_X,
int Отступ_Y,
int Начало_градиента = 0,
int Отступ_линии_от_края = 0
)
{
int Номер_пикселя_элемента;
int Первый_пиксель = Градиент_рамки_детали + 3 + Начало_градиента;
int V_раскладка = 0;
int H_раскладка = 1;
//--------------------------------------------------
int Ширина_градиента_рамки = STANDART_GROUPS[Градиент_рамки_детали + 2];
//--------------------------------------------------
int Пиксели[],
Альфы[], q,
Горизонтальная_полоса,
Отступ_линии,
Внутри_территории_рамки,
Внутри_ширины_детали,
колонка;
//--------------------------------------------------
//Устанавливаем размеры массивов.
//--------------------------------------------------
ArrayResize(Пиксели,Ширина_градиента_рамки);
ArrayResize(Альфы, Ширина_градиента_рамки);
if(Раскладка == V_раскладка && !Отступ_линии_от_края)Отступ_линии = Ширина_градиента_рамки;
//------------------------------------------------------------------------------
//Инициализируем массивы цветами пикселей и значениями их непрозрачности.
//------------------------------------------------------------------------------
for(int a1 = 0; a1 <= Ширина_градиента_рамки * 2; a1 += 2)
{
Пиксели[q] = STANDART_GROUPS[Первый_пиксель + a1];
Альфы [q] = STANDART_GROUPS[Первый_пиксель + a1 + 1];
q++;
}
//--------------------------------------------------------------------------
//Цикл по площади всего окна.
//--------------------------------------------------------------------------
for(int _Ряд = 0; _Ряд < Высота_полотна; _Ряд++)
{
for(int _Пиксель_ряда = 0; _Пиксель_ряда < Ширина_полотна; _Пиксель_ряда++)
{
//----------------------------------------------------------
//Фиксируем моменты цикла по площади рамок элемента.
//----------------------------------------------------------
//1. Находимся на территории верхней рамки.
//(Между верхом и низом и между левой и правой сторонами верхней рамки.)
//----------------------------------------------------------
if(
_Ряд >= Отступ_Y && _Ряд < (Отступ_Y + Высота_градиента)
&&(
(Раскладка == H_раскладка && _Пиксель_ряда >= Отступ_X + Отступ_линии && _Пиксель_ряда < (Отступ_X + Длинна_градиента) - Отступ_линии)
||(Раскладка == V_раскладка && Отступ_линии_от_края >= 0 && _Пиксель_ряда >= Отступ_X && _Пиксель_ряда <= Отступ_X + Длинна_градиента - 1 && _Пиксель_ряда <= (Отступ_X + Отступ_линии))
||(Раскладка == V_раскладка && Отступ_линии_от_края < 0 && _Пиксель_ряда >= Отступ_X + Отступ_линии_от_края *-1 && _Пиксель_ряда <= Отступ_X + Ширина_градиента_рамки && _Пиксель_ряда >= Отступ_X + Ширина_градиента_рамки + Отступ_линии)
)
)
{
//-----------------------------------
Внутри_территории_рамки = 1;
//-----------------------------------
if(Раскладка == H_раскладка)Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Пиксели[Горизонтальная_полоса],Альфы[Горизонтальная_полоса]);
if(Раскладка == V_раскладка)Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Пиксели[колонка],Альфы[колонка]);
//-----------------------------------
// if( _Ряд == Отступ_Y + 20 && Раскладка == V_раскладка && Отступ_линии_от_края >= 0 && _Пиксель_ряда >= Отступ_X && _Пиксель_ряда <= (Отступ_X + Отступ_линии))Alert(12345);
колонка++;
}
//-------------------------
Номер_пикселя_элемента++;
//-------------------------
}
//------------------------------------------------
if(Внутри_территории_рамки)
{
Горизонтальная_полоса++;
колонка = 0;
//---------------------------------------------------------------------------------
//Счетчик "Отступ_линии" может иметь максимальное значение равное ширине градиента,
//так как прибавляется только при спуске по линиям этого градиента на событии переключения ряда.
//---------------------------------------------------------------------------------
if(Раскладка == H_раскладка)Отступ_линии += Отступ_линии_от_края;
//---------------------------------------------------------------------------------
//
//---------------------------------------------------------------------------------
if(Раскладка == V_раскладка && _Ряд < Отступ_Y + Ширина_градиента_рамки)Отступ_линии += Отступ_линии_от_края;
//---------------------------------------------------------------------------------
if(Раскладка == V_раскладка && _Ряд >= Отступ_Y + Высота_градиента - Ширина_градиента_рамки - 1)Отступ_линии -= Отступ_линии_от_края;
//---------------------------------------------------------------------------------
if(Раскладка == V_раскладка && Отступ_линии_от_края < 0 && Отступ_линии > 0)Отступ_линии *=-1;
}
//------------------------------------------------
//------------------------------------------------
}
//---------------------
// Alert("Градиент_рамки_детали ",Градиент_рамки_детали," Ширина_градиента_рамки ",Ширина_градиента_рамки );
//---------------------
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Установить_текст_на_Элемент(
int Окно,
int Канвас,
int Деталь_полотна,
int &Массив_пикселей[],
int Высота_массива,
int Длинна_массива,
int Состояние_детали
)
{
//--------------------
//int Головной_объект_группы = G_CORE[Окно][Деталь_полотна][_GROUP_MAIN_OBJECT];
string Текст = CONTENT[G_CORE[Окно][Деталь_полотна][_TEXT]];
//--------------------
string Шрифт = FONT[STANDART_GROUPS[Состояние_детали + 5]];
int Цвет_текста = ColorToARGB(STANDART_GROUPS[Состояние_детали + 3],STANDART_GROUPS[Состояние_детали + 4]);
int Размер_шрифта = STANDART_GROUPS[Состояние_детали + 6];
int Угол_наклона = STANDART_GROUPS[Состояние_детали + 7];
int Привязка_текста = STANDART_GROUPS[Состояние_детали + 8];
int Стиль_шрифта = STANDART_GROUPS[Состояние_детали + 9];
//--------------------
int Формат_цвета = COLOR_FORMAT_ARGB_NORMALIZE;
//--------------------
int Отступ_X = G_CORE[Окно][Деталь_полотна][_X] - G_CORE[Окно][Канвас][_X];
int Отступ_Y = G_CORE[Окно][Деталь_полотна][_Y] - G_CORE[Окно][Канвас][_Y];
//--------------------------------------------------
//Alert("Нарисовать_деталь_элемента - Текст: Канвас ",Канвас," Деталь_полотна ",Деталь_полотна," [Деталь_полотна][_X] ",G_CORE[Окно][Деталь_полотна][_X]," Канвас][_X] ",G_CORE[Окно][Канвас][_X]);
TextSetFont(Шрифт,Размер_шрифта *-10,Стиль_шрифта,Угол_наклона);
//--------------------------------------------------
if(!TextOut(Текст,Отступ_X,Отступ_Y,Привязка_текста,Массив_пикселей,Длинна_массива,Высота_массива,Цвет_текста,Формат_цвета))Alert(GetLastError());
//--------------------------------------------------
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Установить_размеры_текста(int Окно, int Объект, int Главный_объект_в_элементе, int Состояние_детали)
{
int Массив_пикселей[];
int Самая_левая_точка = 1000000,
Самая_правая_точка,
Самая_верхняя_точка = 1000000,
Самая_нижняя_точка,
Номер_пикселя;
//--------------------
string Текст = CONTENT[G_CORE[Окно][Объект][_TEXT]];
//--------------------
string Шрифт = FONT[STANDART_GROUPS[Состояние_детали + 5]];
int Цвет_текста = ColorToARGB(STANDART_GROUPS[Состояние_детали + 3],STANDART_GROUPS[Состояние_детали + 4]);
int Размер_шрифта = (int)(STANDART_GROUPS[Состояние_детали + 6]);
int Угол_наклона = STANDART_GROUPS[Состояние_детали + 7];
int Привязка_текста = STANDART_GROUPS[Состояние_детали + 8];
int Стиль_шрифта = STANDART_GROUPS[Состояние_детали + 9];
int Количество_букв_текста = StringLen(Текст);
//--------------------
int Формат_цвета = COLOR_FORMAT_ARGB_NORMALIZE;
//--------------------
int Длинна_буквы = Размер_шрифта;
int Высота_буквы = Размер_шрифта;//Alert("Высота_буквы ",Высота_буквы," Самая_нижняя_точка - Самая_верхняя_точка ",Самая_нижняя_точка - Самая_верхняя_точка);
//--------------------
int Высота_массива = Высота_буквы * 2;
int Длинна_массива = Длинна_буквы * Количество_букв_текста * 2;
//--------------------
int Размер_массива = Высота_массива * Длинна_массива;
//--------------------
ArrayResize(Массив_пикселей,Размер_массива);//Alert("Размер_массива ",Размер_массива);
//--------------------------------------------------
// Alert("Шрифт ",Шрифт ," Высота_буквы ",Высота_буквы," Размер_шрифта ",Размер_шрифта," Угол_наклона ",Угол_наклона);
TextSetFont(Шрифт,Размер_шрифта *-10,Стиль_шрифта,Угол_наклона);
//--------------------------------------------------
if(!TextOut(Текст,0,0,Привязка_текста,Массив_пикселей,Длинна_массива,Высота_массива,Цвет_текста,Формат_цвета))Alert(GetLastError());
//--------------------------------------------------
for(int Ряд = 0; Ряд < Высота_массива; Ряд++)
{
for(int Колонка = 0; Колонка < Длинна_массива; Колонка++)
{
if(Массив_пикселей[Номер_пикселя] == Цвет_текста)
{
//----------------------------
if(Самая_левая_точка >= Колонка) Самая_левая_точка = Колонка;
//----------------------------
if(Самая_правая_точка <= Колонка)Самая_правая_точка = Колонка;
//----------------------------
}
//-------------------
Номер_пикселя++;
}
}
//Alert("Самая_верхняя_точка ",Самая_верхняя_точка," Самая_нижняя_точка ",Самая_нижняя_точка," Самая_левая_точка ",Самая_левая_точка," Самая_правая_точка ",Самая_правая_точка);
//-----------------------------------------
int Длинна_текста = Самая_правая_точка - Самая_левая_точка;
//-----------------------------------------
//-----------------------------------------
G_CORE[Окно][Объект][_TEXT_X_SIZE] = Длинна_текста;
//-----------------------------------------
G_CORE[Окно][Главный_объект_в_элементе][_TEXT_X_SIZE] = Длинна_текста;
//-----------------------------------------
G_CORE[Окно][Объект][_X_SIZE] = Длинна_текста;
//--------------------------------------------------
Alert("Объект ",Объект," Длинна_текста ",Длинна_текста);
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Установить_лейбл_на_Элемент(
int Окно,
int Канвас,
int Деталь_полотна,
int &Массив_пикселей_полотна[],
int Высота_элемента,
int Ширина_элемента,
int Индекс_лейбла,
// int Цвет_фона,
// int Непрозрачность_фона
)
{
//-----------------------
// Alert(__FUNCTION__);
int Цвет_пикселя,
Непрозрачность_пикселя,
Объект_привязки_лейбла = G_CORE[Окно][Деталь_полотна][_LABEL_BACKGROUND_OBJECT],
Состояние_объекта_привязки = G_CORE[Окно][Объект_привязки_лейбла][_CURRENT_SCENE],
Номер_пикселя_объекта_привязки = G_CORE[Окно][Объект_привязки_лейбла][_PIXEL_INDEX],
Поправка = Номер_пикселя_объекта_привязки * 2,
//--------------------------------------------
Цвет_фона = STANDART_GROUPS[Состояние_объекта_привязки + 3 + Поправка],
Непрозрачность_фона = STANDART_GROUPS[Состояние_объекта_привязки + 4 + Поправка];
//--------------------------------------------
// Alert("Цвет_фона ",Цвет_фона," Непрозрачность_фона ",Непрозрачность_фона," [_B2_PARAMETER] ",G_CORE[Окно][Деталь_полотна][_B2_PARAMETER]," Номер_пикселя_объекта_привязки ",Номер_пикселя_объекта_привязки);
//-------------------------
// int Головной_объект_группы = G_CORE[Окно][Деталь_полотна][_GROUP_MAIN_OBJECT];
//--------------------
int Отступ_X = G_CORE[Окно][Деталь_полотна][_X] - G_CORE[Окно][Канвас][_X];
int Отступ_Y = G_CORE[Окно][Деталь_полотна][_Y] - G_CORE[Окно][Канвас][_Y];
//--------------------------------------------------
//-------------------------------------------------------------
int Номер_пикселя_элемента;
int Пиксель_лейбла = Номер_пикселя_лейбла;
//--------------------------------------------------------
for(int Ряд = 0; Ряд < Высота_элемента; Ряд++)
{
for(int Пиксель = 0; Пиксель < Ширина_элемента; Пиксель++)
{
//------------------------------
if(Ряд >= Отступ_Y && Ряд < (Отступ_Y + Высота_лейбла))
{
if(Пиксель > (Отступ_X - 1) && Пиксель < (Отступ_X) + Ширина_лейбла)
{
if(Тип_лейбла == _RESOURCE_LABEL)
{
//---------------------------
if(A_CORE_BASE[Пиксель_лейбла] == -1)
{
Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Цвет_фона,Непрозрачность_фона);
// Alert("Цвет_фона ",Цвет_фона," Непрозрачность_фона ",Непрозрачность_фона);
}
//---------------------------
else Массив_пикселей_полотна[Номер_пикселя_элемента] = A_CORE_BASE[Пиксель_лейбла];
//---------------------------
}
if(Тип_лейбла == _MY_LABEL)
{
if(A_CORE_BASE[Пиксель_лейбла] == 0){Цвет_пикселя = Данные_пикселя[Пиксель_0][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_0][Непрозрачность];}
if(A_CORE_BASE[Пиксель_лейбла] == 1){Цвет_пикселя = Данные_пикселя[Пиксель_1][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_1][Непрозрачность];}
if(A_CORE_BASE[Пиксель_лейбла] == 2){Цвет_пикселя = Данные_пикселя[Пиксель_2][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_2][Непрозрачность];}
if(A_CORE_BASE[Пиксель_лейбла] == 3){Цвет_пикселя = Данные_пикселя[Пиксель_3][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_3][Непрозрачность];}
if(A_CORE_BASE[Пиксель_лейбла] == 4){Цвет_пикселя = Данные_пикселя[Пиксель_4][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_4][Непрозрачность];}
if(A_CORE_BASE[Пиксель_лейбла] == 5){Цвет_пикселя = Данные_пикселя[Пиксель_5][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_5][Непрозрачность];}
if(A_CORE_BASE[Пиксель_лейбла] == 6){Цвет_пикселя = Данные_пикселя[Пиксель_6][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_6][Непрозрачность];}
if(A_CORE_BASE[Пиксель_лейбла] == 7){Цвет_пикселя = Данные_пикселя[Пиксель_7][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_7][Непрозрачность];}
//-----------------------------------------------
if(A_CORE_BASE[Пиксель_лейбла] == -1)
{
Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Цвет_фона,Непрозрачность_фона);
}
//-----------------------------------------------
else Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Цвет_пикселя,Непрозрачность_пикселя);
}/**/
//---------------------------
Пиксель_лейбла++;
//---------------------------
}
}
//------------------------------
Номер_пикселя_элемента++;
}
}
}
//--------------------------------------------------
//--------------------------------------------------
void Установить_свойства_лейбла(int Окно, int Объект, int Индекс_лейбла, int Состояние_детали)
{
//-------------------------------------------------------------
//Цикл по A_CORE_BASE[] и нахождение нужного лейбла по индексу.
//-------------------------------------------------------------
for(int a1 = 0; a1 < 250000; a1++)
{
if(A_CORE_BASE[a1] == _DATA_SEPARATOR && A_CORE_BASE[a1 + 1] == Индекс_лейбла)
{
//---------------------------------------------------
//Инициализируем основные параметры лейбла.
//---------------------------------------------------
Ширина_лейбла = A_CORE_BASE[a1 + 2];
G_CORE[Окно][Объект][_X_SIZE] = Ширина_лейбла;
//--------------
Высота_лейбла = A_CORE_BASE[a1 + 3];
G_CORE[Окно][Объект][_Y_SIZE] = Высота_лейбла;
//--------------
Тип_лейбла = A_CORE_BASE[a1 + 4];
//---------------------------------------------------
//Утанавливаем размер массива изображения.
//---------------------------------------------------
//----------------------------------
Номер_пикселя_лейбла = a1 + 5;
//----------------------------------
if(Тип_лейбла == _MY_LABEL)
{
Установить_цвет_и_прозрачность_пикселей_изображения(Окно,Объект,Состояние_детали);
}
//----------------------------------
break;
}
}
}
//--------------------------------------------------
void Создать_ресурс(string Наименование_ресурса, int &Массив_пикселей[],int Ширина_массива, int Высота_массива, int Формат_цвета = COLOR_FORMAT_ARGB_NORMALIZE)
{
//-------------------------------------
Имя_ресурса = "::"+"bitmap"+ Наименование_ресурса;
//-------------------------------------
ObjectCreate(0,Наименование_ресурса,OBJ_BITMAP_LABEL,0,0,0);
ObjectSetString(0,Наименование_ресурса,OBJPROP_BMPFILE,Имя_ресурса);
//-------------------------------------
if(!ResourceCreate(Имя_ресурса,Массив_пикселей,Ширина_массива,Высота_массива,0,0,0,Формат_цвета))Alert("!ResourceCreate 2 Наименование_ресурса ",Наименование_ресурса," Ошибка ",GetLastError());
//-------------------------------------
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Установить_цвет_и_прозрачность_пикселей_изображения(int Окно, int Объект, int Состояние_детали)
{
//if(!G_CORE[Окно][Объект][_OBJECT_ACTIVATED])
// Alert(__FUNCTION__);
//----------------------------------------------------------
Данные_пикселя[Пиксель_0][Цвет] = STANDART_GROUPS[Состояние_детали + 3];
Данные_пикселя[Пиксель_0][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 4];
//----------------------------------------------------------
Данные_пикселя[Пиксель_1][Цвет] = STANDART_GROUPS[Состояние_детали + 5];
Данные_пикселя[Пиксель_1][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 6];
//----------------------------------------------------------
Данные_пикселя[Пиксель_2][Цвет] = STANDART_GROUPS[Состояние_детали + 7];
Данные_пикселя[Пиксель_2][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 8];
//----------------------------------------------------------
Данные_пикселя[Пиксель_3][Цвет] = STANDART_GROUPS[Состояние_детали + 9];
Данные_пикселя[Пиксель_3][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 10];
//----------------------------------------------------------
Данные_пикселя[Пиксель_4][Цвет] = STANDART_GROUPS[Состояние_детали + 11];
Данные_пикселя[Пиксель_4][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 12];
//----------------------------------------------------------
Данные_пикселя[Пиксель_5][Цвет] = STANDART_GROUPS[Состояние_детали + 13];
Данные_пикселя[Пиксель_5][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 14];
//----------------------------------------------------------
Данные_пикселя[Пиксель_6][Цвет] = STANDART_GROUPS[Состояние_детали + 15];
Данные_пикселя[Пиксель_6][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 16];
//----------------------------------------------------------
Данные_пикселя[Пиксель_7][Цвет] = STANDART_GROUPS[Состояние_детали + 17];
Данные_пикселя[Пиксель_7][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 18];
//----------------------------------------------------------
Создать_ресурс(string Наименование_ресурса
Наименование_ресурса - как часто меняется? сколько ресурсов в памяти?