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

 
Nikolai Semko:
几乎完成了GButton类的例子,但要跑路了。我明天会完成它,并提出它。
很好。非常有趣。)
 
Реter Konow:
很好。非常有趣。)


以下是你得到的东西。


该按钮可以显示在背景或前台,有或没有锁存功能。

在示例文件CanvasButton.mq5中,可以用鼠标拖动按钮。要做到这一点,只需按住Ctrl键来移动蓝色按钮,按住Shift键来移动红色按钮。

因为GButton类是CCanvas类 的后裔,这个例子演示了在CircleWu例子上使用CCanvas类的功能的能力(这在OnInit中实现)。因此,可以使用CCanvas类的函数在按钮上写文字。

当然,这门课并不假装是干净的。画面并不完美,3D也很传统;阴影没有实现,执行速度也没有优化。而且很可能有很多粗糙的边缘,缺乏各种检查。因此,不要严厉地评判。

如果你多花一点时间,当然可以做到。


我只是想...你可以说--确定方向。


Canvas.mqh文件与原文件的不同之处在于,m_pixels数组被定义为public。

附加的文件:
GButton.mqh  20 kb
Canvas.mqh  152 kb
 
Nikolai Semko:


下面是我们得到的情况。


该按钮可以显示在后台或前台,可以点击或不锁定。

在示例文件CanvasButton.mq5中,可以用鼠标拖动按钮。要做到这一点,只需按下Ctrl键来移动蓝色按钮,按Shift键来移动红色按钮。

因为GButton类是CCanvas类的后裔,这个例子演示了在CircleWu例子上使用CCanvas类的功能的能力(这在OnInit中实现)。因此,可以使用CCanvas类的函数在按钮上写文字。

当然,这门课并不假装是干净的。画面并不完美,3D也很传统;阴影没有实现,执行速度也没有优化。而且很可能有很多粗糙的边缘,缺乏各种检查。因此,不要过于严厉地评判。

当然,如果你多花一点时间,你可以做到这一点。


我只是想...你可以说--确定方向。


Canvas.mqh文件与原文件的不同之处在于,m_pixels数组被定义为public。

尼古拉,在我看来,它的结果很好。我们已经有了一个良好的开端,可以走得更远。我将这种类型的按钮称为钥匙。如果你有4条清晰的框架线:-顶部,左边的光和右边的,底部-深色的为按下的状态,反之亦然,那就更好了(只需要添加一个浅色的背景,否则黑色背景的图表上的暗线将不可见)。然后你可以设置文字和图片。

总之,不错的尝试。)

 
Реter Konow:

.如果你将框架的4条清晰的线沿边缘划分:--顶部、左侧亮,右侧、底部暗,用于压制状态,反之用于压制状态,效果会更好(你只需要添加一个浅色背景,否则在黑色图形的衬托下,暗线将不可见)。

是的,很明显,你可以随心所欲地画。在这种情况下,我并没有设定要实现一个杰作。但我想改进的第一件事,是生成按钮图像的所有数组(在本例中是两个数组),然后只通过ArrayCopy 复制它们,这样我们就不必每次都创建一个图像。这将大大减少工作,但代价是额外消耗内存,但由于现在16GB内存的电脑上已经很普遍了,如果甚至有很多按钮,额外的内存消耗不太可能超过1-2MB,特别是如果相同的按钮会使用相同的阵列。所以,我不认为这是一个问题。最主要的是速度。
 
Nikolai Semko:
是的,很明显,你可以随心所欲地画。在这种情况下,我没有设定一个目标来实现一个杰作。但我想改进的第一件事,是生成按钮图像的所有数组(在这种情况下是两个数组),然后只通过ArrayCopy复制它们,这样我们就不必每次都创建一个图像。这将大大减少工作,但代价是额外消耗内存,但由于现在16GB内存的电脑上已经很普遍了,如果甚至有很多按钮,额外的内存消耗不可能超过1-2MB,特别是如果相同的按钮会使用相同的阵列。所以,我不认为这是一个问题。最主要的是速度。

我明白了,当我提出关于按钮的问题时,我想知道是否有可能用画布来做这个。


已按下。

已按下。

在这个例子中,框架的每一面都由几条线组成。框架的每一面共有4条渐变线。每条线都有不同的阴影,取决于按钮的状态 和框架的给定形状。如果CCanvas有能力将颜色设置为框架的特定渐变线,那么制作上述例子就很容易了。这正是我想了解的情况。

 
Реter Konow:

我明白了,当我提出关于按钮的问题时,我想知道是否有可能用画布来做这个。


已按下。

已按下。

在这个例子中,框架的每一面都由几条线组成。框架的每一面共有4条渐变线。每条线都有不同的阴影,这取决于按钮的状态 和框架的给定形状。如果CCanvas有能力将颜色设置为框架的特定渐变线,那么制作上述例子就很容易了。这正是我想了解的情况。

我不理解你,彼得。你说的是肉,我说的是骨架。如果你有骨头,你就可以种肉。我的例子中不是有 "Pressed"、"Pressed "这些州吗?你甚至看过GButton类的内部吗?彼得,我的建议是:放下一切,紧急研究OOP。你只是在你的项目中遇到了一个天花板,这被称为臃肿的代码。它很容易被OOP所克服。
有了CCanvas,你可以做任何事情,甚至在MT5窗口内写Windows,当然是在完全的视觉模拟模式下:),因为没有对硬件的访问。

 
Nikolai Semko:
我不理解你,彼得。你说的是肉,我说的是骨架。如果你有骨头,你可以添加肉。我的例子中不是有 "Pressed"、"Pressed "这些州吗?你甚至看过GButton类的内部吗?彼得,我的建议是:放下一切,紧急研究OOP。你刚刚在你的项目中遇到了一个天花板,这就是所谓的臃肿的代码,在OOP的帮助下,它很容易被克服。
有了Canvas,你可以做任何事情,甚至可以在MT5窗口内书写Windows。

)))那么,我为什么要发起这个话题呢?) 我现在要学习OOP。

你的例子有按钮、点击事件和这些按钮的状态。一切都很好。但是尼古拉,我还是不明白我在问什么--CCcanvas类中是否有一个选项可以为框架的渐变线设置特定的颜色?看了你的例子,你可能认为有...如果是这样,你能画出与我的例子类似的东西吗?我感兴趣的是使用这个类的功能进行绘画的便利性和可能性,而你说的是速度和对这个类的功能的改进。这是一个稍微不同的话题。

 
Реter Konow:

)))那么,我为什么要发起这个话题呢?)我现在要去学习OOP。

学习OOP最好从简单的东西开始,而不是从Canvas开始。
 
Vasiliy Sokolov:
最好从比Canvas更简单的东西开始学习OOP。
你是对的。也许我最好从一本教科书开始。真的,OOP是一个复杂的东西。这很令人困惑...
 
Nikolai Semko:
你甚至看过GButton类的内部吗?


我看了看班里的同学。它看起来很酷,但我不明白CCanvas类的 整个机制。这就是为什么我在那里没有看到我的问题的答案。