처음부터 그래픽 라이브러리 만들기 - 페이지 5

 
도서관은 어떻게 진행되고 있나요?
 
Реter Konow :
도서관은 어떻게 진행되고 있나요?

모든 것이 좋은 것 이상입니다.

 

필요한 요소만으로 그래픽 라이브러리를 만드는 것도 혼란스러웠습니다.

창 엔진에 있는 라이브러리의 주요 기능:

  • 그래픽 부분에 의존하지 않습니다. 그래픽 작업을 위한 단일 기능이 없는 가상 창은 절대 창이라도 올바르게 작동한다고 말할 수 있습니다(이벤트, 속성)
  • 동작에 영향을 미치는 창의 속성 집합, 이 창 및 기타 창의 종속 속성

   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 개체 는 너비와 높이를 변경할 수 없기 때문에 텍스트 레이블은 캔버스를 통해 구현되며 이러한 이유로 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 :

데모에는 가능한 모든 속성이 표시되지 않고 일부만 표시됩니다.

아직까지는 개발 과정에 있습니다.

개발에 행운을 빕니다! :)

 
Реter Konow :

개발에 행운을 빕니다! :)

감사해요 :)

 

4기가의 RAM과 2개의 프로세서 코어가 있는 약한 컴퓨터에서 MT5의 3D 그래픽 기능의 성능과 잠재력을 확인했습니다.



프로그래밍을 오래 멈춘 후에도 정상적으로 마스터됩니다. 하지만 무겁고 진지한 것을 만들기 위해서는 열심히 일해야 합니다.

 
돈 버는 데 도움이 되나요?
 
Реter Konow :

4기가의 RAM과 2개의 프로세서 코어가 있는 약한 컴퓨터에서 MT5의 3D 그래픽 기능의 성능과 잠재력을 확인했습니다.

프로그래밍을 오래 멈춘 후에도 정상적으로 마스터됩니다. 하지만 무겁고 진지한 것을 만들기 위해서는 열심히 일해야 합니다.

HFT의 경우 3D가 주문장 볼륨과 주문 흐름에 대한 그래픽 분석을 생성할 때 유용할 것이라고 생각합니다.
그러나 그러한 정보를 해석하는 방법은 침투하지 않았습니다.

돔

개울

 

맙소사 ! 이게 다 뭐야?