Delphi Can
Image nesnesi saydam kısımlara tıklamama - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Mobil Platform - FireMonkey (FMX) (https://www.delphican.com/forumdisplay.php?fid=7)
+--- Konu Başlığı: Image nesnesi saydam kısımlara tıklamama (/showthread.php?tid=100)



Image nesnesi saydam kısımlara tıklamama - engerex - 19-08-2016

Merhaba,
Projedeki Image nesnelerin saydam kısımlarına fare ile tıklanmasını istemiyorum. Altta hangi nesne varsa ona tıklansın.

Örnek olarak aşağıda 3 Image nesnesi var ve bunların dikdörgen olarak kapladığı alanlar görülüyor. En üstte duran nesnenin saydam kısımları diğer bileşenin büyük kısmını kapladığı için alttaki bileşenin görünür yerleri yerine üstteki bileşenin saydam kısımları tıklanıyor.

Bu durumu nasıl çözebilirim?

G3vYky.png


Cvp: Image nesnesi saydam kısımlara tıklamama - mrmarman - 19-08-2016

Merhaba.

Bu resmin siyah beyaz veya kırmızı beyaz gibi bir iz - düşümü maske kopyasını ikinci başka bir TImage nesnesine yüklersin. Ancak bu ikinci kopya ekranda görünmesin, Visible False olsun.

Birinci (orjinal) TImage üzerindeki OnMouseMove olayında X,Y koordinatını bu ikinci oluşturduğun anahtar olarak iş görecek TImage üzerinde aynı koordinatta hangi renk iz düşümü yapmışsan o renk varsa mouse ile tıklamaya müsaade edersin, yok koorinat noktası beyaz ise mouse ile tıklamaya müsaade etmezsin.

Bu durumu güncel olarak MouseMove sırasında Mouse Cursor şeklini değiştirerek kullanıcıya gösterebilirsin. Bu metodu ben Türkiye haritası vb. projelerde kullanıyorum ve çok başarılı sonuçlar alıyorum.

Başarılar.


Cvp: Image nesnesi saydam kısımlara tıklamama - engerex - 20-08-2016

@mrmarman öncelikle ilgine teşekkürler.
Benzer bir yöntemi şöyle denemeyi düşündüm. Sonuçta ben saydam kısımlara tıklanmasını istemiyorum ve tıklandığında altındaki kısma tıklanmasını sağlamak istiyorum. Bileşenin mouse olaylarına tıklanan kısmın saydam olması durumunda bileşenin hittest (sanırım FMX ile gelen bir olay) olayını disable yapmayı planladım. Bir nevi bahsettiğin şekilde. Bunun üzerinde biraz çalışmak gerekiyor. Çünkü hittest disable dendiğinde o bileşen bir nevi devre dışı kalmış oluyor. Görünür kısımlar görünmeye devam ediyor ancak üzerine tıklanırsa alttakine geçiyor.
Bazı bileşenlerde bu olayı gördüğümden 1-2 kodla aktif edilebileceğini düşündüm.

Ancak sonradan gördüğüm kadarıyla image bileşeni bana çok ters. Türkiye haritası yaptığında pek sorun yok ancak binlerce bileşen olduğunda bellek kullanımı çok çok yüksek. TPath bileşeni işimin yarısından fazlasını görüyor. Tamda böyle vektörel çizim gerekli. Ancak oda bir nevi 1(2) bit. Yani bir çizgi ve dolgu ile oynayabiliyoruz. Üzerine yazı yazmak için çizgilerle yazmak gerekiyor. Bu yedekte.
Tam aradığım olay SVG veya vektörel bir bileşen. Ücretsiz SVG bileşeni bulamadım. http://www.riversoftavg.com/svg.htm adresindeki demo (http://www.riversoftavg.com/Files/SVGDemoApps.zip)

SVG veya benzer vektörel çiz bulamazsam Tpath olmadı riversoftsvg(ücretli) bileşeni gibi duruyor.


Cvp: Image nesnesi saydam kısımlara tıklamama - Tuğrul HELVACI - 20-08-2016

(20-08-2016, Saat: 12:57)engerex Adlı Kullanıcıdan Alıntı: @mrmarman öncelikle ilgine teşekkürler.
Benzer bir yöntemi şöyle denemeyi düşündüm. Sonuçta ben saydam kısımlara tıklanmasını istemiyorum ve tıklandığında altındaki kısma tıklanmasını sağlamak istiyorum. Bileşenin mouse olaylarına tıklanan kısmın saydam olması durumunda bileşenin hittest (sanırım FMX ile gelen bir olay) olayını disable yapmayı planladım. Bir nevi bahsettiğin şekilde. Bunun üzerinde biraz çalışmak gerekiyor. Çünkü hittest disable dendiğinde o bileşen bir nevi devre dışı kalmış oluyor. Görünür kısımlar görünmeye devam ediyor ancak üzerine tıklanırsa alttakine geçiyor.
Bazı bileşenlerde bu olayı gördüğümden 1-2 kodla aktif edilebileceğini düşündüm.

Ancak sonradan gördüğüm kadarıyla image bileşeni bana çok ters. Türkiye haritası yaptığında pek sorun yok ancak binlerce bileşen olduğunda bellek kullanımı çok çok yüksek. TPath bileşeni işimin yarısından fazlasını görüyor. Tamda böyle vektörel çizim gerekli. Ancak oda bir nevi 1(2) bit. Yani bir çizgi ve dolgu ile oynayabiliyoruz. Üzerine yazı yazmak için çizgilerle yazmak gerekiyor. Bu yedekte.
Tam aradığım olay SVG veya vektörel bir bileşen. Ücretsiz SVG bileşeni bulamadım. http://www.riversoftavg.com/svg.htm adresindeki demo (http://www.riversoftavg.com/Files/SVGDemoApps.zip)

SVG veya benzer vektörel çiz bulamazsam Tpath olmadı riversoftsvg(ücretli) bileşeni gibi duruyor.

Aslında istediğiniz şeyin karşılığı; Region'dur. Bir çok region fonksiyonu vardır, bunlarla bir region oluşturduktan sonra handle(HWND)'ı vasıtası ile bir pencereyi ilgili region'a SetWindowRgn api'si ile sınırlandırabilirsiniz. Dolayısı ile o sınırların dışında kalan alana tıklamalarınıza ilgili alanın sahibi olan pencere yanıt verecektir.

İlgili API grubuna buradan erişebilirsiniz.

Not: PathToRegion ve CombineRgn API'lerine de bakmak isteyebilirsiiniz.


Cvp: Image nesnesi saydam kısımlara tıklamama - mrmarman - 20-08-2016

Alıntı:Örnek olarak aşağıda 3 Image nesnesi var ve bunların dikdörgen olarak kapladığı alanlar görülüyor. En üstte duran nesnenin saydam kısımları diğer bileşenin büyük kısmını kapladığı için alttaki bileşenin görünür yerleri yerine üstteki bileşenin saydam kısımları tıklanıyor.

Sorunu alıntıladığım bu şekliyle güzelce ifade etmişsin ama ben önyargıyla atlamışım. 

Evet Tuğrul beyin söylediği şekilde yapılası bir durum.


Cvp: Image nesnesi saydam kısımlara tıklamama - engerex - 21-08-2016

Yalnız VCL windows altında geçerli.


Cvp: Image nesnesi saydam kısımlara tıklamama - Tuğrul HELVACI - 23-08-2016

(21-08-2016, Saat: 12:42)engerex Adlı Kullanıcıdan Alıntı: Yalnız VCL windows altında geçerli.

Bir Firemonkey kullanıcısı değilim ama hedef platform Windows ise ilgili Windows API'leri kullanabileceğinizi düşünüyorum. FMX.Platform.Win altında FmxHandleToHWND isimli bir metod olmalı, onu inceleyebilirsiniz arzu ederseniz.