![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Você está exagerando um pouco da seguinte maneira:
...
Entenda, reescrever é reescrever valores em uma matriz, e se você tiver que reescrever 1000000 valores (o número aproximado de pixels na imagem da janela e no bitmap), não serão "milésimos de segundo", mas segundos.
Não estou exagerando e vou entender por quê. Vejam meus exemplos, nesta linha, o FPS em movimento está em torno de 30-40 fps. Molduras, Carl!
E cada moldura difere da outra não por 100 pixels, mas por 70-80% da área de trabalho. Não estou dizendo que, com o tamanho da resolução da tela, este FPS não diminui. E é verdade. Em uma tela 1980x1050 ao mover grandes áreas para 12-17.
E sim. Estou usando o cache em todos os lugares e algumas otimizações para encontrar áreas com cache desatualizado (procurando por áreas sujas). Mas é uma prática comum, não pense que você vai abrir os olhos de ninguém.
Não estou exagerando e vou ver por quê. Vejam meus exemplos, nesta linha, o FPS em movimento está em torno de 30-40 fps. Molduras, Carl!
E cada moldura difere da outra não por 100 pixels, mas por 70-80% da área de trabalho. Não estou dizendo que, com o tamanho da resolução da tela, este FPS não diminui. E é verdade. Em uma tela 1980x1050 ao mover grandes áreas para 12-17.
E sim. Estou usando o cache em todos os lugares e algumas otimizações para encontrar áreas com cache desatualizado (encontrar áreas sujas). Mas é uma prática comum, não pense que você vai abrir os olhos de ninguém.
Você armazena a máscara digital na memória após enviar a matriz com a imagem para ResoourceCreate()?
Se assim for, é claro por que você não tem atrasos. Eu ainda não a implementei. Ou seja, na minha implementação a máscara de imagem não é salva. Portanto, para mudar qualquer parte de uma janela, eu tenho que recriar toda a janela em uma matriz. Isto causa um gargalo.
O próximo passo é construir um sistema para economizar máscaras digitais e trabalhar eficientemente com áreas específicas. Depois disso, a resposta dos elementos aos eventos da interface não será retardada.
1. Quanto mais tempo leva (aproximadamente 250 milissegundos a 2 segundos).
Uau, que números.
Não deve haver nenhum atraso na tela inteira.
O que você está desenhando lá?
---
se você estiver usando CCanvas - verifique o destruidor - você provavelmente não está fazendo ResourceFree.
Esta é a principal causa da frenagem dos recursos. Criação constante sem soltar.
Você armazena a máscara numérica na memória depois de enviar a matriz de imagens para ResoourceCreate()?
Você mesmo inventou o termo "máscara digital"? Yandex me dá capacetes de realidade virtual ). Sim, caching em arrays. Pessoalmente, fiz um grande esforço para otimizar a opção do canal alfa, pois queria tirar o máximo proveito disso. Muito é consumido pela mistura "manual" de pixels para fazer elementos transparentes. Sem o cálculo do canal alfa, a interface voa até mesmo várias vezes mais rápido.
Você mesmo inventou o termo "máscara digital"? Yandex me dá capacetes de realidade virtual ). Sim, caching em arrays. Pessoalmente, fiz um grande esforço para otimizar a opção do canal alfa, pois queria tirar o máximo proveito disso. Ele come muito sobre a mistura "manual" de pixels para fazer elementos transparentes. Sem o cálculo do canal alfa, a interface voa até mesmo várias vezes mais rápido.
Sim, eu mesmo criei o termo, mas posso mudá-lo para algo mais conveniente se você o sugerir. )
O que eu quero dizer é que a imagem é convertida em números que representam as cores (já depois que o canal alfa foi calculado), que são armazenados em uma matriz. Esta matriz é enviada para ResourceCreate(), e a imagem é criada.
Eu não tentei otimizar o canal alfa, mas é uma idéia interessante... Tenho todos os objetos desenhados após o cálculo do canal alfa para que haja uma idéia que torne possível mudar a transparência das janelas de interface. No futuro, acho que isto poderia ser implementado. A única coisa que atrapalha são os campos de entrada, que são criados por objetos "normais" e, portanto, não mudam a transparência... Mas isto também pode ser resolvido.
Vejo a solução para a barraca em eventos de interface, antes de tudo, no armazenamento de imagens em matrizes e na orientação das mesmas em suas áreas.
Uau, que números.
Não deve haver nenhum freio em tela cheia.
O que você está desenhando lá?
---
se você estiver usando CCanvas - verifique o destruidor - você provavelmente não está fazendo ResourceFree.
Esta é a principal razão para a desaceleração dos recursos. Criação constante sem liberação.
Vou definitivamente tentar ResourceFree(), mas não acho que este seja o problema. (Eu desenho janelas de ajuste com controles. Eu não uso Kanvas infelizmente - abordagem diferente).
O problema é que, se eu criar uma pequena janela de ajustes, com poucas caixas de seleção, elas reagem visualmente instantaneamente, porém se eu criar uma janela maior (~700x500 pixels ou mais), então a velocidade geral de reação aos eventos da interface cai muitas vezes.
Analisando o problema, cheguei à conclusão que se trata de reinicializar a matriz e recalcular as cores de todos os pixels em cada evento de interface. Afinal de contas, a função calcula cerca de 700*500 valores e inicializa a matriz. A inicialização da matriz em si também leva tempo. Mas se você salvar a imagem e mudar apenas os valores de cor dos pixels que pertencem a um determinado elemento, o tempo de reação dependerá da área deste elemento...
Este me parece ser o problema.
Analisando o problema, cheguei à conclusão que se trata de reinicializar a matriz e recalcular as cores de todos os pixels em cada evento de interface. Afinal de contas, a função calcula cerca de 700*500 valores e inicializa a matriz.
mostre o código.
A função "Draw_element()" cria todos os detalhes da imagem da janela. Primeiro, ele cria um array de imagens (que é como uma tela de desenho comum) e desenha todos os componentes nele (digitalmente).
Para desenhar cada tipo de componente, uma função especial é chamada, projetada para desenhar este tipo específico: "Draw_element_detail()", "Set_text_on_element()", "Create_gradient", "Set_label_on_element()":
Envio o código em várias partes, pois o editor não aceita o todo.
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];
//----------------------------------------------------------
Create_resource(string Resource_name
Resource_name - quantas vezes ele muda? quantos recursos estão na memória?