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

 
Anatoli Kazharski:

ElementSet,你必须指定(1)属性和值或(2)属性、修改器和值。

是的,在访问控制属性方面,它是通用的。

一般来说,PropGet/Set是一个很好的机制,当继承的接口最初是未知的时候,可以处理模板类。


但我想把讨论带回到我最初的问题上--如何为程序员做一个关于控件颜色方案的 "快速入门"?

还有,是否可以不实现一个功能性的(SetBgColor或SetProp(Enum_Color, )等),而是实现一个更通用的属性类。
这样,所有的控制器都会访问一个通用的属性类,编码人员可以很容易地了解哪个控制器使用了哪种颜色。

但这一切是我关于我的计划的推理。我不排除当我开始过渡时,它仍然会有很大的变化。所以我上面写的一切可能不再与这里讨论的话题有关。)

你需要把它发展到令人满意的结果 ),越多的编码员会理解它,你的功能类的进入门槛也会越低。
 
o_O:

原则上我同意,它将清楚地表明它有什么颜色,什么可以改变。

那么是否有一个问题--Theme是否意味着未使用参数的冗余?

是的,它是多余的,对于所有的变体。但这样一来,通过重新绘制和改变前一个主题中的数值来创建一个新的主题就很方便。就像Windows中的主题。

P.S.

而且我对编码员大规模改变一些与当前主题中使用的不同的数值持怀疑态度。这让我想起了一个 Delphi项目,在这个项目中,你试图做的第一件事就是把界面涂成你自己的颜色,随后在改变系统主题时也没有改变。

而且为什么要把设计风格涂抹在某个地方?从一个现有的主题中继承一个主题类,只重做其中需要改变的值。

 

有这种CSS 技术

1)已知的和有据可查的

2)熟悉和多才多艺

3)标签===控制原则上,这使得它适合我们的任务


试试吧,它应该能按预期工作。

 
o_O:

有一种CSS 技术


然后直接进入LESS/SCSS(SASS)。
 
Igor Volodin:

然后直接进入LESS/SCSS(SASS)。

呃,Lass可能是好的,但我们不需要它的功能。我们不是在做一个解释器。

我们纯粹采取的是以级联^选^点的方式建立和重新定义风格的原则--他们的做法。

 

而且一定要包括一个针对不同分辨率的响应式设计选项。见CSS中的媒体查询

而且有些部分的尺寸可能是固定的,而其他部分则可能尽可能地伸展。

 

亲爱的论坛成员,我并不想打击任何人的积极性,但在我看来,所讨论的技术非常复杂,无法通过分散的联合努力来实现。我们无法将这些努力有效地结合起来,因为我们的理解水平、专业性和方法都不一样......。我们也被距离,甚至国家所分隔。

我的结论是,这项技术可以由一个长期努力工作的开发人员来实现。也许超过了一年。但这个人不太可能将这项技术众包出去,因为他付出了太多的努力,太多的灵魂,根本就把自己累死在这项工作上了......这是他的项目,他有权利不免费分发。(也许在开始时,但并不总是如此)。

我认为这项技术已经在MQL中实现了。

P.S. 虽然,即使是这样--为什么不尝试再次实施呢?))

 
Igor Volodin:

为什么它可能是有用的。

1.位图上的界面是快速的。速度之快,几乎与系统界面无异。例如,我实现了带有梯度的半透明元素,即使它们移动,也能顺利渲染,没有任何可见的延迟,考虑到其他带有半透明梯度的对象上的颜色混合和alpha通道计算。

2.该接口是可扩展的。你可以使应用程序更加复杂,它不会因为删除和创建大量的图对象而变慢。重新绘制的成本是最低的,它只是替换了一张图片,以千分之一秒为单位。

3.你可以创建现成的控件,并提供创建新控件的能力,因为你可以提供你自己的事件池,比如说。

OnMouseDown - 按住LKM

OnMouseUp - 按下了鼠标按钮

OnMouseHoverOn - 将鼠标光标悬停在一个物体上。

OnMouseHoverOut - 将鼠标指针从对象上移开

OnMouseClick - 在对象边界内按下并点击。

OnMouseDblClick - 鼠标在对象的边界内双击。

OnDragStart - 在按下鼠标左键开始移动时发生一次事件。

OnDragMove - 用鼠标左键移动时产生的事件

OnDragEnd - 使用LKM移动后产生的事件

OnPut - 对象被投向另一个对象

OnGet - 对象被转储为另一个对象

OnFocus - 对象获得焦点

OnBlur - 对象失去焦点

OnResize - 对象的尺寸已经改变

OnParentResize - 父对象已经改变了尺寸

OnKeyPress - 一个键被按下

OnChange - 一个字段的值改变了

等。

你在下文中有点夸大其词了。

绘制位图的速度取决于其大小。如果你在重绘部件时重绘代表窗口的整个位图,响应会很慢(已验证)。明显的解决方案是只对位图的区域进行重绘。

然而,为了只重绘代表一个窗口的部分位图图案,你需要在内存中(在一个数组中)存储位图的数字掩码。接下来,你需要在这个掩码内进行导航,并在其中找到所需的图案。然而,要考虑到可能有许多窗口。现在评估存储所有窗口的掩码所需的内存量。你可以想出一个优先系统来选择哪些窗口要记住,哪些要 "忘记",以及什么时候。然而,这并不是一件容易的事。

你必须明白,重绘是重写数组中的数值,如果你需要重写1000000个数值(窗口图像和位图中像素的大致数量),那就不是 "千分之一秒",而是秒。因此,你应该只画一次完整的窗口,将其保存在内存中,然后在事件发生时,分别重画每个对象。那么速度就会非常高。

显然,你只实现了单独的对象,但请尝试创建一个窗口并在那里实现其元素的交互性。 你会明白我的意思。

至于你引用的事件,它们在程序中的实现与绘制控件 的技术无关,应该存在于任何界面中。

 
Реter Konow:

...

显然,你只实现了单个对象,但是试着创建一个窗口并在那里实现你的元素的交互性。 你会明白我的意思。

...

从这个帖子(链接)阅读,也看看那里的gif 动画的例子。
Обсуждение статьи "Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1)"
Обсуждение статьи "Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1)"
  • www.mql5.com
Включение в проект классов для хранения указателей и обработки событий.
 
Реter Konow:

你稍微夸大了以下内容。

位图的绘制速度取决于其大小。如果你对代表一个窗口的整个位图进行重绘,反应会很慢(经过测试)。显而易见的解决方案是只对部件的区域进行重新喷漆。

然而,要想只重绘代表一个窗口的位图画的一部分,你需要有一个存储在内存中的该位图的数字掩码(在一个数组中)。接下来,你需要在这个面具内进行导航,并在其中找到你想要的部分。然而,要考虑到可能有许多窗口。现在评估存储所有窗口的掩码所需的内存量。你可以想出一个优先系统来选择哪些窗口要记住,哪些要 "忘记",以及什么时候。然而,这并不是一件容易的事。

你必须明白,重绘是重写一个数组中的值,如果你想重写1000000个值(窗口图像和位图中的像素的大致数量),那将是几秒钟,而不是 "千分之一秒"。因此,你应该只画一次完整的窗口,将其保存在内存中,然后在事件发生时,分别重画每个对象。那么速度就会非常高。

你可能只实现了单个对象,但你可以试着创建一个窗口并在那里实现你的元素的交互性。 你会明白我在说什么。

至于你引用的事件,它们在程序中的实现与绘制控件的技术无关,必须在任何界面中出现。

我想做一个小小的澄清。

首先,我们创建一个包含所有元素的窗口的数字蒙版。然后我们用ResourceCreate()创建一个位图。我们在图表上得到了我们的窗口。

然后,我们把鼠标移到这个窗口的界面上,并捕捉,例如,指向事件(_Object_Pointed)

我将描述两种实现对象交互性的方法--一种不好,另一种更好。

1.如果我们的窗口的数字掩码在第一次创建后没有 保存在数组中,那么为了改变该窗口的任何细节,我们需要完全重新创建它。也就是说,你必须对它进行重新数字化。这本身就需要时间,因为你需要用所有窗口图案的像素颜色值来初始化数组,以便将其传递给ResourceCreate()。窗口越大,包含的细节越多,需要的时间就越长(大约250毫秒到2秒)。就这样,在每个元素的每个事件上。这个选项的缺陷太大。

2.如果数字掩码已经存储在一个数组中,我们只需要重新初始化那些与该窗口的特定部分有关的值。我们在数组中找到这部分,并重写其值。接下来,--我们将数组发送到ResourceCreate(),并立即得到结果。

这实际上是整个技术。几乎如此))