在Canvas上做一个众包项目 - 页 17

 
o_O:

Create_resource(string Resource_name

Resource_name - 它的变化频率是多少? 内存中有多少资源?

从字面上看,是少数。取决于有多少个窗口是开放的。目前,我每次都是在1或2个窗口工作。每个窗口有3-4个位图对象。结果发现大约有8个资源。(我认为这还不够,要放慢速度......)

对界面事件进行Windows更新(现在只对点击进行更新,其他事件禁用)。同时,它的速度会立即减慢,而不是在一段时间后。在第一次点击时。此外,我可以清楚地看到 "制动力 "和窗户尺寸之间的联系。窗口越大,图像的反应就越慢。

还要注意,ResourceCreate()不是立即到达,而是在用图像 "填充 "本地数组之后,即在所有颜色计算和图像数组的初始化 之后。我认为这就是问题所在。

 

为了做出最后的结论,我将把图像存储在一个静态或全局数组中。在接口事件中,我将通过发送ResourceCreate() 来立即更新窗口--不需要初始化本地数组和调用ColorToARGB()。

如果在这之后,减速效果消失了--那么问题就是我所描述的那样。如果不是--那么问题就出在其他方面。

明天我将尝试检查它。经验之后,我将写下结果。

 
剖析器 运行。
 
o_O:
用分析器运行它。
我明天就去做。好的。)
 

@Peter Konow,为什么代码里有这么多英文单词?

改用纯俄语。

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

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

@Peter 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改为'#define'。

补充说。将 "损失 "改为 "利润
等...
 
#define цл    int     // целое
#define цлк   short   // целое короткое
#define цлд   long    // целое длинное
#define плк   float   // плавающее короткое
#define пл    double  // плавающее
#define пст   void    // пустота
#define исток main
#define вывод Print
#define пока  while

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

   }

}
在我看来,适当地点燃它,那么它就不会更糟。
 
Andrey Khatimlianskii:

@Peter 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中并复制
- 反映器中的类中没有指定的所有属性都从默认反映器或默认类中分层获得。