Canvas üzerinde bir kitle kaynaklı proje yapma - sayfa 17

 
o_O :

Create_resource (dize Kaynak_adı

Kaynak_adı - ne sıklıkla değişir? bellekte kaç kaynak var?

Kelimenin tam anlamıyla birkaç. Açık pencerelerin sayısına bağlıdır. Şu anda 1-2 pencere ile aynı anda çalışıyorum. Her pencerede 3 - 4 bitmap nesnesi vardır. Bir yerde 8 kaynak çıkıyor. (Bence yavaşlamak yeterli değil...)

Windows, arayüz olaylarında güncellenir (artık yalnızca tıklamalarda, diğer olaylar devre dışı bırakılır). Aynı zamanda, bir süre sonra değil, hemen yavaşlar. İlk tıklamada. Ek olarak, "fren kuvveti" ile pencerenin boyutu arasındaki ilişki açıkça görülmektedir. Pencere ne kadar büyük olursa, resmin tepkisi o kadar yavaş olur.

Aynı zamanda, ResourceCreate() öğesinin hemen ulaşmadığı, ancak yerel diziyi bir görüntü ile "doldurduktan" sonra, yani tüm renk hesaplamalarından ve görüntü dizisinin başlatılmasından sonra dikkate alınmalıdır. Bence sorun bu.

 

Son bir sonuca varmak için görüntüyü statik veya global bir dizide saklayacağım. Arabirim olaylarında, yerel diziyi başlatmadan ve ColorToARGB() öğesini çağırmadan pencereyi ResourceCreate () öğesine göndererek hemen güncelleyeceğim.

Bundan sonra frenleme etkisi kaybolursa, o zaman bahsettiğim nokta budur. Olmazsa sorun başka yerde...

Bunu yarın kontrol etmeye çalışacağım. Deneyimden sonra sonuçları yayınlayacağım.

 
profil oluşturucu ile çalıştırın.
 
o_O :
profil oluşturucu ile çalıştırın.
Onu yarın yapacağım. TAMAM. )
 

@Peter Konow , kodda neden bu kadar çok İngilizce kelime var?

Saf Rusça'ya geçin:

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

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

@Peter Konow , kodda neden bu kadar çok İngilizce kelime var?

Saf Rusça'ya geçin:

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


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

Yani daha da iyi

 
Igor Volodin :

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


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

Yani daha da iyi

sonraki - #define öğesini '#define' olarak değiştirin

eklendi: 'zararı' 'kar' olarak değiştirin
vb...
 
#define цл    int      // целое
#define цлк   short    // целое короткое
#define цлд   long      // целое длинное
#define плк   float   // плавающее короткое
#define пл    double   // плавающее
#define пст   void      // пустота
#define исток main
#define вывод Print
#define пока  while

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

   }

}
Olması gerektiği gibi aydınlatın ve bence daha da kötü olmayacak.
 
Andrey Khatimlianskii :

@Peter Konow , kodda neden bu kadar çok İngilizce kelime var?

Saf Rusça'ya geçin:

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

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

İlginç bir öneri, düşündüm. Ancak, iki dili birleştirmenin avantajları vardır.

Program sadece bir dilde yazılmışsa (ana dil olsa bile), metnin monotonluğundan dolayı bakış yavaş yavaş "bulanıklaşır".

İşlev ve değişkenlerin Rusça adlarının ve olayların, özelliklerin, sabitlerin ve operatörlerin İngilizce tanımlayıcılarının değişimi, daha iyi okuma için gerekli karşıtlığı yaratır.

Bu nedenle, tamamen Rusça'ya geçmiyorum. Bununla birlikte, Rusça hala hakimdir ve bu, büyük kodlarda gezinmek için çok yardımcı olur.

 

bu yüzden stillerle çalışmanın ilk versiyonunun inisiyatifiyle.

şema uygulaması şöyle görünür

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

enAttrName - işlenen öğenin niteliklerinin bir listesi (genişletilebilir)

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

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


nitelik GAttr sınıfında saklanır

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

MqlParam'a biraz benzer, ancak onun aksine türden bağımsızdır.

------

nitelikler ayrıca GAttrReflect listesinde gruplandırılmıştır. Bu liste, belirli sınıfın belirli durumuna atıfta bulunacaktır.

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

Bu sınıfın çalışmasının önemli bir özelliği, belirli bir niteliğin m_list listesinde iki kez tekrarlanamamasıdır. Güncelleme sırasında özniteliğin değerinin üzerine yazılacak veya öznitelik yoksa oluşturulacaktır.

-------

Her denetimin bu tür birkaç listesi vardır. Her biri, kontrol durumunun yansımasını ifade eder. Bu yansımalar (yansımalar) listesi genişletilebilir .

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

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

Buna göre, her kontrol (sınıf), yansımalarının her biri için tanımlanmış niteliklere sahip olabilir.

Class - GAttrClass - belirli bir sınıfın yansımalarının bir listesini saklar.

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

-------

Ve son olarak, var olan ve sizin oluşturduğunuz tüm sınıfları yöneten son sınıf GThema .

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

Bu sınıfta, nitelikler listesinde olduğu gibi benzer bir ilke uygulanır - listede aynı ada sahip iki sınıf bulunamaz.

Operatör[] aşırı yüklemesi sayesinde, parametre adlarını rahatlıkla belirtebiliriz.

// задаём в классе 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 );

---------

Ve son olarak, sınıf konusundan ilgilenilen parametreyi nasıl alırız?

1. listede gerekli m_class sınıfını arayın
2. Bulunursa, onda bir yansıma ararız,
3. Bulunursa, bir nitelik arıyoruz
4. Öznitelik bulunamazsa, varsayılan yansıtmayı ve içindeki özniteliği arıyoruz.
5. Öznitelik varsayılan yansımada bulunmazsa, tüm öğeler için ortak olan varsayılan sınıf adı (m_class=NULL) için 1-4 arasındaki adımları tekrarlayın.

---------
yaklaşma avantajı:
- her zaman, prensipte vazgeçilebilecek ve yenilerini oluşturamayacak varsayılan bir sınıf vardır.
- yansıma oluşturamazsınız, ancak yalnızca varsayılan arDefault'u kullanabilirsiniz
- her kontrolde özellikleri ayarlamaya gerek yok. GThema'ya bir sınıf eklemek ve ondan veri almak yeterlidir.
- yansıtmada sınıf için ayarlanmayan tüm nitelikler - varsayılan yansıtmadan veya varsayılan sınıftan hiyerarşik olarak elde edilir.