"CCanvas Sınıfını incelemek. Şeffaf Nesneler Nasıl Çizilir" makalesi için tartışma - sayfa 3

 
Vladimir, canvas konusunda iyi değilim....
İşte bir soru.
Tuvalde farklı şekiller çiziyorum ve bunları birbirinin üzerine bindiriyorum. Renklerin karıştırılmadan orijinal kalmasını nasıl sağlayabilirim?

COLOR_FORMAT_XRGB_NOALPHA ayarını yapıyorum ama karıştırma gerçekleşiyor :-((.

Bununla birlikte, bu varyantım var. CDialog türünde bir diyaloğa eklenmiş CPicture türünde bir resim var. CCanvas türünde bir kaynağa bağlı. İkincisi bir pencereye bağlanmadan oluşturulur.

 
Dennis Kirichenko:
Vladimir, canvas konusunda iyi değilim....
İşte bir soru.
Tuvalde farklı şekiller çiziyorum ve bunları birbirinin üzerine bindiriyorum. Karıştırma yapmadan renklerin orijinal kalmasını nasıl sağlarım?

COLOR_FORMAT_XRGB_NOALPHA ayarını yapıyorum ama karıştırma gerçekleşiyor :-((

...

Knavas

Tuvalde çizilen renk (buna "üst" veya son diyelim), tuvalde daha önce çizilen rengin yerini alır.

//+------------------------------------------------------------------+
//|canvas+xor.mq5 |
//|Telif Hakkı © 2015, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Telif Hakkı © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The script draws overlapping areas on canvas"
//--- komut dosyası başlatılırken giriş parametreleri penceresini göster
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- giriş
input uchar alfa=150;         // renk şeffaflığını yöneten alfa kanalı
//--- grafiğin değişken genişliği ve yüksekliği.
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| Komut dosyası programı başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- grafiğin genişliği ve yüksekliği
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- tuval oluştur 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));
//--- bir dikdörtgen oluştur #1
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 3 saniye bekleyin
   Sleep(3000);
//--- bir dikdörtgen oluştur #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 saniye bekleyin
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| Grafik özelliği genişliği|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- özellik değerini almak için değişkeni hazırlayın
   long result=-1;
//--- hata değerini sıfırlayın
   ResetLastError();
//--- özellik değerini al
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- Experts günlüğünde hata mesajını görüntüle
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- grafik özelliğinin değerini döndürür
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Grafik özelliği yüksekliği|
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- özellik değerini almak için değişkeni hazırlayın
   long result=-1;
//--- hata değerini sıfırlayın
   ResetLastError();
//--- özellik değerini al
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- Experts günlüğünde hata mesajını görüntüle
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- grafik özelliğinin değerini döndürür
   return((int)result);
  }
//+------------------------------------------------------------------+
Dosyalar:
 

Vladimir, çok teşekkür ederim!

ColorToARGB() dönüşümünü gözden kaçırmışım.

 
Dennis Kirichenko:

Vladimir, çok teşekkür ederim!

ColorToARGB() dönüşümünü gözden kaçırmışım.

Rica ederim :) .
 
Merhaba, bu makalenin mükemmel olduğunu düşünüyorum. Ekranda x1, x2, y1, y2 koordinatlarına sahip bir dikdörtgeni nasıl oluşturabilirim diye bir sorum var:

x1 = Zaman[1]

x2 = Zaman[0]

y1 = Aç[1]

y2 = Kapat[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
Merhaba, bu makalenin mükemmel olduğunu düşünüyorum. Ekranda x1, x2, y1, y2 koordinatlarına sahip bir dikdörtgeni nasıl oluşturabilirim diye bir sorum var:

x1 = Zaman[1]

x2 = Zaman[0]

y1 = Aç[1]

y2 = Kapat[1]

CCanvas sınıfı aracılığıyla?

Not: CCanvas.CreateBitmap öğesini kullanın:

Bir grafik nesnesine bağlı bir grafik kaynağı oluşturur.

1. Geçerli grafiğin ana penceresinde bir grafik kaynağı oluşturur.

bool CreateBitmap(
const string İsim, // name
const datetimetime, // zaman
const çiftfiyat, // fiyat
constintgenişlik, // genişlik
const int yükseklik, // yükseklik
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// format
);

Böylece bir Tuvalin bir köşesini bağlayabileceksiniz. Ancak genişlik ve yükseklik, hepsi aynı, piksel olarak ayarlanacaktır.

 

Daha kolay bir alıştırma yapalım. Fiyatla birlikte hareket eden bir daire koymaya gidiyorum; ama neden Y ekseninde hareket etmiyor?

Bu kod

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:

Daha kolay bir alıştırma yapalım. Fiyatla birlikte hareket eden bir daire koymaya gidiyorum; ama neden Y ekseninde hareket etmiyor?

Bu kod

Bu senaryo derlenmemiş. İçinde bir yığın hata var.
 
Jorge Fernando De Los Ríos De Los Ríos:

Daha kolay bir alıştırma yapalım. Fiyatla birlikte hareket eden bir daire koymaya gidiyorum; ama neden Y ekseninde hareket etmiyor?

Bu kod

"Zaman[]," "Kapanış[]" - Hata. MQL5'te böyle değişkenler yoktur!
 
Karputov Vladimir:
"Zaman[]," "Kapanış[]" - Hata. MQL5'te böyle değişkenler yoktur!
MQL4 ;)