Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Create_resource(string Resource_name
Nom_de_la_ressource - à quelle fréquence change-t-il ? combien de ressources sont en mémoire ?
Littéralement quelques-uns. Ça dépend du nombre de fenêtres ouvertes. Actuellement, je travaille avec 1 ou 2 fenêtres à la fois. Chaque fenêtre comporte 3-4 objets bitmap. Il s'agit d'environ 8 ressources. (Je pense que ce n'est pas suffisant pour ralentir...)
Mise à jour de Windows sur les événements de l'interface (maintenant seulement sur les clics, les autres événements étant désactivés). En même temps, il ralentit immédiatement, pas après un certain temps. Au premier clic. En outre, je vois clairement un lien entre la "puissance de freinage" et la taille des fenêtres. Plus la fenêtre est grande, plus la réponse de l'image est lente.
Notez également que ResourceCreate() n'arrive pas immédiatement, mais après avoir "rempli" le tableau local avec une image, c'est-à-dire après tous les calculs de couleur et l'initialisation du tableau d' images. Je pense que c'est le problème.
Pour conclure, je vais stocker l'image dans un tableau statique ou global. Sur les événements d'interface, je mettrai à jour la fenêtre immédiatement en envoyant ResourceCreate()- sans initialiser le tableau local et appeler ColorToARGB().
Si après cela l'effet de ralentissement disparaît - alors le problème est celui que j'ai décrit. Si ce n'est pas le cas, le problème se situe ailleurs.
Demain, je vais essayer de le vérifier. Après l'expérience, j'écrirai sur les résultats.
l'exécuter avec un profileur.
@Peter Konow, pourquoi tant de mots anglais dans le code ?
Passez au russe pur :
#define пока while
#define Печатать Print
void OnStart()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
@Peter Konow, pourquoi tant de mots anglais dans le code ?
Passez au russe pur :
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
C'est encore mieux.
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
C'est encore mieux.
ajouté : transformer la "perte" en "bénéfice".
etc...
#define цлк short // целое короткое
#define цлд long // целое длинное
#define плк float // плавающее короткое
#define пл double // плавающее
#define пст void // пустота
#define исток main
#define вывод Print
#define пока while
пст исток()
{
цл нмр = 0; // сокращение от номер.
пока( нмр < 10 )
{
вывод( "номер = ", нмр, "!" );
нмр ++;
}
}@Peter Konow, pourquoi tant de mots anglais dans le code ?
Passez au russe pur :
#define пока while
#define Печатать Print
void OnStart()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
La suggestion est intéressante, j'y ai pensé. Cependant, il y a des avantages à combiner deux langues.
Si un programme est écrit dans une seule langue (même s'il s'agit de la langue maternelle), la vue est progressivement "escamotée" par la monotonie du texte.
L'alternance de noms de fonctions et de variables en russe, et d'identifiants anglais pour les événements, les propriétés, les constantes et les opérateurs, crée le contraste nécessaire à une meilleure lecture.
Par conséquent, je ne passe pas complètement au russe. Cependant, le russe domine toujours, et il aide beaucoup à naviguer dans les grands codes.
donc avec le début de la première version du travail de stylisme.
L'implémentation du schéma ressemble à ceci
**************
enAttrName - liste (extensible) d'attributs de l'élément à rendre
enum enAttrName // возможные аттрибутов контрола
{
// шрифт
anFontName, // имя
anFontColor, // цвет
anFontSize, // размер
anFontWeight, // толщина
anFontStyle, // стиль
// фон
anBackgroundColor, // цвет
anBackgroundFill, // заливка
// граница
anBorderColor, // цвет
anBorderWidth, // толщина
// выравнивание
anAlign,
anVAlign
по мере необходимости добавлять нужные аттрибуты
};
cet attribut est stocké dans une classe GAttr
{
enAttrName m_attr; // имя аттрибута
// его значение
long lval;
double dval;
string sval;
};
il ressemble un peu à MqlParam, mais contrairement à lui, il est indépendant du type d'objet.
------
puis les attributs sont regroupés dans une liste GAttrReflect. Cette liste fera référence à un certain état d'une certaine classe.
{
GAttr* m_list[]; // список аттрибутов класса для одного некоторого состояния
};
Une caractéristique importante de cette classe est qu'un attribut ne peut pas être répété deux fois dans m_list. Lorsque vous mettez à jour un attribut, il est écrasé ou un attribut est créé s'il n'existait pas.
-------
Chaque contrôle possède plusieurs de ces listes. Chacun d'entre eux fait référence à un reflet de l'état d'un contrôle. Cette liste de réflexions est extensible.
{
arDefault, // состояние по-умолчанию
arDisable, // недоступен для ввода/неактивный
arTransp, // должен стать прозрачным
arSelect, // выбран
arCheck, // отмечен
arOver, // мышка над объектом
arFocus, // получен фокус ввода
по мере необходимости добавлять новые рефлекты
};
En conséquence, on peut définir des attributs pour chaque commande (classe) pour chacun de ses réflexes.
Une classe - GAttrClass - stocke la liste de réflexion d'une classe particulière.
{
string m_class; // для какого класса составлен список
GAttrReflect reflect[arLast]; // список рефлектов класса
};
-------
Et enfin, la dernière classe, GThema, gère l'ensemble des classes qui existent et sont créées par vous.
{
GAttrClass* m_list[]; // список классов
};
Cette classe utilise le même principe que la liste d'attributs : il ne peut y avoir deux classes portant le même nom dans la liste.
Grâce à la surcharge de l'opérateur[], nous pouvons spécifier de manière pratique les noms des paramètres.
g_thema["GButton"][arOver][anFontColor]=XRGB(255, 255, 255);
// или можно так
GAttrClass* at = g_thema["GButton"];
GAttrReflect* vl = at[arDefault];
vl[anFontColor] = XRGB(255, 255, 255);
---------
Et enfin, voici comment nous obtenons le paramètre d'intérêt du sujet de la classe
1. trouver la m_classe requise dans la liste
2. S'il est trouvé, cherchez un réflexe en lui,
3. s'il est trouvé, alors nous recherchons l'attribut
4. si aucun attribut n'est trouvé, alors nous cherchons un réflexe par défaut et un attribut dans celui-ci
Si l'attribut ne se trouve pas dans le réflecteur par défaut, répétez les étapes 1 à 4 pour le nom de classe par défaut (m_class=NULL), qui est commun à tous les éléments.
---------
l'avantage de cette approche :
- il y a toujours une classe par défaut avec laquelle on peut s'entendre et ne pas en créer de nouvelles.
- vous pouvez utiliser seulement le défaut arDefault au lieu de créer des réflexes
- vous n'avez pas à spécifier de propriétés dans chaque contrôle. Il suffit d'ajouter la classe à GThema et d'en extraire les données.
- tous les attributs qui n'ont pas été spécifiés dans la classe dans le réflecteur sont obtenus hiérarchiquement à partir du réflecteur par défaut ou de la classe par défaut.