캔버스 멋지다! - 페이지 44

 
Nikolai Semko :

이 기능은 끔찍하게 잘못 작성되었습니다. 거기에서 악마가 그의 머리를 잡을 것입니다. 정상적인 스무딩이 없으며 색상과 투명도를 혼합하는 일반적인 작업이 없습니다. 그것들을 부수고 쓰레기통에 버리고 새 것을 쓰기만 하면 됩니다.
나는 이미 여기 에 대해 썼습니다.

어쨌든 표준 PixelTransform 함수를 다음 함수로 교체해야 합니다.

https://www.mql5.com/ru/forum/1111/page2553#comment_13054823

그는 자신의 이중 버전(모든 int 입력 매개변수가 이중인 경우)을 작성하기 시작했지만 완료하지 않고 선반에 올려 놓았습니다. 단순해 보이기 위한 아주 간단한 작업은 아닙니다. 더 정확하게는 쓰기가 문제가 아니라 매우 높은 품질의 쓰기가 문제이므로 빠른 알고리즘이 있습니다. 내 주요 문제는 완벽주의입니다.

분명히, 그들은 끝내지 않았다)

나는 전체 캔버스를 다시 쓰기 위해 움직이지 않을 것입니다. 지금은 2픽셀 1개 대신 1픽셀 2개를 나란히 그려야 합니다.)

 
Andrey Khatimlianskii :

분명히, 그들은 끝내지 않았다)

나는 전체 캔버스를 다시 쓰기 위해 움직이지 않을 것입니다. 지금은 2픽셀 1개 대신 1픽셀 2개를 나란히 그려야 합니다.)

전체 캔버스를 다시 작성할 필요는 없습니다. 가장 중요한 것은 원형 형식을 만드는 것입니다.

Circle( double x, double y, double r1, double r2= 0 , uint clr)  

그리고 선을 정상으로 만듭니다.

Polyline( const double &x[], const double &y[], const uint clr, const double size, const uint style,ENUM_LINE_END end_style)

이것은 작업의 95% 완료를 포함합니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

모든 개체를 하나의 개체로 변환하는 방법

니콜라이 셈코 , 2019.10.05 22:39

실제로 Canvas가 솔루션입니다.

그리고 Canvas는 언뜻보기보다 훨씬 쉽습니다.

다음은 많은 창이 있는 하나의 개체 OBJ_BITMAP_LABEL이 있는 표시기(MQL5 및 MQL4)의 기본 예입니다.

 #property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164 - MQL5
                              //https://www.mql5.com/en/code/23840 - MQL4

struct win {
   int                x;
   int                y;
   int                width;
   int                height;
   uint               clr;
};
win wnd[ 30 ];
int OnInit () {
   for ( int i= 0 ; i< ArraySize (wnd); i++) {
      wnd[i].width= rand ()% 200 + 70 ;
      wnd[i].height= rand ()% 150 + 50 ;
      wnd[i].x= rand ()%(W.Width-wnd[i].width);
      wnd[i].y= rand ()%(W.Height-wnd[i].height);
      wnd[i].clr=ARGB( 255 , rand ()% 150 + 100 , rand ()% 150 + 100 , rand ()% 150 + 100 );
   }
   ShowAllWind();
   return ( INIT_SUCCEEDED );
}

//+------------------------------------------------------------------+

int OnCalculate ( const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   return (rates_total);
}

//+------------------------------------------------------------------+

void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam) {
   static bool click = false ;
   static int x_mouse= 0 , y_mouse= 0 ;
   static int focus=- 1 , xfocus= 0 , yfocus= 0 ;
   int x=( int )lparam;
   int y=( int )dparam;
   if (sparam!= "1" && click) focus=- 1 ;
   if (sparam== "1" && !click) {
      focus=- 1 ;
       for ( int i= ArraySize (wnd)- 1 ; i>= 0 ; i--) {
         if (wnd[i].x<x && wnd[i].y<y && wnd[i].x+wnd[i].width>x && wnd[i].y+ 20 >y) {
            focus=i;
            xfocus=x;
            yfocus=y;
             break ;
         }
      }
       if (focus>= 0 ) ChartSetInteger ( 0 , CHART_MOUSE_SCROLL , false );
       else ChartSetInteger ( 0 , CHART_MOUSE_SCROLL , true );
   }
   click=(sparam== "1" )? true : false ;
   if (id== CHARTEVENT_MOUSE_MOVE && focus>= 0 ) {
      wnd[focus].x+=x-xfocus;
      wnd[focus].y+=y-yfocus;
      xfocus=x;
      yfocus=y;
      ShowAllWind();
   }
   if (id== CHARTEVENT_CHART_CHANGE ) ShowAllWind();
}

//+------------------------------------------------------------------+

void ShowAllWind() {
   Canvas.Erase();
   for ( int i= 0 ; i< ArraySize (wnd); i++) {
      Canvas.FillRectangle(wnd[i].x,wnd[i].y,wnd[i].x+wnd[i].width,wnd[i].y+wnd[i].height,ARGB( 255 ,GETRGBR(wnd[i].clr)* 0.5 ,GETRGBG(wnd[i].clr)* 0.5 ,GETRGBB(wnd[i].clr)* 0.5 ));
      Canvas.FillRectangle(wnd[i].x+ 3 ,wnd[i].y+ 23 ,wnd[i].x+wnd[i].width- 3 ,wnd[i].y+wnd[i].height- 3 ,wnd[i].clr);
      Canvas.FillRectangle(wnd[i].x+ 3 ,wnd[i].y+ 3 ,wnd[i].x+wnd[i].width- 3 ,wnd[i].y+ 20 ,ARGB( 255 ,GETRGBR(wnd[i].clr)* 0.7 ,GETRGBG(wnd[i].clr)* 0.7 ,GETRGBB(wnd[i].clr)* 0.7 ));
   }
   Canvas.Update();
}
//+------------------------------------------------------------------+

 
Nikolai Semko :

수업!

그런 기회가 정말 필요하고 이 미니 창에 나만의 지표를 그릴 수 있습니다.

한 창은 다른 창 아래에 숨겨져 있고 다른 창은 맨 위에 있는 이유는 무엇입니까?

더 많은 질문이 있습니다. 동일한 지표가 다른 차트에서 실행되면 작동합니까? 이벤트는 표준 라이브러리에서처럼 에코되지 않습니까?

그리고 두 창의 좌표가 같으면 어느 창을 마우스로 끌까요?

마우스로 창의 크기를 조정할 수 있습니까?

 
Sergey Chalyshev :

수업!

그런 기회가 정말 필요하고 이 미니 창에 나만의 지표를 그릴 수 있습니다.

한 창은 다른 창 아래에 숨겨져 있고 다른 창은 맨 위에 있는 이유는 무엇입니까?

더 많은 질문이 있습니다. 동일한 지표가 다른 차트에서 실행되면 작동합니까? 이벤트는 표준 라이브러리에서처럼 에코되지 않습니까?

그리고 두 창의 좌표가 같으면 어느 창을 마우스로 끌까요?

마우스로 창의 크기를 조정할 수 있습니까?

이 예에서는 실현 가능한 창 우선 순위일 뿐입니다. 사실, win 구조의 배열에서 인덱스가 작을수록 창의 가상 레이어가 낮아집니다.

어떤 방식으로든 구현할 수 있습니다. 예를 들어 창이 "잡혔다"면 화면과 배열에서 맨 위에 있는 창이 됩니다.

투명성을 구현할 수 있습니다. 수행 방법이 여기 에 나와 있습니다. (각 픽셀을 처리할 필요가 있습니다).

다른 차트에서 시작할 수도 있습니다.
좌표가 같으면 맨 위에 있는 좌표가 드래그됩니다.

캔버스를 사용하면 창과 다른 MT 창 내에서 모든 작업을 수행할 수 있습니다.
또한 MT5에서 창을 분리하여 최소한 모니터 사이에서 자유 부동으로 보낼 수 있습니다. 여기에서 볼 수 있습니다.

 
Nikolai Semko :

이 예에서는 실현 가능한 창 우선 순위일 뿐입니다. 사실, win 구조의 배열에서 인덱스가 작을수록 창의 가상 레이어가 낮아집니다.

어떤 방식으로든 구현할 수 있습니다. 예를 들어 창이 "잡혔다"면 화면과 배열에서 맨 위에 있는 창이 됩니다.

투명성을 구현할 수 있습니다. 수행 방법이 여기 에 나와 있습니다. (각 픽셀을 처리할 필요가 있습니다).

다른 차트에서 시작할 수도 있습니다.
좌표가 같으면 맨 위에 있는 좌표가 드래그됩니다.

캔버스를 사용하면 창과 다른 MT 창 내에서 모든 작업을 수행할 수 있습니다.
또한 MT5에서 창을 분리하여 최소한 모니터 사이에서 자유 부동으로 보낼 수 있습니다. 여기에서 볼 수 있습니다.

정확하지 않습니다. 아마도 제가 올바른 질문을 하지 않았을 수 있습니다.

하나의 프로그램(스크립트, 인디케이터)에서 여러 개의 창을 구성하는 것은 어렵지 않습니다.

차트의 작은 창에 데이터를 표시하는 표시기를 만들고 싶습니다. 그리고 이 창을 차트에 편리하게 배치하고, 마우스로 드래그하고, 마우스로 창의 크기를 조정할 수 있도록(바람직하지만 없어도 가능합니다). 차트에서 이러한 지표 중 일부를 실행해야 하며 각각 고유한 매개변수가 있습니다. 지금까지는 다른 표시기의 이벤트가 교차하지 않고 표시기가 마우스 이벤트에 적절하게 응답하는지 확인하는 방법을 알 수 없습니다. 그리고 나는 아직 어느 것이 더 낫고, 더 단순하고, 캔버스인지, 물건인지 결정하지 못했습니다. Dialog 표준 라이브러리에는 아무 일도 일어나지 않습니다.

 
Sergey Chalyshev :

...여전히 다른 지표의 이벤트가 겹치지 않게 하는 방법을 알 수 없습니다...

가장 쉬운 방법은 속성 창에서 그래픽 개체의 이름에 문자열 변수를 추가하는 것입니다.

 
Dmitry Fedoseev :

가장 쉬운 방법은 속성 창에서 그래픽 개체의 이름에 문자열 변수를 추가하는 것입니다. 진실과 클럽 회원 사이에서 마음이 갈리셨나요?

당연히 그렇게 합니다. 문제는 마우스로 드래그하는 것입니다. 객체의 좌표가 같은 경우 하나는 정확히 다른 객체 아래에 있습니다. 당신이 그들을 클릭하면 어느 것이 반응할까요?

무슨 클럽을 말하는거야, 나는 어떤 클럽에도 가입하지 않았고 앞으로도하지 않을거야))

p.s. 예를 보여주실 수 있나요?

 
Sergey Chalyshev :

당연히 그렇게 합니다. 문제는 마우스로 드래그하는 것입니다. 객체의 좌표가 같은 경우 하나는 정확히 다른 하나 아래에 있습니다. 당신이 그들을 클릭하면 어느 것이 반응할까요?

무슨 클럽을 말하는거야, 나는 어떤 클럽에도 가입하지 않았고 앞으로도하지 않을거야))

p.s. 예를 들어주실 수 있나요?

나는 클럽에 대해 잘못된 장소에 썼습니다. 죄송합니다 ...이 클럽과 연결해야합니다))

어떤 하나의 개체가 반응할 것입니다. 아마도 개체를 활성화할 때 끝났을 것입니다. 무엇보다도 Z 순서를 변경하십시오. 시도해야합니다.

 
Sergey Chalyshev :

당연히 그렇게 합니다. 문제는 마우스 드래그입니다. 객체의 좌표가 같은 경우 하나는 정확히 다른 하나 아래에 있습니다. 당신이 그들을 클릭하면 어느 것이 반응할까요?

무슨 클럽을 말하는거야, 나는 어떤 클럽에도 가입하지 않았고 앞으로도하지 않을거야))

p.s. 예를 들어주실 수 있나요?

일반적으로 이러한 상황에서는 마지막으로 이동한 개체가 반응해야 합니다. 맨 위에 있습니다...

사유: