Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Immagini e hotspot

Salve a tutti.
Devo implementare un'applicazione che visualizzi un'immagine nella
quale dovranno essere identificate delle aree sensibili che se
cliccate facciano partire determinate azioni. Ho trovato in giro per
la rete alcuni esempi di come fare, addirittura una classe che forse
per il mio livello e' troppo complicata.
Uno dei metodi piu' diffusi e' quello di definire delle immagini
trasparenti sopra l'immagine di sfondo in modo da intercettare il
click del mouse.
Il mio problema e' pero' che questo modo prevede che io definisca
all'interno del form un'immagine trasparente per ogni hotspot che
voglio in fase di progettazione, mentre in realta' io ho a
disposizione l'immagine di sfondo e per ogni area che deve essere
sensibile un'immagine sotto forma di file delle stesse dimensioni
dello sfondo ma con la parte non-sensibile trasparente che deve essere
interpretata a run-time.
Per spiegarmi:
lo sfondo e':
-----------------------
|                     |
|                     |
|                     |
|                     |
|                     |
-----------------------
e le varie hotspot sono immagini del tipo:
-----------------------
|                     |
|         []          |
|                     |
|                     |
|                     |
-----------------------
con solo il quadratino colorato e il resto trasparente.
L'idea e' di caricare prima lo sfondo e successivamente sovrapporgli
l'hotspot necessaria.
Ma come faccio poi ad interpretare il click solo sul quadratino?
Spero di essere stato chiaro.
grazie per i suggerimenti.

 Ma come faccio poi ad interpretare il click solo sul quadratino?
Usa un array di label trasparenti. Ogni label viene disposta sulla tua
immagine in corrispondenza degli hotspot, e poi nell'evento click fai un
select case sull'index ed esegui la giusta operazione.
In alternativa puoi dichiarare delle region con l'API CreatePolygonRgn e
gestire direttamente il click sulla picture di sfondo. Per trovare la region
che contiene il punto cliccato puoi usare l'API PtInRegion ciclando su tutte
le region dichiarate.
Questo secondo metodo è più complesso, ma ti permette di avere degli hotspot
di forme complesse, e non solo quadrate e rettangolari.
Ciao
*Roby*

interpretata a run-time.
Devi usare le regioni.
Se vuoi un ocx già fatto guarda sul sito comune il mio adRegion (anzi,
adesso adRegn20.zip)
Ciao

select case sull'index ed esegui la giusta operazione.
Il fatto e' che il quadratino per me' e' un'immagine su file: pensavo
di caricare il file sfondo e poi caricarci sopra i vari file
quadratino. E poi intercettare il click se fatto su uno dei
quadratini.
Non mi e' chiaro come disporre la label trasparente in corrispondenza
del quadratino.
Considera che le immagini quadratino sono molteplici e non so a priori
dove sono piazzate rispetto all'immagine sfondo.
Idem per il discorso delle regioni: come associo una regione ad un
quadratino se non so dov'e' il quadratino all'interno dell'immagine
quadratino? (Che casino con tutti 'sti quadratini, ma spero sia un po'
chiaro...).

 chiaro...).
Mah, mica troppo... 8-)
Ciao
*Roby*

Mah, mica troppo... 8-)
Sapevo io...

 il quadratino piazzato chissa' dove.
Mi sembra una base di partenza un po' demenziale. Se per ognuna delle
immagini di Mask hai un solo quadrattino, ci metti un sacco a plottarle
tutte e tenerle in memoria ti costa molto spazio.
Comunque avresti questa possibilità:
- Creati uno usercontrol che utilizzerai per mostrare ciascuna Mask
(l'immagine con dentro un quadrattino)
- Setta BackStyle a 0 (transparent)
- Setta MaskColor = al colore dello sfondo trasparente della Mask
- Metti in MaskPicture la tua bitmap di Mask
In questo modo lo usercontrol che hai creato gestirà l'evento click solo sul
quadrattino
Se invece per ogni Mask ci sono più quadratini, io ti consiglio di
preprocessare le bitmap di Mask e generare un database di coordinate e
dimensioni, altrimenti non te la cavi più
Ciao
*Roby*