グラフィックライブラリーをゼロから作成する - ページ 5 123456789101112...15 新しいコメント Реter Konow 2020.08.27 22:42 #41 ライブラリーの進捗はいかがですか? Alexandr Andreev 2020.08.28 19:15 #42 Реter Konow: ライブラリーの進捗はいかがですか? ということです。 Aliaksandr Hryshyn 2020.08.28 19:47 #43 また、必要な要素だけを集めたグラフィックライブラリーを作るコツも掴みました。このライブラリの主な仕掛けは、そのウィンドウエンジンです。 グラフィックに依存しないので、グラフィックと連動する機能を一つも持たない仮想ウィンドウでも、正常に動作します(イベント、プロパティ)。 ウィンドウの動作に影響を与えるウィンドウのプロパティセット、そのウィンドウの依存プロパティ、その他。 cV_object_base::Init(my_handler); cV_object_rectangle *app_00=new cV_object_rectangle(); cV_object_rectangle *app_0=new cV_object_rectangle(); cV_object_rectangle *app_1=new cV_object_rectangle(); cV_object_label *lb1=new cV_object_label(); app_00.Create(cV_object_base::global_parent_object); app_00.Set_property(vop_size_x,800); app_00.Set_property(vop_size_y,500); app_00.Set_property(vop_color_back,clrDarkGreen); app_0.Create(app_00,"AAA"); app_00.Set_property(vop_is_position_fixing_parent_x,true); app_00.Set_property(vop_is_position_fixing_parent_y,true); app_1.Create(app_00); app_0.Set_property(vop_is_zorder_top_on_click,true); app_0.Set_property(vop_is_position_fixing_parent_x,true); app_0.Set_property(vop_is_position_fixing_parent_y,true); app_1.Set_property(vop_is_zorder_top_on_click,true); app_0.Set_property(vop_size_x,1000); app_0.Set_property(vop_size_y,300); app_0.Set_property(vop_position_x,100); app_0.Set_property(vop_position_y,100); app_0.Set_property(vop_color_back,clrDarkBlue); app_0.Set_property(vop_is_movable,true); app_0.Set_property(vop_is_selected_multi,false); lb1.Create(app_0,"E_hallo_world_E"); lb1.Set_property(vop_is_movable,true); lb1.Set_property(vop_color_back_selected,clrDarkTurquoise); lb1.Set_property(vop_is_change_color_back_on_select,true); lb1.Set_property(vop_is_zorder_top_on_click,true); app_1.Set_property(vop_size_x,300); app_1.Set_property(vop_size_y,500); app_1.Set_property(vop_position_x,200); app_1.Set_property(vop_position_y,200); app_1.Set_property(vop_is_movable,true); cV_object_rectangle *app_2; cV_object_rectangle *app_3; for(int i1=0; i1<4; i1++) { app_2=new cV_object_rectangle(); app_3=new cV_object_rectangle(); app_2.Create(app_0,ShortToString(ushort('A'+i1))); app_3.Create(app_1); app_2.Set_property(vop_size_x,100); app_2.Set_property(vop_size_y,75); app_3.Set_property(vop_size_x,75); app_3.Set_property(vop_size_y,100); app_2.Set_property(vop_position_x,i1*20); app_2.Set_property(vop_position_y,i1*40); app_3.Set_property(vop_position_x,i1*20); app_3.Set_property(vop_position_y,i1*40); app_2.Set_property(vop_color_back,clrDarkGray); app_3.Set_property(vop_color_back,clrLightGoldenrod); app_2.Set_property(vop_is_movable,true); app_2.Set_property(vop_is_zorder_top_on_click,true); app_3.Set_property(vop_is_movable,true); app_3.Set_property(vop_is_change_color_back_on_select,true); app_3.Set_property(vop_color_back_selected,clrRed); app_2.Set_property(vop_color_back_selected,clrDarkTurquoise); app_2.Set_property(vop_is_change_color_back_on_select,true); } app_3.Set_property(vop_moving_parent_index,1); app_3.Set_property(vop_position_x,150); app_3.Set_property(vop_size_y,150); app_2.Set_property(vop_moving_parent_index,2); app_2.Set_property(vop_position_x,150); app_2.Set_property(vop_size_y,150); app_2.Set_property(vop_color_borders,clrDarkTurquoise); app_3.Set_property(vop_color_borders,clrDarkTurquoise); app_2.Set_property(vop_is_change_color_back_on_mouse_move,true); app_3.Set_property(vop_is_change_color_back_on_mouse_move,true); app_2.Set_property(vop_is_change_color_borders_on_mouse_move,true); app_3.Set_property(vop_is_change_color_borders_on_mouse_move,true); app_3.Set_property(vop_is_selected,true); グラフィックは標準オブジェクトとキャンバスの両方が使えますし、DirectXも好きなように使えます。 エンジンウィンドウは、グラフィカルな要素を構築するためのビルディングブロックである パフォーマンスの最適化(グラフィックシステム関数の不要な呼び出しの排除、不可視ボックスの描画の排除)の使用 新しいグラフィックアイテムの作成は、グラフィックデザインの実装と子グラフィックアイテム/ウィンドウ構造の作成の両方が簡単です。すべてのイベントと依存プロパティの計算はエンジンレベルで実行され、カスタムグラフィックアイテムは区別されません。 標準のOBJ_RECTANGLE_LABELオブジェクトの 作成と削除bool cV_object_rectangle::_Create_resource() { if(!ObjectCreate(0,visual_object_name,OBJ_RECTANGLE_LABEL,0,0,0)) { cLng_add_user(lng_id,8,EnumToString(OBJ_RECTANGLE_LABEL),""); return false; } return true; } bool cV_object_rectangle::_Delete_resource() { ObjectDelete(0,visual_object_name); return true; }これは、標準のOBJ_RECTANGLE_LABELオブジェクトのプロパティを変更するためのメソッドを実装しており、ヘルプをさらって、興味のあるプロパティを使用します 。 bool cV_object_rectangle::_Set_property(eV_object_property property,sV_property_value &property_value) { _is_redraw_object=true; switch(property) { case vop_s_is_hidden: { if(property_value.data_long) { ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,0); ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,0); ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,-20); ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,-20); } else { ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,_property_values[vop_s_size_real_x].data_long); ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,_property_values[vop_s_size_real_y].data_long); ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,_property_values[vop_s_position_real_x].data_long); ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,_property_values[vop_s_position_real_y].data_long); } break; } case vop_s_color_back: { ObjectSetInteger(0,visual_object_name,OBJPROP_BGCOLOR,property_value.data_long); break; } case vop_border_type: { ObjectSetInteger(0,visual_object_name,OBJPROP_BORDER_TYPE,property_value.data_long); break; } case vop_s_color_borders: { ObjectSetInteger(0,visual_object_name,OBJPROP_COLOR,property_value.data_long); break; } case vop_s_position_real_x: { ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,property_value.data_long); break; } case vop_s_position_real_y: { ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,property_value.data_long); break; } case vop_s_size_real_x: { ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,property_value.data_long); break; } case vop_s_size_real_y: { ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,property_value.data_long); break; } case vop_font_size: { ObjectSetInteger(0,visual_object_name,OBJPROP_FONTSIZE,property_value.data_long); break; } case vop_line_width: { ObjectSetInteger(0,visual_object_name,OBJPROP_WIDTH,property_value.data_long); break; } default: { _is_redraw_object=false; } } return true; } イージーイベントハンドリング これは外部イベントハンドラで、作成時に対象オブジェクト(ウィンドウ/グラフィカルアイテム)の名前を指定することができる class My_handler:public iE_event_handler { void On_event(sEvent &event) { if(event.id==CHARTEVENT_CLICK_) { if( (event.sparam=="A")|| (event.sparam=="B")|| (event.sparam=="C")|| (event.sparam=="D")|| (event.sparam=="E_hallo_world_E") ) { sV_property_value v; cV_object_base *obj; obj=cV_object_base::Get_object_from_name(event.sparam); obj.Get_property(vop_is_selected,v); v.data_long=!v.data_long; obj.Set_property(vop_is_selected,v.data_long); } else if(event.sparam=="AAA") { sV_property_value v; cV_object_base *obj; obj=cV_object_base::Get_object_from_name("AAA"); obj.Get_property(vop_is_selected_multi,v); v.data_long=!v.data_long; obj.Set_property(vop_is_selected_multi,v.data_long); } else if(event.sparam=="vt_rectangle_4") { sV_property_value v; cV_object_base *obj; obj=cV_object_base::Get_object_from_name("AAA"); obj.Get_property(vop_position_x,v); v.data_long=v.data_long+5; obj.Set_property(vop_position_x,v.data_long); ulong ms=cV_object_base::Get_timer_msc(); if(ms!=ULONG_MAX) { Print(ms/1000.0," мс"); } } } } };テキスト・ラベルは、OBJ_LABEL オブジェクトで 幅と高さを変更できないため、kanvas で実装されており、そのため CHARTEVENT_ON_PAINT イベントが発生するとレンダリングが行われる(再描画が必要)。bool cV_object_label::_On_event(const sEvent &event) { if(event.id==CHARTEVENT_ON_PAINT) { color color_back=clrBlack; if(CheckPointer(_object_parent)) { color_back=color(_object_parent._property_values[vop_color_back].data_long); } int width=int(_property_values[vop_s_size_real_x].data_long); int height=int(_property_values[vop_s_size_real_y].data_long); int x=int(_property_values[vop_s_position_global_x].data_long-_property_values[vop_s_position_real_x].data_long); int y=int(_property_values[vop_s_position_global_y].data_long-_property_values[vop_s_position_real_y].data_long); _canvas.Resize(width,height); width=int(_property_values[vop_size_x].data_long); height=int(_property_values[vop_size_y].data_long); _canvas.Erase(ColorToARGB(color_back)); switch(int(_property_values[vop_text_anchor].data_long)) { case TA_CENTER: { x=x+(width-_canvas.TextWidth(_property_values[vop_text].data_string))/2; break; } case TA_RIGHT: { x=x+(width-_canvas.TextWidth(_property_values[vop_text].data_string)); break; } } _canvas.TextOut(x,y,_property_values[vop_text].data_string,ColorToARGB(color(_property_values[vop_s_color_back].data_long)));//); _canvas.Update(false); } return true; }何をレンダリングし、何をアップデートするかは、自動的に決定されます。プロパティは、ChartRedraw()を呼び出す前にログに記録されます。チャートの再描画の原因となっていないイベントはスキップされます。void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { cV_object_base::On_chart_event(id,lparam,long(dparam),sparam); ulong ms=cV_object_base::Get_timer_msc(); if(ms!=ULONG_MAX) { Print(ms/1000.0," мс"); } }デモは添付ファイルのとおりで、上記のソースが使用されています。 ファイル: Test_forms.ex5 221 kb Aliaksandr Hryshyn 2020.08.28 19:49 #44 デモでは、可能なすべてのプロパティを表示しているわけではなく、その一部のみを表示しています。 今のところ、まだ未完成なんです。 Реter Konow 2020.08.28 20:31 #45 Aliaksandr Hryshyn:デモでは、可能なすべてのプロパティを表示しているわけではなく、その一部のみを表示しています。今のところ、まだ未完成なんです。 開発頑張ってください:) Aliaksandr Hryshyn 2020.08.28 21:05 #46 Реter Konow:開発頑張ってください:) ありがとうございます :) Реter Konow 2020.08.29 21:16 #47 4GBのRAMと2つのプロセッサコアを持つ弱いコンピュータで、MT5の3Dグラフィックスの機能と可能性をテストしました。 プログラミングを長時間中断しても、問題なく動作します。でも、モノは重いし、本格的なものを作るには大変な労力が必要です。 Алексей Тарабанов 2020.08.29 21:24 #48 お金を稼ぐのに役立っているのでしょうか? Roman 2020.08.29 21:38 #49 Реter Konow:4GBのRAMと2つのプロセッサコアを持つ弱いコンピュータで、MT5の3Dグラフィックスの機能と可能性をテストしました。プログラミングを長時間中断しても、問題なく動作します。ただ、モノが重いので、本格的なものを開発するには、かなりの苦労が必要です。 HFTについては、カップの出来高やオーダーフローをグラフィカルに分析するために3Dが有効だと思います。 でも、そういう情報をどう解釈したらいいのかわからないんです。 Denis Sartakov 2020.08.29 21:41 #50 これはいったい何なんだ? 123456789101112...15 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ライブラリーの進捗はいかがですか?
ということです。
また、必要な要素だけを集めたグラフィックライブラリーを作るコツも掴みました。
このライブラリの主な仕掛けは、そのウィンドウエンジンです。
標準のOBJ_RECTANGLE_LABELオブジェクトの 作成と削除
これは、標準のOBJ_RECTANGLE_LABELオブジェクトのプロパティを変更するためのメソッドを実装しており、ヘルプをさらって、興味のあるプロパティを使用します
。
テキスト・ラベルは、OBJ_LABEL オブジェクトで 幅と高さを変更できないため、kanvas で実装されており、そのため CHARTEVENT_ON_PAINT イベントが発生するとレンダリングが行われる(再描画が必要)。
何をレンダリングし、何をアップデートするかは、自動的に決定されます。プロパティは、ChartRedraw()を呼び出す前にログに記録されます。チャートの再描画の原因となっていないイベントはスキップされます。
デモは添付ファイルのとおりで、上記のソースが使用されています。
デモでは、可能なすべてのプロパティを表示しているわけではなく、その一部のみを表示しています。
今のところ、まだ未完成なんです。
デモでは、可能なすべてのプロパティを表示しているわけではなく、その一部のみを表示しています。
今のところ、まだ未完成なんです。
開発頑張ってください:)
開発頑張ってください:)
ありがとうございます :)
4GBのRAMと2つのプロセッサコアを持つ弱いコンピュータで、MT5の3Dグラフィックスの機能と可能性をテストしました。
プログラミングを長時間中断しても、問題なく動作します。でも、モノは重いし、本格的なものを作るには大変な労力が必要です。
4GBのRAMと2つのプロセッサコアを持つ弱いコンピュータで、MT5の3Dグラフィックスの機能と可能性をテストしました。
プログラミングを長時間中断しても、問題なく動作します。ただ、モノが重いので、本格的なものを開発するには、かなりの苦労が必要です。
HFTについては、カップの出来高やオーダーフローをグラフィカルに分析するために3Dが有効だと思います。
でも、そういう情報をどう解釈したらいいのかわからないんです。
これはいったい何なんだ?