Canvas üzerinde bir kitle kaynaklı proje yapma - sayfa 22

 
Nikolai Semko :
GButton sınıfının örneğini neredeyse bitirdim ama kaçmam gerekiyor. Yarın bitirip sunacağım.
İyi. Gerçekten meraklı. )
 
Реter Konow :
İyi. Gerçekten meraklı. )


İşte olanlar.


Düğmeye basarak veya sabitlemeden sabitlemeyi ayarlamak için düğme arka plana ve ön plana getirilebilir.

CanvasButton.mq5 örnek dosyası, düğmeyi fare ile sürükleme özelliğini uygular. Bunu yapmak için, mavi düğmeyi hareket ettirmek için Ctrl ve kırmızı düğmeyi hareket ettirmek için Shift tuşuna basmanız yeterlidir.

Çünkü GButton sınıfı, CCanvas sınıfının bir alt öğesidir , örnek, CircleWu çemberini kullanarak CCanvas sınıfının işlevlerini kullanma olasılığını gösterir (Bu, OnInit'te uygulanır). Bu, CCanvas sınıfının işlevlerini kullanarak buton üzerine metin yazabileceğiniz anlamına gelir.

Bu sınıf, elbette, nihai olduğunu iddia etmez. Grafikler mükemmel bir şekilde parlamaz ve 3D çok koşulludur, gölgeler uygulanmaz, yürütme hızı optimize edilmez. Ve büyük olasılıkla çok sayıda pürüzlü kenar ve çeşitli kontrollerin olmaması. Bu yüzden kesinlikle yargılamayın.

Biraz daha fazla zaman harcarsanız, elbette bu yapılabilir:


Ben sadece denedim... biri denebilir - yönü belirlemek için.


Canvas.mqh dosyasının orijinal dosyadan farkı yalnızca m_pixels dizisinin genel olarak tanımlanmasıdır.

Dosyalar:
GButton.mqh  20 kb
Canvas.mqh  152 kb
 
Nikolai Semko :


İşte olanlar.


Düğmeye basarak veya sabitlemeden sabitlemeyi ayarlamak için düğme arka plana ve ön plana getirilebilir.

CanvasButton.mq5 örnek dosyası, düğmeyi fare ile sürükleme özelliğini uygular. Bunu yapmak için, mavi düğmeyi hareket ettirmek için Ctrl ve kırmızı düğmeyi hareket ettirmek için Shift tuşuna basmanız yeterlidir.

Çünkü GButton sınıfı, CCanvas sınıfının bir alt öğesidir, örnek, CircleWu çemberini kullanarak CCanvas sınıfının işlevlerini kullanma olasılığını gösterir (Bu, OnInit'te uygulanır). Bu, CCanvas sınıfının fonksiyonlarını kullanarak buton üzerine metin yazabileceğiniz anlamına gelir.

Bu sınıf, elbette, nihai olduğunu iddia etmez. Grafikler mükemmel bir şekilde parlamaz ve 3D çok koşulludur, gölgeler uygulanmaz, yürütme hızı optimize edilmez. Ve büyük olasılıkla çok sayıda pürüzlü kenar ve çeşitli kontrollerin olmaması. Bu yüzden kesinlikle yargılamayın.

Biraz daha fazla zaman harcarsanız, elbette bu yapılabilir:


Ben sadece denedim... biri denebilir - yönü belirlemek için.


Canvas.mqh dosyasının orijinal dosyadan farkı yalnızca m_pixels dizisinin genel olarak tanımlanmasıdır.

Nikolay, bence, fena değil. Bir başlangıç yapıldı, daha fazla gelişme yapılabilir. Bu tür bir düğmeyi bir anahtar olarak adlandırırdım. Kenarlar boyunca 4 net çerçeve çizgisini ayırırsanız: - üst, sol, açık ve sağ, alt - basılı durum için koyu ve basılı durum için tam tersi, daha da iyi kalite elde edersiniz (sadece açık bir arka plan eklemeniz gerekir) , aksi takdirde siyah grafiğin arka planındaki koyu çizgiler görünmez). Peki, o zaman metin ve resim ayarlanabilir.

Kısacası, iyi deneme. )

 
Реter Konow :

. Kenarlar boyunca 4 net çerçeve çizgisini ayırırsanız: - üst, sol, açık ve sağ, alt - basılı durum için koyu ve basılı durum için tam tersi, daha da iyi kalite elde edersiniz (sadece açık bir arka plan eklemeniz gerekir) , aksi takdirde siyah grafiğin arka planına karşı koyu çizgiler görünmez).

Evet, istediğiniz gibi çizebileceğiniz açık. Bu durumda, bir başyapıt elde etmek için yola çıkmadım. Ancak geliştirmek istediğim ilk şey, başlatma sırasında düğme görüntüsünün tüm dizilerini oluşturmak (bu durumda, iki) ve ardından her seferinde bir görüntü oluşturmamak için bunları yalnızca ArrayCopy aracılığıyla kopyalamak. Bu, işi önemli ölçüde hızlandıracak, ancak ek RAM tüketimi pahasına. şimdi 16 gig RAM'e sahip bilgisayarlarda yaygın bir durum ve çok sayıda düğme olsa bile, özellikle aynı düğmeler aynı dizileri kullanıyorsa, ek bellek tüketiminin 1-2 MB'yi aşması pek olası değildir. O yüzden sorun olduğunu düşünmüyorum. Ana hız.
 
Nikolai Semko :
Evet, istediğiniz gibi çizebileceğiniz açık. Bu durumda, bir başyapıt elde etmek için yola çıkmadım. Ancak geliştirmek istediğim ilk şey, başlatma sırasında düğme görüntüsünün tüm dizilerini oluşturmak (bu durumda, iki tane) ve ardından her seferinde bir görüntü oluşturmamak için bunları yalnızca ArrayCopy aracılığıyla kopyalamak. Bu, işi önemli ölçüde hızlandıracak, ancak ek RAM tüketimi pahasına. şimdi 16 gig RAM'e sahip bilgisayarlarda yaygın bir durum ve çok sayıda düğme olsa bile, özellikle aynı düğmeler aynı dizileri kullanıyorsa, ek bellek tüketiminin 1-2 MB'yi aşması pek olası değildir. O yüzden sorun olduğunu düşünmüyorum. Ana hız.

Apaçık. Düğmeyle ilgili soruyu gündeme getirdiğimde, bunu tuval yardımıyla yapmanın mümkün olup olmadığını öğrenmek istedim:


basıldı:

basıldı:

Bu örnekte, çerçevenin her bir tarafı birkaç satırdan oluşmaktadır. Çerçevenin her iki tarafında toplam 4 gradyan çizgisi. Her satırın, düğmenin durumuna ve belirtilen çerçeve şekline bağlı olarak kendi gölgesi vardır. CCanvas, belirli kenarlık gradyan çizgileri için renk ayarlama yeteneğine sahipse, yukarıdaki örnek kolayca yapılabilir. Tam olarak bilmek istediğim şey buydu.

 
Реter Konow :

Apaçık. Düğmeyle ilgili soruyu gündeme getirdiğimde, bunu tuval yardımıyla yapmanın mümkün olup olmadığını öğrenmek istedim:


basıldı:

basıldı:

Bu örnekte, çerçevenin her bir tarafı birkaç satırdan oluşmaktadır. Çerçevenin her iki tarafında toplam 4 gradyan çizgisi. Her satırın, düğmenin durumuna ve belirtilen çerçeve şekline bağlı olarak kendi gölgesi vardır. CCanvas, belirli kenarlık gradyan çizgileri için renk ayarlama yeteneğine sahipse, yukarıdaki örnek kolayca yapılabilir. Tam olarak bilmek istediğim şey buydu.

Seni anlamıyorum Peter. Sen etten bahsediyorsun, ben de iskeletten. Kemikler olsaydı, et yapılabilir. Örneğimde Basılan, Serbest Bırakılan Durumlar yoksa? GButton sınıfının içine baktınız mı? Peter, benim tavsiyem: her şeyi bırak ve acilen OOP'yi çalış, sınıflar OOP'dir. Sadece projenizde aşırı büyümüş kod adı verilen bir tavana çarptınız. OOP yardımıyla kolayca üstesinden gelinir.
Ve tuval yardımıyla her şeyi yapabilirsiniz, hatta Windows'u MT5 penceresinin içine tam görsel öykünme modunda elbette yazabilirsiniz :), çünkü donanıma erişim yok

 
Nikolai Semko :
Seni anlamıyorum Peter. Sen etten bahsediyorsun, ben de iskeletten. Kemikler olsaydı, et yapılabilir. Örneğimde Basılan, Serbest Bırakılan Durumlar yoksa? GButton sınıfının içine baktınız mı? Peter, benim tavsiyem: her şeyi bırak ve acilen OOP'yi çalış, sınıflar OOP'dir. Sadece projenizde aşırı büyümüş kod denilen bir tavana çarptınız, OOP yardımıyla kolayca üstesinden geliniyor.
Ve tuval yardımıyla her şeyi yapabilir, hatta MT5 penceresinin içine Windows yazabilirsiniz.

))) Peki, bu konuyu neden açtım? ) Şimdi OOP çalışacağım.

Örneğinizde butonlar, click olayları ve bu butonların durumları var. Her şey yolunda. Ama Nikolai, hala ne sorduğumu anlamadım - CCcanvas sınıfında sınır degrade çizgileri için belirli bir renk ayarlamak mümkün mü? Örneğinize bakınca, var olduğunu düşünebilirsiniz... Eğer öyleyse, benim örneğime benzer bir şey çizebilir misiniz? Ben bu sınıfın işlevselliği ile kendi başına çizim yapma kolaylığı ve yeteneği ile ilgileniyorum ve siz sınıfın işlevselliğindeki hız ve iyileştirmelerden bahsediyorsunuz. Bu biraz farklı bir konu.

 
Реter Konow :

))) Peki, bu konuyu neden açtım? ) Şimdi OOP çalışacağım.

OOP, Canvas ile değil, daha basit bir şeyle öğrenmeye başlamak daha iyidir.
 
Vasiliy Sokolov :
OOP, Canvas ile değil, daha basit bir şeyle öğrenmeye başlamak daha iyidir.
Haklısın. Sanırım bir ders kitabıyla başlasam iyi olacak. Doğru, OOP karmaşık bir şeydir. Her şey kafa karıştırıcı görünüyor...
 
Nikolai Semko :
GButton sınıfının içine baktınız mı?


Sınıfın içine baktım. Harika görünüyor, ancak CCanvas sınıfının tüm mekanizması hakkında bir fikrim yok. Bu yüzden sorumun cevabını göremedim.