文章 "图形界面 XI: 渲染控件 (统合构建14.2)" - 页 2

 
Artyom Trishkin:

同时还有一个问题:在具有一定透明度的窗口背景上绘制文本标签(CTextLabel)时,标签是在不透明的背景上绘制的,这对 Alpha() 方法没有影响,而且看起来不太好......是否有可能使标签的背景也具有透明度?

文章中说

"该版本中的透明度仅适用于背景填充和框架。文本和图像在任何设定的 alpha 通道值下都将保持完全不透明和清晰"。

 
Artyom Trishkin:

你好。Tol,我在示例中没有找到如何在窗口中绘制分界线。

索引 是什么意思?

应该传递什么索引参数?

同时还有一个问题:在具有一定透明度的窗口背景上绘制文本标签(CTextLabel)时,标签是在不透明的背景上绘制的,而不透明的背景对 Alpha() 方法没有反应,这看起来不太好 ....。是否有可能使标签的背景也具有透明度?


带有索引的参数不应该存在。我忘了删除它。现在您可以在这里传递任何值。我将在下次更新时删除该参数。

例如

//+------------------------------------------------------------------+
//| 创建分界线|
//+------------------------------------------------------------------+
bool CProgram::CreateSepLine1(const int x_gap,const int y_gap)
  {
//--- 保存窗口指针
   m_sep_line1.MainPointer(m_window);
//--- 尺寸
   int x_size=2;
   int y_size=72;
//--- 属性
   m_sep_line1.DarkColor(C'150,150,150');
   m_sep_line1.LightColor(clrWhite);
   m_sep_line1.TypeSepLine(V_SEP_LINE);
//--- 创建一个元素
   if(!m_sep_line1.CreateSeparateLine(0,x_gap,y_gap,x_size,y_size))
      return(false);
//--- 添加指向基本元素的指针
   CWndContainer::AddToElementsArray(0,m_sep_line1);
   return(true);
  }

//---

Artyom Trishkin:

...

同时还有一个问题:在具有一定透明度的窗口背景上绘制文本标签(CTextLabel)时,标签是绘制在自己不透明的背景上的,这对 Alpha() 方法没有任何反应,而且看起来不太好 ....。有没有可能让标签的背景也具有透明度?

现在可以手动设置每个元素的透明度。在下面的示例中,窗口背景设置为 alpha 通道200文本标签的背景设置为0

//---

示例

//+------------------------------------------------------------------+
//|| 创建文本标签 1|
//+------------------------------------------------------------------+
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp"
//---
bool CProgram::CreateTextLabel(const int x_gap,const int y_gap,string text)
  {
//--- 保存指向主元素的指针
   m_text_label.MainPointer(m_window);
//--- 属性
   m_text_label.Alpha(0);
   m_text_label.XSize(190);
   m_text_label.YSize(20);
   m_text_label.LabelXGap(21);
   m_text_label.LabelYGap(3);
   m_text_label.IconFile("Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp");
//--- 创建一个元素
   if(!m_text_label.CreateTextLabel(text,x_gap,y_gap))
      return(false);
//--- 添加指向基本元素的指针
   CWndContainer::AddToElementsArray(0,m_text_label);
   return(true);
  }
 
Oleksii Chepurnyi:

摘自文章:

"该版本中的透明度仅适用于背景填充和边框。文本和图像在任何 alpha 通道设置下都将保持完全不透明和清晰"。

这是针对库中所有项目的规则。也就是说,每个项目都可以单独设置 alpha 通道。
 
Anatoli Kazharski:
这是针对库中所有项目的规则。也就是说,每个项目的 alpha 通道都可以单独设置。

感谢您的解释。还有一个问题:

返回对象的坐标是在什么坐标系下?

例如,如果我取按钮 m_button_text.X2() 右边缘的坐标,那么按钮的坐标是以什么坐标系返回的?窗体窗口还是图表窗口?

我的问题是:我正在窗体窗口中创建对象。如果按钮一个接一个连续出现,我会将第二个按钮的 X() 坐标当作第一个按钮的 X2()+2 坐标。第三个按钮的 X() 坐标是第二个按钮的 X2()+2 坐标,以此类推......。

只要面板位于符号图表的 0 坐标处,一切都没问题。如果向右移动并切换 TF,按钮就会向右移动。窗口窗体离图表左边缘越远,按钮之间的距离就越大。

如何设置每个按钮的坐标,使其在将窗体窗口移动到新位置并切换 TF 时不会在屏幕上移动?

 
Artyom Trishkin:

谢谢您的解释。还有一个问题:

...

返回的是绝对坐标。我需要将它们转换为相对坐标。相对于要创建的元素所连接的元素。

如果主元素是一个表单,那么

...
   int x=(m_button1.X2()+5)-m_window.X();
   if(!CreateButton2(x,50,"Button 2"))
      return(false);
...

//---


 
Anatoli Kazharski:

返回的是绝对坐标。必须将它们转换为相对坐标。相对于要创建的元素所连接的元素。

如果主元素是一个表单,那么

//---


谢谢。奇怪,我也试过这样做--在更改 tf 时,按钮会移动到图表窗口的左边缘。我再仔细试试。
 
Anatoli Kazharski:

返回的是绝对坐标。必须将它们转换为相对坐标。相对于要创建的元素所连接的元素。

如果主元素是一个表单,那么

//---


奇怪的是当我将该方法计算出的坐标传入对象构建 方法时,一切正常....。

int x=(m_button1.X2()+5)-m_window.X();

但如果我只将计算出的坐标传递给该方法,那么.....:

int x=m_button1.X2()+5;

...然后在该方法中立即从传递的坐标中减去m_window.X() 的值,一切都会浮动....但是在哪里减去有什么区别吗?是立即减,还是已经在构建方法中减....。

也许我吃错了东西,但我不明白为什么会这样?

 

如果在 TestLibrary14 的 Program.mqh 中写入一行内容--更改窗口标题颜色

//+------------------------------------------------------------------+
//|| 创建程序的图形用户界面
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- 创建面板
   if(!CreateWindow("EXPERT PANEL"))
      return(false);
   m_window.CaptionColor(clrDimGray);
   

那么最小化窗口后,颜色将返回默认值。而工具提示、最小化/取消修改和关闭按钮则会以程序设置的窗口标题颜色重新绘制。只有当光标悬停在上面时,这些按钮的颜色才会变为默认颜色。

顺便问一下,这些按钮的背景是否可以是透明的?例如,窗口标题是灰色的,但按钮是蓝色的....

 

Tol,你可以在本系列的哪篇文章中读到有关 CKeys 的信息?

有时在输入框中输入数字时,会输入数字键+Shift 键上的字符。例如,我输入 2,但 @ 会被输入 ....。

在某些情况下--我不知道是哪种情况(可能取决于窗体窗口中控件的数量和类型),按下 Backspace 键会导致控件从窗体窗口中删除,删除顺序与添加顺序相反。我不明白为什么光标在输入栏时,按 Backspace 键不是作为输入栏的控制字符,而是作为删除窗体窗口上控件的命令。例如:我启动程序并开始按 Backspace 键,每次按 Backspace 键都会删除所有控件,从最后添加的控件开始。最后,已经清空的窗口窗体也会被删除。

是否有可能在光标不在输入框时禁用对 Backspace 的反应?

 
Artyom Trishkin:

...

顺便问一下,有没有可能让这些按钮的背景变成透明的?例如,窗口标题是灰色的,但按钮是蓝色的....。

使用方法获取 复合元素的指针。同样的规则适用于所有元素。