Делаем краудсорсовый проект по Canvas - страница 17

 
o_O:

Создать_ресурс(string Наименование_ресурса

Наименование_ресурса - как часто меняется?   сколько ресурсов в памяти?

Буквально несколько. Зависит от количества открытых окон. На данный момент работаю с 1 - 2 мя окнами одновременно. В каждом окне  3 - 4  битмап-объекта. Получается где то 8 ресурсов. (Думаю, маловато чтобы тормозило...)

Окна обновляются на событиях интерфейса (сейчас только на кликах, другие события отключил). При этом, тормозит сразу, а не спустя время. На первом же клике. К тому же четко видна связь между "силой торможения" и размером окна. Чем больше окно, - тем медленней реакция картинки.

При этом, надо учесть, что до ResourceCreate() доходит не сразу, а после "заполнения" локального массива изображением, то есть после всех расчетов цветов и инициализации массива изображения. Думаю, проблема в этом.

 

Для того, чтобы сделать окончательный вывод, я стану сохранять изображение в статическом или глобальном массиве. На событиях интерфейса буду обновлять окно сразу посылая в ResourceCreate(), - без инициализации локального массива и вызовов ColorToARGB().

Если после этого эффектторможения пропадет, - значит дело в том, о чем я говорил. Если нет, - то проблема в другом...

Завтра попробую это проверить. После опыта, - отпишусь о результатах.

 
запустите с профайлером.
 
o_O:
запустите с профайлером.
Завтра сделаю. Ок. )
 

@Реter Konow, зачем столько английских слов в коде?

Переходите на чистый русский:

#define целочисленное int
#define пока while
#define Печатать Print

void OnStart()
{
        целочисленное номер = 0;
        пока ( номер < 10 )
        {
                Печатать( "номер = ", номер, "!" );
                номер ++;
        }
}
 
Andrey Khatimlianskii:

@Реter Konow, зачем столько английских слов в коде?

Переходите на чистый русский:

#define целочисленное int
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart


пустой Начнем()
{
        целочисленное номер = 0;
        пока ( номер < 10 )
        {
                Печатать( "номер = ", номер, "!" );
                номер ++;
        }
}

Так еще лучше
 

 
Igor Volodin:

#define целочисленное int
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart


пустой Начнем()
{
        целочисленное номер = 0;
        пока ( номер < 10 )
        {
                Печатать( "номер = ", номер, "!" );
                номер ++;
        }
}

Так еще лучше
 

дальше - меняем #define на '#определять'

добавил:  меняем 'loss' на 'прибыль'
и т.д...
 
#define цл    int     // целое
#define цлк   short   // целое короткое
#define цлд   long    // целое длинное
#define плк   float   // плавающее короткое
#define пл    double  // плавающее
#define пст   void    // пустота
#define исток main
#define вывод Print
#define пока  while

пст исток()
{
   цл нмр = 0;             // сокращение от номер.
   пока( нмр < 10 )
   {
      вывод( "номер = ", нмр, "!" );
      нмр ++;

   }

}
Подсветить как положено и ничем не хуже тогда будет, по-моему.
 
Andrey Khatimlianskii:

@Реter Konow, зачем столько английских слов в коде?

Переходите на чистый русский:

#define целочисленное int
#define пока while
#define Печатать Print

void OnStart()
{
        целочисленное номер = 0;
        пока ( номер < 10 )
        {
                Печатать( "номер = ", номер, "!" );
                номер ++;
        }
}

Предложение интересное, думал об этом. Однако, в комбинировании двух языков есть свои плюсы.

Если программа написана только на одном языке (даже если это родной язык), то взгляд на нее постепенно "замыливается" из за однообразия текста.

Чередование русских наименований функций и переменных, и английских идентификаторов событий, свойств, констант и операторов, создает необходимый для лучшего чтения контраст.

Поэтому, я не перехожу полностью на русский. Однако, русский все равно доминирует, и это очень помогает ориентироваться в большом коде.

 

итак с почином первой версии работы со стилями.

реализация схемы выглядит так

**************

enAttrName - список (расширяемый)  аттрибутов отрисовываемого элемента

//------------------------------------------------------------------    enum enAttrName
enum enAttrName // возможные аттрибутов контрола
{
        // шрифт
        anFontName, // имя
        anFontColor, // цвет
        anFontSize, // размер
        anFontWeight, // толщина
        anFontStyle, // стиль
        // фон
        anBackgroundColor, // цвет
        anBackgroundFill, // заливка
        // граница
        anBorderColor, // цвет
        anBorderWidth, // толщина
        // выравнивание
        anAlign,
        anVAlign

по мере необходимости добавлять нужные аттрибуты
};


атрибут сохраняется в классе GAttr

class GAttr // класс для установки значения в конкретный аттрибут
{
        enAttrName m_attr; // имя аттрибута
        // его значение
        long lval;
        double dval;
        string sval;
};

он чем то напоминает MqlParam, но в отличии от него - типонезависим.

------

далее аттрибуты группируются в список GAttrReflect. Этот список будет относиться к конкретному состоянию конкретного класса.

class GAttrReflect
{
        GAttr* m_list[]; // список аттрибутов класса для одного некоторого состояния
};

Важной особенностью работы этого класса есть то, что в списке m_list не может повторятся некий аттрибут два раза. Значение аттрибута при обновлении будет переписано или же аттрибут будет создан если его не было.

-------

У каждого контрола существуют несколько таких списков. Каждый из которых относится к отражению состояния контрола. Этот список отражений (рефлектов) расширяемый.

enum enAttrReflect // виды состояний - реакция контрола на своё состояние
{
        arDefault, // состояние по-умолчанию
        arDisable, // недоступен для ввода/неактивный
        arTransp, // должен стать прозрачным
        arSelect, // выбран
        arCheck, // отмечен
        arOver, // мышка над объектом
        arFocus, // получен фокус ввода

по мере необходимости добавлять новые рефлекты
};

Соответственно у каждого контрола (класса)  можно определить аттрибуты для каждого его рефлекта.

Класс - GAttrClass - хранит список рефлектов конкретного класса.

class GAttrClass
{
        string m_class; // для какого класса составлен список
        GAttrReflect reflect[arLast]; // список рефлектов класса
};

-------

И наконец финальный класс GThema, который обрабатывает весь набор классов существующих и создаваемых вами

class GThema
{
        GAttrClass* m_list[]; // список классов
};

В данном классе применен аналогичный принцип как у списка атрибутов - не может существовать в списке два класса с одинаковым именем.

Благодаря перегрузке operator[] мы можем удобно задавать имена параметров.

// задаём в классе GButton - цвет текста при наведении указателя мышки
g_thema["GButton"][arOver][anFontColor]=XRGB(255, 255, 255);

// или можно так
GAttrClass* at = g_thema["GButton"];
GAttrReflect* vl = at[arDefault];
vl[anFontColor] = XRGB(255, 255, 255);

---------

И наконец то как мы получаем интересующий параметр из темы класса

1. ищем в списке нужный класс m_class
2. Если найден, то ищем в нём рефлект,
3. если найден то ищем аттрибут
4. если атрибут не найден, то ищем дефолтный рефлект и атрибут в нём
5. если атрибут и в дефолтном рефлекте не найден, то повторяем пункты 1-4 для дефолтного имени класса (m_class=NULL) , который общий для всех элементов.

---------
преимущество подхода:
- всегда есть дефолтный класс, которым в принципе можно обойтись и не создавать новых
- можно не создавать рефлекты, а использовать только дефолтный arDefault
- не нужно задавать в каждом контроле свойства. Достаточно добавить класс в GThema и брать данные из него
- все атрибуты , которые не были заданы у класса в рефлекте - иерархично получаются из дефолтного рефлекта или из дефолтного класса.