Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Создать_ресурс(string Наименование_ресурса
Наименование_ресурса - как часто меняется? сколько ресурсов в памяти?
Буквально несколько. Зависит от количества открытых окон. На данный момент работаю с 1 - 2 мя окнами одновременно. В каждом окне 3 - 4 битмап-объекта. Получается где то 8 ресурсов. (Думаю, маловато чтобы тормозило...)
Окна обновляются на событиях интерфейса (сейчас только на кликах, другие события отключил). При этом, тормозит сразу, а не спустя время. На первом же клике. К тому же четко видна связь между "силой торможения" и размером окна. Чем больше окно, - тем медленней реакция картинки.
При этом, надо учесть, что до ResourceCreate() доходит не сразу, а после "заполнения" локального массива изображением, то есть после всех расчетов цветов и инициализации массива изображения. Думаю, проблема в этом.
Для того, чтобы сделать окончательный вывод, я стану сохранять изображение в статическом или глобальном массиве. На событиях интерфейса буду обновлять окно сразу посылая в ResourceCreate(), - без инициализации локального массива и вызовов ColorToARGB().
Если после этого эффектторможения пропадет, - значит дело в том, о чем я говорил. Если нет, - то проблема в другом...
Завтра попробую это проверить. После опыта, - отпишусь о результатах.
запустите с профайлером.
@Реter Konow, зачем столько английских слов в коде?
Переходите на чистый русский:
#define пока while
#define Печатать Print
void OnStart()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
@Реter Konow, зачем столько английских слов в коде?
Переходите на чистый русский:
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
Так еще лучше
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
Так еще лучше
добавил: меняем 'loss' на 'прибыль'
и т.д...
#define цлк short // целое короткое
#define цлд long // целое длинное
#define плк float // плавающее короткое
#define пл double // плавающее
#define пст void // пустота
#define исток main
#define вывод Print
#define пока while
пст исток()
{
цл нмр = 0; // сокращение от номер.
пока( нмр < 10 )
{
вывод( "номер = ", нмр, "!" );
нмр ++;
}
}@Реter Konow, зачем столько английских слов в коде?
Переходите на чистый русский:
#define пока while
#define Печатать Print
void OnStart()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
Предложение интересное, думал об этом. Однако, в комбинировании двух языков есть свои плюсы.
Если программа написана только на одном языке (даже если это родной язык), то взгляд на нее постепенно "замыливается" из за однообразия текста.
Чередование русских наименований функций и переменных, и английских идентификаторов событий, свойств, констант и операторов, создает необходимый для лучшего чтения контраст.
Поэтому, я не перехожу полностью на русский. Однако, русский все равно доминирует, и это очень помогает ориентироваться в большом коде.
итак с почином первой версии работы со стилями.
реализация схемы выглядит так
**************
enAttrName - список (расширяемый) аттрибутов отрисовываемого элемента
enum enAttrName // возможные аттрибутов контрола
{
// шрифт
anFontName, // имя
anFontColor, // цвет
anFontSize, // размер
anFontWeight, // толщина
anFontStyle, // стиль
// фон
anBackgroundColor, // цвет
anBackgroundFill, // заливка
// граница
anBorderColor, // цвет
anBorderWidth, // толщина
// выравнивание
anAlign,
anVAlign
по мере необходимости добавлять нужные аттрибуты
};
атрибут сохраняется в классе GAttr
{
enAttrName m_attr; // имя аттрибута
// его значение
long lval;
double dval;
string sval;
};
он чем то напоминает MqlParam, но в отличии от него - типонезависим.
------
далее аттрибуты группируются в список GAttrReflect. Этот список будет относиться к конкретному состоянию конкретного класса.
{
GAttr* m_list[]; // список аттрибутов класса для одного некоторого состояния
};
Важной особенностью работы этого класса есть то, что в списке m_list не может повторятся некий аттрибут два раза. Значение аттрибута при обновлении будет переписано или же аттрибут будет создан если его не было.
-------
У каждого контрола существуют несколько таких списков. Каждый из которых относится к отражению состояния контрола. Этот список отражений (рефлектов) расширяемый.
{
arDefault, // состояние по-умолчанию
arDisable, // недоступен для ввода/неактивный
arTransp, // должен стать прозрачным
arSelect, // выбран
arCheck, // отмечен
arOver, // мышка над объектом
arFocus, // получен фокус ввода
по мере необходимости добавлять новые рефлекты
};
Соответственно у каждого контрола (класса) можно определить аттрибуты для каждого его рефлекта.
Класс - GAttrClass - хранит список рефлектов конкретного класса.
{
string m_class; // для какого класса составлен список
GAttrReflect reflect[arLast]; // список рефлектов класса
};
-------
И наконец финальный класс GThema, который обрабатывает весь набор классов существующих и создаваемых вами
{
GAttrClass* m_list[]; // список классов
};
В данном классе применен аналогичный принцип как у списка атрибутов - не может существовать в списке два класса с одинаковым именем.
Благодаря перегрузке operator[] мы можем удобно задавать имена параметров.
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 и брать данные из него
- все атрибуты , которые не были заданы у класса в рефлекте - иерархично получаются из дефолтного рефлекта или из дефолтного класса.