기고글 토론 "CCanvas 클래스 공부하기. 투명 개체를 그리는 방법"

 

새로운 기고글 CCanvas 클래스 공부하기. 투명 개체를 그리는 방법 가 게재되었습니다:

이동 평균의 어색한 그래픽 이상이 필요하십니까? 터미널에 채워진 단순한 직사각형보다 더 아름다운 것을 그리고 싶습니까? 터미널에서 매력적인 그래픽을 그릴 수 있습니다. 이것은 사용자 정의 그래픽을 만드는 데 사용되는 CСanvas 클래스를 통해 구현할 수 있습니다. 이 클래스를 사용하면 투명도를 구현하고 색상을 혼합하고 색상을 겹치고 혼합하여 투명도의 환상을 만들 수 있습니다.

MetaTrader 5에서 그리는 것은 간단하며 몇 가지 뉘앙스만 알면 됩니다. 뉘앙스 중 하나는 터미널 화면이 디자인되는 방식입니다. 보다 정확하게는 그래픽이 화면에 출력되는 방식에 관심이 있습니다. 예를 들어 차트를 전경이나 배경에 표시할 수 있습니다. 화면의 색상 출력은 차트 표시에 따라 다릅니다. 일부 그래픽 개체는 겹치거나 교차하는 영역에서 색상이 변경될 수 있습니다.

CCanvas 클래스를 사용하여 직접 그리기를 진행하기 전에 색상 처리와 관련된 몇 가지 정의를 분석해 보겠습니다. 예를 들어 알파 채널의 의미를 알아보겠습니다.

제 생각에는 투명도 구현이 이미지를 생생하게 해줄 수 있는 가장 중요한 기술이라고 생각합니다. 예를 들어, 투명도를 사용하여 부드러운 색상 전환 또는 그림자가 있는 더 매력적인 인터페이스를 구현할 수 있습니다. 그림자는 그래픽 개체에 차원을 추가하고 개체 가장자리를 시각적으로 부드럽게 합니다.

이제 우리는 투명성의 실질적인 구현을 진행할 수 있습니다.

채워진 직사각형을 여러 개 그려봅시다(스크립트 "xor.mq5"). 색상 처리 방법의 차이점을 설명하기 위해 차트 상단에 겹치지 않는 가로 캔버스 3개를 적용해 보겠습니다.

첫 번째는 COLOR_FORMAT_XRGB_NOALPHA, 두 번째는 COLOR_FORMAT_ARGB_RAW, 세 번째는 COLOR_FORMAT_ARGB_NORMALIZE를 사용하여 처리됩니다. 그런 다음 투명도를 255(완전 불투명)에서 0(완전 투명)으로 점진적으로 변경합니다. 스크립트를 "Illusion.mq5"라고 합시다.

비디오는 스크립트 "Illusion.mq5"가 작동하는 방식을 보여줍니다.


그림 11. 스크립트illusion.mq5의 작업

작성자: Vladimir Karputov

 
블라디미르, 전 캔버스에 소질이 없어요. 질문이 하나 있어요. 캔버스가 있습니다. 그 위에 텍스트 레이블이 있습니다. 터미널에서 레이블을 클릭한 이벤트를 캔버스를 클릭한 이벤트로 인식하는 이유는 무엇인가요? 이 충돌을 어떻게든 해결할 수 있을까요?
 
denkir:
블라디미르, 전 캔버스에 소질이 없어요. 질문이 하나 있어요. 캔버스가 있습니다. 그 위에 텍스트 레이블이 있습니다. 터미널에서 레이블을 클릭한 이벤트를 캔버스를 클릭한 이벤트로 인식하는 이유는 무엇인가요? 이 충돌을 어떻게든 해결할 수 있을까요?
코드를 알려주세요. 한번 살펴봅시다.
 
denkir:
...

이에 대한 우선순위를 설정하는 속성이 있습니다:

OBJPROP_ZORDER - 차트에서 마우스 클릭 이벤트를 수신할 그래픽 개체의 우선 순위(CHARTEVENT_CLICK). 기본적으로 생성 시 이 값은 0으로 설정되어 있지만 필요한 경우 우선순위를 높일 수 있습니다. 겹치는 개체가 CHARTEVENT_CLICK 이벤트를 수신하는 경우 우선순위가 다른 개체보다 높은 개체 하나만 이벤트를 수신합니다.

 

나중에 코드를 보내드리겠습니다. OBJPROP_ZORDER - 캔버스의 경우 설정할 수 없습니다...

잘못 처리하는 원인을 찾았습니다... 캔버스가 두 개 있는데 하나는 다른 캔버스에 겹쳐져 있습니다. 그리고 위에 텍스트 레이블이 있습니다. 이것이 OnChartEvent()가 보지 못하는 것입니다.

 
denkir:

나중에 코드를 보내드리겠습니다. OBJPROP_ZORDER - 캔버스의 경우 설정할 수 없습니다...

잘못 처리하는 원인을 찾았습니다... 캔버스가 두 개 있는데 하나는 다른 캔버스에 겹쳐져 있습니다. 그리고 위에 텍스트 레이블이 있습니다. 이것이 OnChartEvent()가 보지 못하는 것입니다.

네, 볼 수 있습니다. OBJ_BITMAP_LABEL 또는 OBJ_BITMAP과 같은 일반 객체입니다.

 
tol64:

할 수 있습니다. 오브젝트_비트맵_라벨 또는 오브젝트_비트맵과 같은 일반 오브젝트입니다.

그렇군요. 고마워요.

이렇게 하려면 바인딩된 차트 개체의 이름을 가져와서 우선순위를 지정해야 합니다.

이것이 바로 그 방법입니다(초기화 블록에서 발췌):

//--- 첫 번째 캔버스 만들기
   if(!myCanvas1.CreateBitmapLabel("My canvas1",_X,_Y,Width,Height,COLOR_FORMAT_ARGB_RAW)) 
     {
      Print("Error creating base canvas: ",GetLastError());
      return INIT_FAILED;
     }
//--- 디스플레이
   myCanvas1.Erase(XRGB(0x1F,0x1F,0x1F)); 
   myCanvas1.Update();
   string obj_name=myCanvas1.ChartObjectName();
   if(!ObjectSetInteger(0,obj_name,OBJPROP_ZORDER,0))
      return INIT_FAILED;
 

안녕하세요 블라디미르,

흥미로운 글을 작성해 주셔서 감사합니다.

표 3에 약간의 오류가 있습니다.

С'255,0,255' 0xFF00FF 1111 1111 0000 0000 1111 1111


XOR
C'255,255,255' 0xFFFFFF 1111 1111 1111 1111 1111 1111 흰색(배경)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
여야 합니다 :
0000 0000 1111 1111 0000 0000
Green
 
angevoyageur:

안녕하세요 블라디미르,

흥미로운 글을 작성해 주셔서 감사합니다.

표 3에 약간의 오류가 있습니다.

С'255,0,255' 0xFF00FF 1111 1111 0000 0000 1111 1111


XOR
C'255,255,255' 0xFFFFFF 1111 1111 1111 1111 1111 1111 흰색(배경)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
여야 합니다 :
0000 0000 1111 1111 0000 0000
Green
로그인하지 않았습니다.
 

문제는 바로 이것입니다. 그래프에서 캔버스를 움직일 때 가장 좋은 구현 방법은 무엇일까요? 일종의 방법:

bool CUserCanvas::Move(int _new_x,int _new_y);
 
denkir:

문제는 바로 이것입니다. 그래프에서 캔버스를 움직일 때 가장 좋은 구현 방법은 무엇일까요? 일종의 방법:

캔버스를 이동하는 목적은 무엇인가요? 캔버스에 그림을 다시 그리는 것이 더 좋을까요?