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

 
블라디미르, 저는 캔버스를 잘 못해요....
질문이 있습니다.
캔버스에 다양한 모양을 그리고 서로 겹쳐서 그립니다. 혼합하지 않고 색상을 원래대로 유지하려면 어떻게 해야 하나요?

COLOR_FORMAT_XRGB_NOALPHA를 설정했지만 혼합이 발생합니다 :-(((.

그러나이 변형이 있습니다. CDialog 유형의 대화 상자에 CPicture 유형의 그림이 첨부되어 있습니다. CCanvas 유형의 리소스에 연결됩니다. 후자는 창에 바인딩하지 않고 생성됩니다.

 
Dennis Kirichenko:
블라디미르, 저는 캔버스를 잘 못해요....
질문이 있습니다.
캔버스에 다양한 모양을 그리고 서로 겹쳐서 그립니다. 혼합하지 않고 색상을 원래대로 유지하려면 어떻게 해야 하나요?

COLOR_FORMAT_XRGB_NOALPHA를 설정했지만 블렌딩이 발생합니다 :-((((

...

Knavas

캔버스에 그려진 색상("위쪽" 또는 마지막이라고 부르자)이 앞서 캔버스에 그려진 색상을 대체합니다.

//+------------------------------------------------------------------+
//|canvas+xor.mq5 |
//|저작권 © 2015, 블라디미르 카르푸토프 |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "저작권 © 2015, 블라디미르 카르푸토프"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The script draws overlapping areas on canvas"
//--- 스크립트 실행 시 입력 매개변수 창 표시
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- 입력
input uchar alfa=150;         // 알파 채널로 색상 투명도 관리하기
//--- 차트의 가변 너비와 높이.
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 차트의 너비와 높이
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- 캔버스 만들기 COLOR_FORMAT_XRGB_NOALPHA
   CCanvas canvas_XARGB_NORMALIZE;
   if(!canvas_XARGB_NORMALIZE.CreateBitmapLabel("canvas_XARGB_NORMALIZE",0,0,
      ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("Error creating canvas: ",GetLastError());
      return;
     }
   canvas_XARGB_NORMALIZE.Erase(ColorToARGB(clrAqua,255));
//--- 직사각형 #1 만들기
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 3초간 기다립니다.
   Sleep(3000);
//--- 직사각형 #2 만들기
   canvas_XARGB_NORMALIZE.FillRectangle(7*ChartWidth/20,7*ChartHeight/20,
                                        16*ChartWidth/20,16*ChartHeight/20,
                                        ColorToARGB(clrGreen,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 3초간 기다립니다.
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| 차트 속성 너비|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- 속성 값을 가져올 변수를 준비합니다.
   long result=-1;
//--- 오류 값 재설정
   ResetLastError();
//--- 속성 값 받기
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- 전문가 저널에 오류 메시지를 표시합니다.
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- 차트 속성 값을 반환합니다.
   return((int)result);
  }
//+------------------------------------------------------------------+
//| 차트 속성 높이|
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- 속성 값을 가져올 변수를 준비합니다.
   long result=-1;
//--- 오류 값 재설정
   ResetLastError();
//--- 속성 값 받기
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- 전문가 저널에 오류 메시지를 표시합니다.
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- 차트 속성 값을 반환합니다.
   return((int)result);
  }
//+------------------------------------------------------------------+
파일:
 

블라디미르, 정말 고마워요!

방금 ColorToARGB() 변환을 간과했습니다.

 
Dennis Kirichenko:

블라디미르, 정말 고마워요!

방금 ColorToARGB() 변환을 간과했습니다.

감사합니다 :) .
 
안녕하세요, 이 글은 훌륭하다고 생각합니다. 좌표 x1, x2, y1, y2로 화면에 직사각형을 만드는 방법에 대한 질문이 있습니다:

x1 = Time[1]

x2 = Time[0]

y1 = Open[1]

y2 = Close[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
안녕하세요, 이 글은 훌륭하다고 생각합니다. 좌표 x1, x2, y1, y2로 화면에 직사각형을 만드는 방법에 대한 질문이 있습니다:

x1 = Time[1]

x2 = Time[0]

y1 = Open[1]

y2 = Close[1]

CCanvas 클래스를 사용하여?

추신: CCanvas.CreateBitmap을 사용합니다:

차트 객체에 바인딩된 그래픽 리소스를 생성합니다.

1. 현재 차트의 메인 창에 그래픽 리소스를 생성합니다.

bool CreateBitmap(
const string name, // 이름
const날짜/시간 시간, // 시간
const double가격, // 가격
constintwidth, // 폭
const int 높이, // 높이
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// 형식
);

이렇게 하면 캔버스의 한쪽 모서리를 바인딩할 수 있습니다. 그러나 너비와 높이는 모두 동일하게 픽셀 단위로 설정됩니다.

 

좀 더 쉽게 연습을 해보겠습니다. 원이 가격에 따라 움직이는데 왜 축 Y에서는 움직이지 않을까요?

이것이 바로 코드입니다.

void OnStart()
  {
   int ChartWidth=ChartWidthInPixels();
   int ChartHeight=ChartHeightInPixelsGet();

   CCanvas pepe;

   int t1,t0,p1,p0;
   ChartTimePriceToXY(0,0,Time[1],Open[1],t1,p1);
   ChartTimePriceToXY(0,0,Time[0],Close[1],t0,p0);

   pepe.CreateBitmapLabel("canvas_XRGB_NOALPHA",0,0,ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_RAW);
   pepe.Erase(0);
   pepe.FillCircle(t0,p0,25,ColorToARGB(clrBlue,255));
   pepe.Update();
   return(rates_total);
  } 
 
Jorge Fernando De Los Ríos De Los Ríos:

좀 더 쉽게 연습을 해보겠습니다. 원이 가격에 따라 움직이는데 왜 축 Y에서는 움직이지 않을까요?

이것이 바로 코드입니다.

이 스크립트는 컴파일되지 않았습니다. 그 안에는 실수가 가득합니다.
 
Jorge Fernando De Los Ríos De Los Ríos:

좀 더 쉽게 연습을 해보겠습니다. 원이 가격에 따라 움직이는데 왜 축 Y에서는 움직이지 않을까요?

바로 다음 코드입니다.

"Time[]," "Close[]" - 실수입니다. MQL5에는 이러한 변수가 없습니다!
 
Karputov Vladimir:
"시간[]", "닫기[]" - 실수입니다. MQL5에는 이러한 변수가 없습니다!
MQL4 ;)