程序库: 用于创建图形界面的 EasyAndFastGUI 开发库 - 页 14

 

你好

//+------------------------------------------------------------------+
//| 创建画布用于绘制元素
//+------------------------------------------------------------------+
bool CElement::CreateCanvas(const string name,const int x,const int y,
                            const int x_size,const int y_size,ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_ARGB_NORMALIZE)
  {
//--- 尺寸调整
   int xsize =(x_size<1)? 50 : x_size;
   int ysize =(y_size<1)? 20 : y_size;
//--- 重置上次错误
   ::ResetLastError();
//--- 创建对象
   if(!m_canvas.CreateBitmapLabel(m_chart_id,m_subwin,name,x,y,xsize,ysize,clr_format))
     {
      ::Print(__FUNCTION__," > 创建画布绘制项目失败 (""+m_class_name+"): ",::GetLastError());
      return(false);
     }
//--- 重置上次错误
   ::ResetLastError();
//--- 获取指向基类的指针
   if(!m_canvas.Attach(m_chart_id,name,clr_format))
     {
      ::Print(__FUNCTION__," > 未将绘图画布附加到图表:",::GetLastError());
      return(false);
     }
//--- 属性
   ::ObjectSetString(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TOOLTIP,"\n");
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_CORNER,m_corner);
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_SELECTABLE,false);
//--- 除表单外,所有元素的优先级都高于主元素
   Z_Order((dynamic_cast<CWindow*>(&this)!=NULL)? 0 : m_main.Z_Order()+1);
//--- 坐标
   m_canvas.X(x);
   m_canvas.Y(y);
//--- 尺寸
   m_canvas.XSize(x_size);
   m_canvas.YSize(y_size);
//--- 从终点开始缩进
   m_canvas.XGap(CalculateXGap(x));
   m_canvas.YGap(CalculateYGap(y));
   return(true);
  }

CreateBitmapLabel -创建图形资源

附加 - 读取同一资源并再次写入同一资源。

还是我理解错了?

 

又见面了 :)

class CMouse
  {

...............

   //--- (1) 返回光标所在窗口的编号,(2) X 坐标对应的时间、 
   // (3) 与 Y 坐标相对应的水平(价格
   int               SubWindowNumber(void) const { return(m_subwin);                        }
   datetime          Time(void)            const { return(m_time);                          }
   double            Level(void)           const { return(m_level);                         }

时间和电平在哪里使用?到处都找不到...

SubWindowNumber 用来做什么?

我想说的是,每次移动鼠标都要执行ChartXYToTimePrice 操作,成本很高...

 
Oleksii Chepurnyi:

都在评论里了。没什么好补充的。

 
Anatoli Kazharski:

都在评论里了。没有什么需要补充的。

如果您指的是代码中的注释,那么一切都很清楚,但这不是问题所在 :)

 
Oleksii Chepurnyi:

...

我想说的是,每次移动鼠标都要执行 ChartXYToTimePrice 操作,成本很高...

如果图形用户界面不在主窗口中,要获得相对坐标。

 
Anatoli Kazharski:

在图形用户界面不在主窗口中时获取相对坐标。

那么也许只有当图形用户界面不在主窗口中时才能计算?:)


我更感兴趣的是为什么要附加?据我所知,它重复了 CreateBitmapLabel 的操作

 
Oleksii Chepurnyi:
所以,也许只有当图形用户界面不在主窗口中时才能计算?:)

当图形用户界面主窗口位于图表的子窗口中,而对话框位于主窗口中时,也会出现不同的情况。

我更感兴趣的是为什么要 "附加"?据我所知,它重复了 CreateBitmapLabel 的操作。

有一个CCanvas::Attach() 方法的代码:

//+------------------------------------------------------------------+
//| 使用位图资源附加新对象
//+------------------------------------------------------------------+
bool CCanvas::Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA)
  {
   if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE))
     {
      string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE);
      rcname=StringSubstr(rcname,StringFind(rcname,"::"));
      if(ResourceReadImage(rcname,m_pixels,m_width,m_height))
        {
         m_chart_id=chart_id;
         m_objname=objname;
         m_rcname=rcname;
         m_format=clrfmt;
         m_objtype=OBJ_BITMAP_LABEL;
         //--- 成功
         return(true);
        }
     }
//--- 失败
   return(false);
  }
 
Anatoli Kazharski:


这里有CCanvas::Attach() 方法的代码:

是的,还有 CreateBitmapLabel 上面的代码。我一直在研究它们。据我所知,CreateBitmapLabel 会创建一个空资源,而 Attach 会读取资源(任意)并将其写入 m_pixels。就像我上面写的,我们创建一个 名称为 name 的资源(CreateBitmapLabel),然后读取相同的资源(Attach),并再次将读取的内容写入相同的 m_pixels。

还是我理解错了?

PS 在没有 Attach 的情况下,实验结果一切正常:)

 
Oleksii Chepurnyi:

...

PS 在没有 Attach 的情况下,一切正常:)

真的吗?那么又有一些变化了。以前肯定有什么地方不正常。

从图表中删除图形用户界面后,对象会被删除吗?

 
Anatoli Kazharski:

真的吗?又有变化了之前肯定是有什么地方出了问题。

从图形中删除图形用户界面后,对象会被删除吗?

一切看起来都很干净)

附加的文件:
35.png  11 kb
36.png  6 kb