Discusión sobre el artículo "Cómo hacer el gráfico más interesante: Adicionando un fondo de pantalla"
De fato, aconteceu algo envolvendo as atualizações do MT5, que transformaram o Wallpaper em algo diferente do esperado e mostrado no artigo, já que o correto que ele seja exibido no FUNDO GRÁFICO, pois na classe C_WallPaper você encontrará a seguinte linha:
ObjectSetInteger (Terminal.Get_ID(), szName, OBJPROP_BACK , true );
Isso informa que o objeto terá que ficar no fundo, mais estranhamente, ele está vindo para a frente, por conta disto o OBJETO que recebe ou BitMap começa a receber os cliques, uma solução seria aumentar o Status de todos os objetos, ou tentar baixar o status do Bitmap, no caso esta segunda seria mais simples, isto seria conseguido alterando valor da propriedade OBJPROP_ZORDER no objeto que recebe o Wallpaper, Tentei as duas soluções, mas não consegui estabilizar a coisa toda de forma a corrigir o problema, portanto, e INFELIZMENTE, o papel de parede deve ser descartado por hora ... Se você prestar atenção, irá que a imagem do bitmap estará sendo plotada no corpo dos candles, indicando que o objeto bitmap esta em primeiro plano, novamente isto não é o comportamento esperado por conta da linha de código acima, por conta disto é que ele passa a receber todo e qualquer evento de clique ... 🙁
//+------------------------------------------------------------------+ //| SelectFile.mqh | //+------------------------------------------------------------------+ #include <Controls\Dialog.mqh> #include <Controls\Button.mqh> #include <Controls\Edit.mqh> #include <Controls\ListView.mqh> #include <Controls\CheckGroup.mqh> //+------------------------------------------------------------------+ //| defines | //+------------------------------------------------------------------+ #define INDENT_LEFT (4) // indent from left #define INDENT_TOP (4) // indent from top #define INDENT_RIGHT (4) // indent from right #define BUTTON_WIDTH (60) // size by X coordinate #define BUTTON_HEIGHT (20) // size by Y coordinate #define EDIT_HEIGHT (20) // size by Y coordinate #define COMMON_WIDTH (90) // size by X coordinate //+------------------------------------------------------------------+ //| Class CSelectFile | //+------------------------------------------------------------------+ class CSelectFile : public CDialog { CEdit m_filename; CButton m_button_ok; CButton m_button_cancel; CListView m_filelist; CCheckGroup m_common; string m_instance_id, m_files[], m_folders[], m_prevfolder, m_cfolder, m_fullname; int m_numberfiles, m_numberfolders, m_totalfiles, m_fileflag, m_pressbutton; protected: CChart m_chart; public: CSelectFile(void); ~CSelectFile(void); virtual bool Create(const long chart,const string name,const int x1,const int y1,const int x2,const int y2); int ChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam); string Filename(){ m_pressbutton=0; return(m_fullname);} int FileFlag(){ return(m_fileflag);} protected: void OnClickButtonOK(void); void OnClickButtonCancel(void); virtual void OnClickButtonClose(void); void OnChangeList(void); void OnCheckCommon(void); void SetFolder(string m_fol=""); }; //+------------------------------------------------------------------+ CSelectFile::CSelectFile(void) { m_instance_id=IntegerToString(rand(),5,'0'); m_fileflag=0; m_pressbutton=0; m_fullname=""; m_cfolder=""; m_prevfolder=""; m_numberfiles=0; m_numberfolders=0; } //+------------------------------------------------------------------+ CSelectFile::~CSelectFile(void) { ArrayFree(m_folders); ArrayFree(m_files); m_chart.Detach(); CDialog::Destroy(); } //+------------------------------------------------------------------+ bool CSelectFile::Create(const long chart,const string name,const int x1,const int y1,const int x2,const int y2) { if(x2-x1<280 || y2-y1<200) return(false); m_chart_id=chart; m_name=name; m_subwin=0; //--- initialize chart object m_chart.Attach(chart); //--- specify object and mouse events if(!m_chart.EventObjectCreate() || !m_chart.EventObjectDelete() || !m_chart.EventMouseMove()) { Print("CSelectFile: object events specify error"); m_chart.Detach(); return(false); } //--- call method of the parent class if(!CDialog::Create(m_chart.ChartId(),m_instance_id,m_subwin,x1,y1,x2,y2)) { Print("CSelectFile: expert dialog create error"); m_chart.Detach(); return(false); } Caption(name); //--- create dependent controls //--- create list of files int _x1=INDENT_LEFT; int _y1=INDENT_TOP; int _x2=ClientAreaWidth()-INDENT_RIGHT; int _y2=_y1+(ClientAreaHeight()-INDENT_TOP*5-EDIT_HEIGHT*2); if(!m_filelist.Create(m_chart_id,m_name+"FileList",m_subwin,_x1,_y1,_x2,_y2)) return(false); if(!Add(m_filelist)) return(false); m_prevfolder=""; m_cfolder=""; SetFolder(m_cfolder); //--- create field of filename _x1=INDENT_LEFT; _y1=INDENT_TOP+_y2; _x2=ClientAreaWidth()-INDENT_RIGHT; _y2=_y1+EDIT_HEIGHT+INDENT_TOP; if(!m_filename.Create(m_chart_id,m_name+"Filename",m_subwin,_x1,_y1,_x2,_y2)) return(false); if(!Add(m_filename)) return(false); //--- create common check _x1=INDENT_LEFT; _y1=INDENT_TOP+_y2; _x2=_x1+COMMON_WIDTH; _y2=_y1+EDIT_HEIGHT; if(!m_common.Create(m_chart_id,m_name+"Common",m_subwin,_x1,_y1,_x2,_y2)) return(false); if(!Add(m_common)) return(false); if(!m_common.AddItem("Common",1)) return(false); //--- create button Cancel _x1=ClientAreaWidth()-INDENT_RIGHT-BUTTON_WIDTH; _x2=_x1+BUTTON_WIDTH; _y2=_y1+BUTTON_HEIGHT; if(!m_button_cancel.Create(m_chart_id,m_name+"Cancel",m_subwin,_x1,_y1,_x2,_y2)) return(false); if(!m_button_cancel.Text("Cancel")) return(false); if(!Add(m_button_cancel)) return(false); //--- create button OK _x1=_x1-INDENT_RIGHT-BUTTON_WIDTH; _x2=_x1+BUTTON_WIDTH; if(!m_button_ok.Create(m_chart_id,m_name+"OK",m_subwin,_x1,_y1,_x2,_y2)) return(false); if(!m_button_ok.Text("OK")) return(false); if(!Add(m_button_ok)) return(false); //---- m_pressbutton=0; m_fullname=""; m_chart.Redraw(); //---- if(Id(m_subwin*CONTROLS_MAXIMUM_ID)>CONTROLS_MAXIMUM_ID) { Print("CSelectFile: too many objects"); return(false); } return(true); } //+------------------------------------------------------------------+ //| Event handler | //+------------------------------------------------------------------+ int CSelectFile::ChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { if(id==(ON_CLICK+CHARTEVENT_CUSTOM) && lparam==m_button_ok.Id()) OnClickButtonOK(); else if(id==(ON_CLICK+CHARTEVENT_CUSTOM) && lparam==m_button_cancel.Id()) OnClickButtonCancel(); else if(id==(ON_CHANGE+CHARTEVENT_CUSTOM) && lparam==m_filelist.Id()) OnChangeList(); else if(id==(ON_CHANGE+CHARTEVENT_CUSTOM) && lparam==m_common.Id()) OnCheckCommon(); else if(!CDialog::OnEvent(id,lparam,dparam,sparam)) return(0); m_chart.Redraw(); return(m_pressbutton); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CSelectFile::OnClickButtonOK(void) { m_fullname=m_filename.Text(); StringTrimLeft(m_fullname); StringTrimRight(m_fullname); if(StringLen(m_fullname)>0) { m_fullname=m_cfolder+m_fullname; m_pressbutton=1; } } //+------------------------------------------------------------------+ void CSelectFile::OnClickButtonCancel(void) { m_pressbutton=-1; m_fullname=""; } //+------------------------------------------------------------------+ void CSelectFile::OnClickButtonClose(void) { OnClickButtonCancel(); } //+------------------------------------------------------------------+ void CSelectFile::OnChangeList(void) { int i=(int)m_filelist.Value(); if(i<0) return; else if(i==0) { string s; if(m_cfolder==m_prevfolder || s==m_prevfolder) { m_cfolder=""; m_prevfolder=m_cfolder; SetFolder(m_cfolder); } else { s="\\"+m_prevfolder; StringReplace(m_cfolder,s,"\\"); m_prevfolder=m_cfolder; if(m_cfolder=="\\") m_cfolder=""; SetFolder(m_cfolder+"\\"); } m_filename.Text(""); } else if(i<m_numberfolders) { m_prevfolder=m_folders[i]; m_cfolder+=m_prevfolder; SetFolder(m_cfolder+"\\"); m_filename.Text(""); } else m_filename.Text(m_filelist.Select()); } //+------------------------------------------------------------------+ void CSelectFile::OnCheckCommon(void) { m_fileflag=m_common.Value()>0?FILE_COMMON:0; if(m_fileflag==0) { m_prevfolder=""; m_cfolder=""; SetFolder(m_cfolder); m_filename.Text(""); } else { m_prevfolder=""; m_cfolder=""; SetFolder(m_cfolder); m_filename.Text(""); } } //+------------------------------------------------------------------+ void CSelectFile::SetFolder(string fol="") { string fl,ff,fld=fol; StringReplace(fld,"\\\\","\\"); int i; m_filelist.Select(0); m_filelist.ItemsClear(); ArrayResize(m_folders,1); ArrayResize(m_files,1); if(fld=="Files\\") fl=""; else fl=fld; //---folders long hfind=FileFindFirst(fl+"*",ff,m_fileflag); if(hfind==INVALID_HANDLE) {//empty folder m_numberfiles=0; m_numberfolders=1; m_folders[0]="Files\\"+fld; m_filelist.ItemAdd(m_folders[0]); m_totalfiles=0; } else { m_numberfiles=0; m_numberfolders=0; do { if(StringFind(ff,"\\")>1) m_numberfolders++; m_numberfiles++; } while(FileFindNext(hfind,ff)); FileFindClose(hfind); ArrayResize(m_folders,m_numberfolders+1); hfind=FileFindFirst(fl+"*",ff,m_fileflag); if(hfind==INVALID_HANDLE) return; m_numberfolders=1; do { if(StringFind(ff,"\\")>1){ m_folders[m_numberfolders]=ff; m_numberfolders++;} } while(FileFindNext(hfind,ff)); FileFindClose(hfind); if(fld=="") { m_folders[0]="Files\\"; ff=""; } else { m_folders[0]=fld; ff="Files\\"; } m_filelist.ItemAdd(ff+m_folders[0]); int nn=m_numberfolders; for(i=1; i<nn; i++) m_filelist.ItemAdd(m_folders[i]); //---files hfind=FileFindFirst(fl+"*.*",ff,m_fileflag); m_numberfiles=0; do { if(StringFind(ff,"\\")<0) m_numberfiles++; } while(FileFindNext(hfind,ff)); FileFindClose(hfind); if(m_numberfiles>0) { ArrayResize(m_files,m_numberfiles); m_numberfiles=0; hfind=FileFindFirst(fl+"*.*",ff,m_fileflag); if(hfind!=INVALID_HANDLE) { do { if(StringFind(ff,"\\")<0) { m_files[m_numberfiles]=ff; m_numberfiles++;} } while(FileFindNext(hfind,ff)); FileFindClose(hfind); } for(i=0; i<m_numberfiles; i++) m_filelist.ItemAdd(m_files[i]); } m_totalfiles=m_numberfiles+m_numberfolders+1; } } //+------------------------------------------------------------------+
//+------------------------------------------------------------------+ //| Test_SelectFile.mq5 | //+------------------------------------------------------------------+ #include <class_SelectFile.mqh> //+------------------------------------------------------------------+ CSelectFile *SelectFile=NULL; //+------------------------------------------------------------------+ int OnInit() { SelectFile=new CSelectFile(); if(!SelectFile.Create(0,"Select a file",20,20,350,300)) return(-1); return(0); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(SelectFile!=NULL) delete SelectFile; } //+------------------------------------------------------------------+ void OnChartEvent(const int id, // event ID const long& lparam, // event parameter of the long type const double& dparam, // event parameter of the double type const string& sparam) // event parameter of the string type { if(SelectFile!=NULL) { int key=SelectFile.ChartEvent(id,lparam,dparam,sparam); if(key>0) {//press button OK string file=SelectFile.Filename(); int flag=SelectFile.FileFlag(); delete SelectFile; SelectFile=NULL; Print("The selected file - ",flag==FILE_COMMON?"[Common]":"",file); int handle=FileOpen(file,flag); if(handle>0) { Print(file," - open"); FileClose(handle); } else Print(file," - failed to open"); } else if(key<0) {//press button Cancel delete SelectFile; SelectFile=NULL; Print("No file selected"); } } if(SelectFile==NULL) { Print("The program is completed"); ExpertRemove(); } } //+------------------------------------------------------------------+tipo mudar a imem en el gráfico al hacer clic en el archivo. queria saber si es posible, si no lo es y por complejo eu evito quebra mis neurônios kkkkkk
De hecho, algo pasó con las actualizaciones de MT5, que transforman el Wallpaper en algo diferente a lo esperado y mostrado en el artículo, ya que lo correcto es que se muestre en el GRAPHIC BACKGROUND, porque en la clase C_WallPaper se encuentra la siguiente línea:
Esto informa que el objeto deberá permanecer en segundo plano, más extrañamente, está pasando al frente, debido a esto el OBJETO que recibe o BitMap comienza a recibir los clics, una solución sería aumentar el Estado de todos los objetos, o tratar de bajar el estado del Bitmap, en el caso este segundo sería más sencillo, esto se lograría cambiando el valor de la propiedad OBJPROP_ZORDER en el objeto que recibe el Wallpaper, probé ambas soluciones, pero no pude estabilizar el conjunto de manera de corregir el problema, por lo tanto, e INFELIZMENTE, el wallpaper debe ser descartado por ahora ... Si prestas atención verás que la imagen del mapa de bits está siendo trazada en el cuerpo de las velas, indicando que el objeto mapa de bits está en primer plano, de nuevo este no es el comportamiento esperado debido a la línea de código anterior, debido a esto sucede que recibe todos y cada uno de los eventos de clic... 🙁
Daniel,
¿Es posible si se pone un temporizador y se ejecuta una función para desactivar y volver a activar el fondo de pantalla o algo que "reafirme" la función poniendo el fondo de pantalla en segundo plano (de vuelta)?
Un panel GUI que utilizo, tuve que optar por esta solución. Algunos elementos gráficos deben ser eliminados y creados de nuevo para estar en el fondo o en el frente, dependiendo del tipo de objeto.
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Cómo hacer el gráfico más interesante: Adicionando un fondo de pantalla:
Muchos terminales de trabajo contienen alguna imagen representativa que muestra algo sobre el usuario, estas imágenes hacen que el escritorio sea más bonito y alegre. Descubra cómo hacer el gráfico más interesante poniendo un fondo de pantalla.
Muchos terminales de trabajo contienen alguna imagen representativa y que muestra algo del usuario, estas imágenes hacen que el entorno de trabajo sea más bonito y alegre, la gente siempre intenta elegir las mejores y más bonitas imágenes para ponerlas como fondo de pantalla, pero cuando abrimos la plataforma de comercio, la cosa se vuelve aburrida y sosa, donde lo único que tenemos son representaciones gráficas de datos numéricos.
Podemos mirar una imagen durante mucho tiempo sin cansarnos, pero mirar un gráfico numérico durante unos minutos es muy agotador, así que hagamos las cosas más interesantes, para que podamos mirar y analizar el gráfico mientras la imagen de fondo nos motiva y nos recuerda algo bueno...
Autor: Daniel Jose