anwenden
De hecho, aconteceu algo envolvendo as atualizações do MT5, que transformam 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 );
Das bedeutet, dass das Objekt nicht mehr im Grundzustand ist, sondern an den Rand gedrängt wird, da das Objekt, das den Bildschirm empfängt, oder die Bitmap, die die Cliquen empfängt, eine Lösung wäre, den Status aller Objekte zu erhöhen oder den Status der Bitmap zu verringern, was in diesem Fall einfacher ist, da sich der Wert des Objekts, das den Bildschirmhintergrund empfängt, mit dem Wert des Objekts OBJPROP_ZORDER ändert, Tentei as duas soluções, mas não consegui stabilizar a coisa toda de forma a corrigir o problema, portanto, e INFELIZMENTE, o papel de parede deve descartado por hora ... Wenn Sie aufpassen, werden Sie sehen, dass das Bitmap-Bild auf dem Körper der Kerzen gezeichnet wird, was anzeigt, dass das Bitmap-Objekt im Vordergrund ist. Auch dies ist nicht das erwartete Verhalten aufgrund der obigen Codezeile, weshalb es alle Klick-Ereignisse empfängt ... 🙁
//+------------------------------------------------------------------+ //| 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 no gráfico ao clicar no arquivo. Ich würde gerne wissen, ob das möglich ist, oder ob es nicht möglich ist und ob ich meine Nerven nicht überstrapazieren muss.
De hecho, etwas geschah mit der MT5-Updates, die das Hintergrundbild in etwas anderes als die erwartete und in dem Artikel gezeigt, da die richtige, dass es in der GRAPHIC BACKGROUND angezeigt werden, weil in der C_WallPaper Klasse finden Sie die folgende Zeile:
Das bedeutet, dass das Objekt im Hintergrund bleiben muss, seltsamerweise kommt es in den Vordergrund, deshalb beginnt das OBJEKT, das die BitMap empfängt, die Klicks zu empfangen, eine Lösung wäre, den Status aller Objekte zu erhöhen, oder zu versuchen, den Bitmap-Status zu senken, in diesem Fall wäre die zweite Lösung einfacher, Dies würde durch Ändern des Wertes der Eigenschaft OBJPROP_ZORDER in dem Objekt, das das Hintergrundbild empfängt, erreicht werden, habe ich versucht, beide Lösungen, aber ich konnte nicht stabilisieren die ganze Sache in einer Weise, um das Problem zu beheben, daher, und INFELIZMENTE, muss das Hintergrundbild für jetzt verworfen werden ... Wenn Sie aufpassen, werden Sie sehen, dass das Bitmap-Bild auf den Kerzenkörper gezeichnet wird, was anzeigt, dass das Bitmap-Objekt im Vordergrund ist. Auch dies ist nicht das erwartete Verhalten aufgrund der obigen Codezeile, da es alle Klick-Ereignisse empfängt ... 🙁
Daniel,
Ist es möglich, wenn Sie einen Timer zu setzen und führen Sie eine Funktion zu deaktivieren und aktivieren Sie die Tapete wieder oder etwas, das "bekräftigen" die Funktion, indem Sie die Tapete in den Hintergrund (zurück)?
Da ich ein GUI-Panel verwende, musste ich mich für diese Lösung entscheiden. Einige grafische Elemente müssen gelöscht und neu erstellt werden, damit sie je nach Objekttyp im Hintergrund oder im Vordergrund stehen.
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Charts interessanter machen: Hinzufügen eines Hintergrunds :
Viele Arbeitsplätze enthalten ein repräsentatives Bild, das etwas über den Benutzer aussagt. Diese Bilder machen die Arbeitsumgebung schöner und spannender. Sehen wir uns an, wie man die Charts durch Hinzufügen eines Hintergrunds interessanter gestalten kann.
Viele Arbeitsplätze enthalten ein repräsentatives Bild, das etwas über den Benutzer aussagt. Diese Bilder machen die Arbeitsumgebung schöner und inspirierender, da die Menschen immer versuchen, die schönsten Bilder als Bildschirmhintergrund zu verwenden. Aber wenn wir die Handelsplattform öffnen, sehen wir, dass sie irgendwie langweilig ist. Alles, was wir haben, ist die grafische Darstellung von numerischen Daten.
Man kann Bilder und Fotos über einen längeren Zeitraum betrachten, ohne zu ermüden, aber einen Chart auch nur für ein paar Minuten zu betrachten, kann sehr ermüdend sein. Deshalb sollten wir es so einrichten, dass wir den Chart beobachten und analysieren können, während das Bild im Hintergrund uns motiviert und an etwas Gutes erinnert.
Autor: Daniel Jose