。
実際、MT5のアップデートに関連して何かが起こり、壁紙が予想と異なるものに変換されました:
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,この2つの解決策を試しましたが、問題を解決するためにこの方法を安定させることはできませんでした。..注意すると、ビットマップ画像がキャンドルのボディにプロットされ、ビットマップオブジェクトがフォアグラウンドにあることがわかります。🙁
//+------------------------------------------------------------------+ //|ファイルを選択します。mqh //+------------------------------------------------------------------+ #include <Controls\Dialog.mqh> #include <Controls\Button.mqh> #include <Controls\Edit.mqh> #include <Controls\ListView.mqh> #include <Controls\CheckGroup.mqh> //+------------------------------------------------------------------+ //| 定義| //+------------------------------------------------------------------+ #define INDENT_LEFT (4) // 左からのインデント #define INDENT_TOP (4) // トップからインデント #define INDENT_RIGHT (4) // 右からインデント #define BUTTON_WIDTH (60) // X座標によるサイズ #define BUTTON_HEIGHT (20) // Y座標によるサイズ #define EDIT_HEIGHT (20) // Y座標によるサイズ #define COMMON_WIDTH (90) // X座標によるサイズ //+------------------------------------------------------------------+ //| クラス 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; //--- チャート・オブジェクトを初期化する m_chart.Attach(chart); //--- オブジェクトとマウスイベントを指定する if(!m_chart.EventObjectCreate() || !m_chart.EventObjectDelete() || !m_chart.EventMouseMove()) { Print("CSelectFile: object events specify error"); m_chart.Detach(); return(false); } //--- 親クラスのメソッドを呼び出す 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); //--- 依存コントロールを作成する //--- ファイルのリストを作成する 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); //--- ファイル名のフィールドを作成する _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); //--- 共通チェックを作成する _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); //--- ボタンの作成 キャンセル _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); //--- ボタンの作成 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); } //+------------------------------------------------------------------+ //| イベントハンドラ| //+------------------------------------------------------------------+ 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; //---フォルダ long hfind=FileFindFirst(fl+"*",ff,m_fileflag); if(hfind==INVALID_HANDLE) {//空のフォルダ 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]); //---ファイル 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, // イベントID const long& lparam, // ロング・タイプのイベント・パラメーター const double& dparam, // double型のイベントパラメータ const string& sparam) // 文字列型のイベント・パラメーター { if(SelectFile!=NULL) { int key=SelectFile.ChartEvent(id,lparam,dparam,sparam); if(key>0) {//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) {//ボタンを押す キャンセル delete SelectFile; SelectFile=NULL; Print("No file selected"); } } if(SelectFile==NULL) { Print("The program is completed"); ExpertRemove(); } } //+------------------------------------------------------------------+をクリックすると、グラフィックの画像を変更することができます。queria saber se e possível, se no der e for complexo eu evito quebra meus neurônios kkkkkkkkkkkkk
実際、MT5のアップデートに関連して何かが起こり、壁紙が予想されていたものとは異なるものに変換されました:
このため、BitMapを受け取ったOBJECTはクリックを受け取り始めます。解決策は、すべてのオブジェクトのステータスを上げるか、Bitmapのステータスを下げることです、これは、壁紙を受け取るオブジェクトのOBJPROP_ZORDERプロパティの値を変更することで実現できます。私は両方の解決策を試しましたが、問題を修正するために全体を安定させることができませんでした。..注意すると、ビットマップ画像がキャンドルのボディにプロットされ、ビットマップオブジェクトがフォアグラウンドにあることがわかります。🙁
ダニエル
タイマーを設定し、壁紙を無効にして再び有効にする関数を実行するか、壁紙をバックグラウンド(バックグランド)にすることで機能を「再提示」するようなことはできませんか?
私が使用しているGUIパネルでは、この解決策を取らざるを得ませんでした。いくつかのグラフィック要素を削除し、オブジェクトのタイプに応じて背景または前面になるように再作成する必要があります。
Daniel, おめでとうございます。私は何年もMT4を使っていますが、流動性プロバイダーやブローカーによる資産の制限により、MT5への移行を余儀なくされました。
また、必要な方のためにYoutubeのビデオもあります: https://www.youtube.com/watch?v=AMNhI45EZ2o
あらためて、あなたの仕事とオープンソース・コードに敬意を表します。
よろしくお願いします。
- 2021.06.02
- www.youtube.com
やあ、ダニエル。どうしたんだい?
スレッドを復活させて申し訳ありません...E.A.であなたのコードを使用しているのですが、次のエラーが発生しました:"ファイルが見つかりません"。また、あなたがダウンロードした画像ファイルを使いましたが、同じエラーが発生しました。助けていただけますか?よろしくお願いします!
やあ、ダニエル。どうした?
スレッドを復活させて申し訳ありません...E.A.であなたのコードを使用しているのですが、次のエラーが発生しました:"ファイルが見つかりません"。また、あなたがダウンロードした画像ファイルを使いましたが、同じエラーが発生しました。助けていただけますか?よろしくお願いします!
よくわからないのですが...🤔🤔🤔 ...MQL5のフォルダにあるファイルをダウンロードして解凍する必要があります。これを正しく行うにはMetaEditorを開きます。右側にフォルダブラウザがあります。ROOT ( MQL5 )を右クリックし、OPEN FOLDERを選択します。エクスプローラーがMQL5フォルダで開きます。このフォルダでZIPファイルを解凍します。こうすることで、チャート上でシステムを起動したときに画像が見つかるようになります。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事「チャートをより面白くする: 背景の追加」はパブリッシュされました:
多くのワークステーションには、ユーザーに関する何かを語る代表的な画像が含まれています。これらの画像は、作業環境をより美しくエキサイティングなものにします。背景を追加してチャートをより面白くする方法を見てみましょう。
多くのワークステーションには、ユーザーに関する何かを語る代表的な画像が含まれています。人々は常に壁紙として使用するのに最高で最も美しい画像を選択しようとするため、これらの画像は、作業環境をより美しく刺激的なものにします。しかし、取引プラットフォームを開くと、それはどういうわけか退屈であることがわかります。あるのは、数値データのグラフィック表現だけです。
画像や写真は飽きることなく長時間見続けることができますが、価格チャートを見るのは数分でもとても疲れます。ですから、背景の画像が私たちを動機づけ、何か良いことを思い出させながら、チャートを見て分析できるようにしましょう。
作者: Daniel Jose