이미지 배열을 ResoourceCreate()에 보낸 후 메모리에 디지털 마스크를 유지합니까?
"디지털 마스크"라는 용어를 스스로 생각해 냈습니까? Yandex는 나에게 가상 현실 헬멧을 제공합니다). 예, 배열로 캐싱합니다. 개인적으로 나는 특히 알파 채널 옵션의 최적화에 의존했습니다. 최대한 활용하고 싶었다. 투명 요소가 있도록 픽셀의 "수동" 혼합에 많은 부분이 소모됩니다. 알파 채널을 계산하지 않으면 인터페이스가 몇 배 더 빠르게 날아갑니다.
"디지털 마스크"라는 용어를 스스로 생각해 냈습니까? Yandex는 나에게 가상 현실 헬멧을 제공합니다). 예, 배열로 캐싱합니다. 개인적으로 나는 특히 알파 채널 옵션의 최적화에 의존했습니다. 최대한 활용하고 싶었다. 투명 요소가 있도록 픽셀의 "수동" 혼합에 많은 부분이 소모됩니다. 알파 채널을 계산하지 않으면 인터페이스가 몇 배 더 빠르게 날아갑니다.
네, 제가 직접 생각해 낸 용어이지만, 제안해 주시면 더 편리한 용어로 변경할 수 있습니다. )
이것은 이미지가 (알파 채널이 계산된 후) 색상을 나타내는 숫자로 변환되어 배열에 저장됨을 의미합니다. 이 배열은 ResourceCreate()로 전송되고 이미지가 생성됩니다.
알파채널로 작업을 최적화 해보지는 않았지만 재미있는 아이디어네요...인터페이스 창의 투명도를 변경할 수 있도록 하는 아이디어가 있어서 알파채널을 계산한 후 모든 개체를 그렸습니다. . 미래에는 이것이 구현될 수 있다고 생각합니다. "일반" 개체에 의해 생성된 입력 필드 만 간섭하므로 투명도를 변경하지 않습니다... 하지만 이것도 해결할 수 있습니다.
저는 주로 이미지를 어레이에 저장하고 해당 영역에서 방향을 지정할 때 인터페이스 이벤트에 제동을 거는 문제에 대한 솔루션을 봅니다.
CCanvas를 사용하는 경우 소멸자를 확인하십시오. 확실히 ResourceFree를 사용하고 있지 않습니다.
이것이 자원으로 작업할 때 브레이크가 걸리는 주된 이유입니다. 릴리스 없는 끊임없는 생성.
확실히 ResourceFree()를 시도할 것이지만 이것이 문제가 아닌 것 같습니다. (저는 컨트롤이 있는 설정 창을 그립니다. 불행히도 저는 Canvas를 사용하지 않습니다. 다른 접근 방식입니다.)
사실 여러 확인란이 있는 작은 설정 창을 만든 다음 시각적으로 즉시 반응하지만 더 큰 창(~ 700x500픽셀 이상)을 만들면 인터페이스 이벤트에 대한 전체 반응 속도가 크게 떨어집니다.
문제를 분석해 보니 배열을 다시 초기화하고 각 인터페이스 이벤트에서 모든 픽셀의 색상을 다시 계산하는 것이 포인트라는 결론에 도달했습니다. 결국 함수는 약 700*500 값을 계산하고 배열을 초기화합니다. 배열 초기화 자체에도 시간이 걸립니다. 그러나 이미지를 저장하고 특정 요소와 관련된 픽셀 색상 값만 변경하면 반응 시간은 이미 이 요소의 영역에 따라 달라집니다 ...
이 코드 블록은 창과 해당 요소의 디지털 "스냅샷" 생성을 직접 담당하는 기능 집합입니다.
"Draw_element()" 함수는 창 이미지의 모든 세부 정보를 만듭니다. 먼저 이미지 배열(일반적인 드로잉 캔버스와 유사)을 만들고 그 위에 모든 구성 요소를 (디지털로) 그립니다 .
각 유형의 구성 요소를 그리기 위해 "Draw_element_detail()", "Set_text_on_element()", "Create_gradient", "Set_label_on_element()"와 같은 특정 유형을 그리도록 설계된 특수 함수가 호출됩니다.
편집기가 전체를 수락하지 않기 때문에 코드를 여러 부분으로 보냅니다.
//-------------------------------------------------- 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 Длинна_градиента, 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(Альфы, Ширина_градиента_рамки);
} //-------------------------------------------------- void Создать_ресурс(string Наименование_ресурса, int &Массив_пикселей[],int Ширина_массива, int Высота_массива, int Формат_цвета = COLOR_FORMAT_ARGB_NORMALIZE) {
당신은 다음에 대해 약간 과장하고 있습니다.
...
다시 그리기는 배열의 값을 다시 쓰는 것이며 1000000개의 값(창 이미지와 비트맵의 대략적인 픽셀 수)을 다시 써야 하는 경우 "1000분의 1초"가 아닙니다. 하지만 초.
나는 과장하지 않으며 그 이유를 이해합니다. 내 예를 보세요. 이 스레드에서 모션 FPS는 약 30-40fps입니다. 카드로프, 칼!
그리고 각 프레임은 100픽셀이 아니라 작업 영역의 70-80%가 다릅니다. 화면 해상도가 크다고 이 FPS가 줄어들지 않는다는 말은 아닙니다. 축소 중입니다. 1980x1050 화면에서 최대 12-17까지 넓은 영역을 이동할 때.
그리고 예. 나는 모든 곳에서 캐싱을 사용하고 오래된 캐시 영역을 찾는 데 몇 가지 최적화를 사용합니다(더티 영역 검색). 그러나 이것은 일반적인 관행이므로 누군가에게 눈을 뜨게 될 것이라고 생각하지 마십시오.
나는 과장하지 않으며 그 이유를 이해합니다. 내 예를 보세요. 이 스레드에서 FPS는 약 30-40fps입니다. 카드로프, 칼!
그리고 각 프레임은 100픽셀이 아니라 작업 영역의 70-80%가 다릅니다. 화면 해상도가 크다고 이 FPS가 줄어들지 않는다는 말은 아닙니다. 줄어들고 있다. 1980x1050 화면에서 최대 12-17까지 넓은 영역을 이동할 때.
그리고 예. 나는 모든 곳에서 캐싱을 사용하고 오래된 캐시 영역을 찾는 데 몇 가지 최적화를 사용합니다(더티 영역 검색). 그러나 이것은 일반적인 관행이므로 누군가에게 눈을 뜨게 될 것이라고 생각하지 마십시오.
이미지 배열을 ResoourceCreate()에 보낸 후 메모리에 디지털 마스크를 유지합니까?
그렇다면 속도를 늦추지 않는 이유가 분명합니다. 아직 구현하지 않았습니다. 즉, 내 구현에서 이미지 마스크가 유지되지 않습니다. 따라서 창의 일부를 변경하려면 전체 창을 배열로 다시 만들어야 합니다. 이로 인해 속도가 느려집니다.
다음 단계는 디지털 마스크를 저장하고 특정 영역에서 효과적으로 작업하는 시스템을 구축하는 것입니다. 그 후에는 인터페이스 이벤트에 대한 요소의 반응이 느려지지 않습니다.
1. 더 오래 걸립니다(약 250밀리초에서 2초).
와우, 숫자.
전체 화면에서 브레이크가 전혀 없어야 합니다.
거기에서 무엇을 그리고 있습니까?
---
CCanvas를 사용하는 경우 소멸자를 확인하십시오. 확실히 ResourceFree를 사용하고 있지 않습니다.
이것이 자원으로 작업할 때 브레이크가 걸리는 주된 이유입니다. 릴리스 없는 끊임없는 생성.
이미지 배열을 ResoourceCreate()에 보낸 후 메모리에 디지털 마스크를 유지합니까?
"디지털 마스크"라는 용어를 스스로 생각해 냈습니까? Yandex는 나에게 가상 현실 헬멧을 제공합니다). 예, 배열로 캐싱합니다. 개인적으로 나는 특히 알파 채널 옵션의 최적화에 의존했습니다. 최대한 활용하고 싶었다. 투명 요소가 있도록 픽셀의 "수동" 혼합에 많은 부분이 소모됩니다. 알파 채널을 계산하지 않으면 인터페이스가 몇 배 더 빠르게 날아갑니다.
"디지털 마스크"라는 용어를 스스로 생각해 냈습니까? Yandex는 나에게 가상 현실 헬멧을 제공합니다). 예, 배열로 캐싱합니다. 개인적으로 나는 특히 알파 채널 옵션의 최적화에 의존했습니다. 최대한 활용하고 싶었다. 투명 요소가 있도록 픽셀의 "수동" 혼합에 많은 부분이 소모됩니다. 알파 채널을 계산하지 않으면 인터페이스가 몇 배 더 빠르게 날아갑니다.
네, 제가 직접 생각해 낸 용어이지만, 제안해 주시면 더 편리한 용어로 변경할 수 있습니다. )
이것은 이미지가 (알파 채널이 계산된 후) 색상을 나타내는 숫자로 변환되어 배열에 저장됨을 의미합니다. 이 배열은 ResourceCreate()로 전송되고 이미지가 생성됩니다.
알파채널로 작업을 최적화 해보지는 않았지만 재미있는 아이디어네요...인터페이스 창의 투명도를 변경할 수 있도록 하는 아이디어가 있어서 알파채널을 계산한 후 모든 개체를 그렸습니다. . 미래에는 이것이 구현될 수 있다고 생각합니다. "일반" 개체에 의해 생성된 입력 필드 만 간섭하므로 투명도를 변경하지 않습니다... 하지만 이것도 해결할 수 있습니다.
저는 주로 이미지를 어레이에 저장하고 해당 영역에서 방향을 지정할 때 인터페이스 이벤트에 제동을 거는 문제에 대한 솔루션을 봅니다.
와우, 숫자.
전체 화면에서 브레이크가 전혀 없어야 합니다.
거기에서 무엇을 그리고 있습니까?
---
CCanvas를 사용하는 경우 소멸자를 확인하십시오. 확실히 ResourceFree를 사용하고 있지 않습니다.
이것이 자원으로 작업할 때 브레이크가 걸리는 주된 이유입니다. 릴리스 없는 끊임없는 생성.
확실히 ResourceFree()를 시도할 것이지만 이것이 문제가 아닌 것 같습니다. (저는 컨트롤이 있는 설정 창을 그립니다. 불행히도 저는 Canvas를 사용하지 않습니다. 다른 접근 방식입니다.)
사실 여러 확인란이 있는 작은 설정 창을 만든 다음 시각적으로 즉시 반응하지만 더 큰 창(~ 700x500픽셀 이상)을 만들면 인터페이스 이벤트에 대한 전체 반응 속도가 크게 떨어집니다.
문제를 분석해 보니 배열을 다시 초기화하고 각 인터페이스 이벤트에서 모든 픽셀의 색상을 다시 계산하는 것이 포인트라는 결론에 도달했습니다. 결국 함수는 약 700*500 값을 계산하고 배열을 초기화합니다. 배열 초기화 자체에도 시간이 걸립니다. 그러나 이미지를 저장하고 특정 요소와 관련된 픽셀 색상 값만 변경하면 반응 시간은 이미 이 요소의 영역에 따라 달라집니다 ...
이것이 문제인 것 같습니다.
문제를 분석해 보니 배열을 다시 초기화하고 각 인터페이스 이벤트에서 모든 픽셀의 색상을 다시 계산하는 것이 포인트라는 결론에 도달했습니다. 결국 함수는 약 700*500 값을 계산하고 배열을 초기화합니다.
코드를 보여줍니다.
"Draw_element()" 함수는 창 이미지의 모든 세부 정보를 만듭니다. 먼저 이미지 배열(일반적인 드로잉 캔버스와 유사)을 만들고 그 위에 모든 구성 요소를 (디지털로) 그립니다 .
각 유형의 구성 요소를 그리기 위해 "Draw_element_detail()", "Set_text_on_element()", "Create_gradient", "Set_label_on_element()"와 같은 특정 유형을 그리도록 설계된 특수 함수가 호출됩니다.
편집기가 전체를 수락하지 않기 때문에 코드를 여러 부분으로 보냅니다.
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 (문자열 Resource_name
Resource_name - 얼마나 자주 변경됩니까? 메모리에 얼마나 많은 리소스가 있습니까?