//-------------------------------------------------- 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 を使用して いる場合、デストラクタをチェックしてください。
これがリソースブレーキの主な原因です。リリースすることなく、常に創造し続けること。
ResoourceCreate()で画像配列を送った後、数値マスクをメモリに保存しているのでしょうか?
デジタルマスクという言葉はご自身で考えられたのでしょうか?Yandexは私に仮想現実のヘルメットを与えてくれます)。そう、アレイでのキャッシングです。個人的には、アルファチャンネルオプションの効果を最大限に発揮させたいので、とことん最適化しました。ピクセルを "手動で "ブレンドして透明な要素を作るのに、多くの時間を費やしました。アルファチャンネルの計算を行わない場合、インターフェースはさらに数倍速く飛ぶ。
デジタルマスクという言葉はご自身で考えられたのでしょうか?Yandexは私に仮想現実のヘルメットを与えてくれます)。そう、アレイでのキャッシングです。個人的には、アルファチャンネルオプションの効果を最大限に発揮させたいので、とことん最適化しました。ピクセルを "手動で "ブレンドして透明な要素を作るのに、多くの時間を費やしました。アルファチャンネルの計算を行わない場合、インターフェースはさらに数倍速く飛ぶ。
そうですね、私が考えた言葉ですが、ご提案いただければ、もっと便利な言葉に変えますよ。)
つまり、画像は色を表す数値に変換され(すでにアルファチャンネルが計算された後)、配列に格納されるのです。この配列をResourceCreate()に送り、画像を作成する。
アルファチャンネルの最適化は試したことがないのですが、面白いアイデアですね...。全てのオブジェクトをアルファチャンネル計算後に描画しているので、インターフェースウィンドウの透明度を変更できるようにするアイディアがあります。将来的には、これが実装される可能性もあると思います。邪魔になるのは入力フィールドだけ で、これは「普通の」オブジェクトで作成されているため、透明度は変わりません...。しかし、これも解決することができます。
インターフェースイベントの失速の解決策は、まず、画像を配列に格納し、その領域で方向性を決めることだと考えています。
すごい、何という数字でしょう。
フルスクリーンではブレーキが全くかからないはずです。
そこで何を描いているのですか?
---
CCanvas を使用している場合、デストラクタをチェックしてください。
これが資源低迷の主な原因です。解放されることなく、常に創造し続ける。
ResourceFree()は必ず試してみますが、この問題ではないと思います。 (コントロールで設定ウィンドウを描画しています。残念ながら、私はKanvasを使用していません。)
つまり、チェックボックスが少ない小さな設定ウィンドウを作れば、視覚的には瞬時に反応しますが、大きなウィンドウ(〜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)
リソース名 - 変更される頻度、メモリ内のリソース数