//------------------------------------------------------------------ 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; };
enum enAttrReflect // виды состояний - реакция контрола на своё состояние { arDefault, // состояние по-умолчанию arDisable, // недоступен для ввода/неактивный arTransp, // должен стать прозрачным arSelect, // выбран arCheck, // отмечен arOver, // мышка над объектом arFocus, // получен фокус ввода
по мере необходимости добавлять новые рефлекты };
したがって、各コントロール(クラス)に対して、その反射の属性を定義することができる。
GAttrClassという クラスは、特定のクラスのリフレクションリストを保存します。
class GAttrClass { string m_class; // для какого класса составлен список GAttrReflect reflect[arLast]; // список рефлектов класса };
-------
そして最後に、GThemaという クラスが、存在するクラスや作成されたクラスの全体を扱います。
class GThema { GAttrClass* m_list[]; // список классов };
このクラスは、属性リストと同じ原理で、同じ名前のクラスはリスト内に2つ存在することはできません。
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);
Create_resource(文字列 Resource_name)
リソース名 - 変更される頻度、メモリ内のリソース数
文字どおり少数です。いくつのウィンドウを開いているかによって異なります。現在は、1~2ウィンドウずつで作業しています。各ウィンドウには3〜4個のビットマップオブジェクトがあります。約8つのリソースが判明。(減速するほどではないと思うのですが・・・)。
インターフェイスイベントでのWindowsアップデート(現在はクリック時のみ、その他のイベントは無効)。同時に、時間が経ってからではなく、すぐに遅くなるのも特徴です。最初のクリックでさらに、「制動力」と「窓の大きさ」の相関関係も明確にわかりました。ウィンドウを大きくすると、画像の応答が遅くなります。
また、ResourceCreate()はすぐにではなく、ローカル配列に画像を「充填」した後、つまり、すべての色計算と画像配列の初期化 後に到着することに注意してください。これが問題なのだと思います。
最終的な結論を出すために、画像を静的配列またはグローバル配列に格納することにします。インターフェイスイベントが発生したら、ResourceCreate() を送信してすぐにウィンドウを更新します - ローカル配列を初期化したりColorToARGB()を呼び出したりする必要はありません。
この後、スローダウンの効果がなくなった場合、問題は私が説明したとおりです。もしそうでないなら、問題は他のところにあるのです。
明日、確認してみようと思います。体験後、結果について書きます。
をプロファイラで実行してみてください。
ピーター・コノウ(以下、コノウ):なぜ、こんなにたくさんの英単語がコードに含まれているのですか?
純ロシア語に切り替える。
#define пока while
#define Печатать Print
void OnStart()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
ピーター・コノウ(以下、コノウ):なぜ、こんなにたくさんの英単語がコードに含まれているのですか?
純ロシア語に切り替える。
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
それはなおさらです。
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
それはなおさらです。
を追加しました。損失」を「利益」に変更する
など...
#define цлк short // целое короткое
#define цлд long // целое длинное
#define плк float // плавающее короткое
#define пл double // плавающее
#define пст void // пустота
#define исток main
#define вывод Print
#define пока while
пст исток()
{
цл нмр = 0; // сокращение от номер.
пока( нмр < 10 )
{
вывод( "номер = ", нмр, "!" );
нмр ++;
}
}ピーター・コノウ(以下、コノウ):なぜ、こんなにたくさんの英単語がコードに含まれているのですか?
純ロシア語に切り替える。
#define пока while
#define Печатать Print
void OnStart()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
提案は面白いですね、考えてみました。しかし、2つの言語を組み合わせることには利点があります。
プログラムが1つの言語だけで書かれていると(たとえそれが母国語であっても)、単調な文章の中で次第に景色が「艶消し」されてしまうのです。
ロシア語の関数名や変数名と、イベント、プロパティ、定数、演算子などの英語識別子を交互に使うことで、読みやすさに必要なコントラストを実現しています。
ですから、完全にロシア語に切り替えることはありません。しかし、ロシア語はまだ優勢で、大きなコードでのナビゲーションに大いに役立っています。
ということで、スタイリングワークの第一弾がスタートしました。
スキーマの実装は次のようになります。
**************
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の中で属性を2回繰り返すことができないことである。属性を更新すると上書きされ、属性が存在しない場合は作成されます。
-------
各コントロールはこのようなリストを複数持っています。それぞれ、コントロールの状態の反映を参照する。この反省会リストは、拡張可能 です。
{
arDefault, // состояние по-умолчанию
arDisable, // недоступен для ввода/неактивный
arTransp, // должен стать прозрачным
arSelect, // выбран
arCheck, // отмечен
arOver, // мышка над объектом
arFocus, // получен фокус ввода
по мере необходимости добавлять новые рефлекты
};
したがって、各コントロール(クラス)に対して、その反射の属性を定義することができる。
GAttrClassという クラスは、特定のクラスのリフレクションリストを保存します。
{
string m_class; // для какого класса составлен список
GAttrReflect reflect[arLast]; // список рефлектов класса
};
-------
そして最後に、GThemaという クラスが、存在するクラスや作成されたクラスの全体を扱います。
{
GAttrClass* m_list[]; // список классов
};
このクラスは、属性リストと同じ原理で、同じ名前のクラスはリスト内に2つ存在することはできません。
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.デフォルトリフレクタで属性が見つからない場合は、すべての要素に共通するデフォルトのクラス名(m_class=NULL)について、手順1~4を繰り返します。
---------
の利点は、そのアプローチにあります。
- は必ず、仲良くなれるデフォルトのクラスがあり、新しいクラスは作らない。
- リフレックスを作成する代わりに、デフォルトのarDefaultのみを使用することができます。
- を使えば、各コントロールにプロパティを指定する必要はありません。GThemaにクラスを追加して、そこからデータを取得するだけです
- リフレクタのクラスで指定されていないすべての属性は、デフォルトリフレクタまたはデフォルトクラスから階層的に取得されます。