Newsgroup: it.comp.lang.delphi
Titolo: Varie su TImage, Canvas & pixel....

Salve.
Dovrei realizzare una piantina schematica di un ufficio in modo da poter
rilevare se l'utente clicca con il mouse su una stanza in particolare.
Le varie stanze avranno colori diversi per distinguerle.
L'unica idea che mi viene in mente è di creare una serie di oggetti di
classe TImage dalla forma irregolare che potrei "assemblare" per creare la
piantina che mi serve.Se la forma è regolare vengono sovrapposti e non è
quindi possibile cliccare su quelli che stanno "sotto"....
Ho trovato alcune api che servono per alterare la forma di oggetti visuali
dotati di un DC che permettono ad esempio di avere form con gli angoli
arrotondati, ma non ho capito bene come si usano.
Inoltre...
le porte di accesso delle varie stanze dovranno essere di colore diverso.
Quindi, oltre sapere su QUALE  stanza l'utente ha cliccato devo anche sapere
se il punto preciso è colorato ad esempio in blu (standard) oppure nero ( è
una porta), per eseguire operazioni diverse.
Spero di anon aver esagerato con la Vs pazienza.....
Tnx for all answers...
AS (Non400!)
"Se è Microsoft non funziona"

Spero di anon aver esagerato con la Vs pazienza.....
Lo hai fatto! :)
Ciao! :)
--
- Carlo -

 Le varie stanze avranno colori diversi per distinguerle.
Ciao!  E perchč non usare un'unica immagine e crearsi una mappa in un altro
file invece?
č molto + semplice e personalizzabile secondo me!
La mappa potrebbe benissimo essere un'altra bitmap schematizzata (se non hai
tempo di creare
un "map-editor") con dei colori pieni e piani ... poi vai a testare di che
colore č il pixel
corrispondente : in pseudocodice :
Procedure TImage.OnMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Case ImmagineDiRiferimento.Picture.Bitmap.Canvas.Pixels[x,y]  Of
           clBlue  :  // il blu č il colore associato al bagno.
           clAqua : // il magenta alla cucina...
       ... e cosě via...
end;
Capito ?  ok, spero di esserti stato d'aiuto :)
Ciaoooooooo !!! Davide DG

colore è il pixel
Scusa ma non ho capito...
AS

> Scusa ma non ho capito...
Eheh... e te pareva... mi ero alzato da poco ^_^  !!
Allora, mettiamo che tu hai una bitmap che ti rappresenta la piantina
schematica dell'ufficio; quindi
sarà piena di colori sfumati, oggetti, testo, indicazioni, ecc ecc... da
sola non te ne fai nulla!
Quello che ti interessa a quanto ho capito è di distinguere le varie zone
(stanza1, stanza2,
segreteria, servizi, ecc...), giusto?
Ora se tu crei un'altra bitmap delle stesse dimensioni di quella
rappresentante l'ufficio, puoi definire
(*disegnare*) in questa seconda bitmap le zone che ti interessano con dei
colori unici, definendo
così le aree.
Ti faccio un esempio :  decidiamo di assegnare il colore clBlue ai servizi
(er gabbinetto...), quindi
colori tutta la zona interessata di blu.  **(colore piano==non sfumato,
quindi *univoco*)
Ora quando l'utente clicca su un determinato punto X,Y della prima immagine
a video, tu non fai
altro che andare a vedere, sulla seconda immagine, di che colore è (e quindi
a che zona *assegnata*
si riferisce) il pixel in questione.
Spero di essere stato + chiaro... mi verrebbe molto + semplice postarti un
esempio ;-)
Ciao!! Davide DG

>
Dovrei realizzare una piantina schematica di un ufficio in modo da poter
rilevare se l'utente clicca con il mouse su una stanza in particolare.
Le varie stanze avranno colori diversi per distinguerle.
L'unica idea che mi viene in mente è di creare una serie di oggetti di
classe TImage dalla forma irregolare che potrei "assemblare" per creare
la
piantina che mi serve.Se la forma è regolare vengono sovrapposti e non è
quindi possibile cliccare su quelli che stanno "sotto"....
[...]
Quindi, oltre sapere su QUALE  stanza l'utente ha cliccato devo anche
sapere
se il punto preciso è colorato ad esempio in blu (standard) oppure nero
( è
una porta), per eseguire operazioni diverse.
<<
Forse ti conviene disegnare la piantina come bmp e caricare quella in
una timage; avresti subito il colore del pixel cliccato; o ancora,
disegnare la piantina e poi sovrapporre delle label (trasparenti)
dimensionate in modo da tappezzare tutta la superficie che ti serve.
Saluti
Paolo Arosio

Adesso va meglio!
Non scusarti: il caldo fa sentire i suoi effetti anche su di me!
La piantina dell'ufficio non deve essere necessariamente dettagliata.
Anche schematica va bene quindi uso una sola bitmap.
Pero' c'e' un pero'....
Senza volerti spiegare tutto quello cche 'sto software del c###o deve
fare....
Per una luuuuuuuuunga serie di motivi mi serve avere un bitmap,o meglio, una
immagine sulla quale il click mi genera eventi, per ogni stanza. Da qui la
richiesta iniziale.
Da qui la maledetta APi CreatePolygonRgn :
CreatePolygonRgn function creates a polygonal region.
HRGN CreatePolygonRgn(
    CONST POINT *lppt, // pointer to array of points
    int cPoints, // number of points in array
    int fnPolyFillMode  // polygon-filling mode
   );
Aiutoooooooooo!
AS


 Da qui la maledetta APi CreatePolygonRgn :
E che problema c'è ?  Scusa, ma non potresti crearti o un componente
(derivando magari da TImage)
o gestire degli eventi in run time?
Nel primo caso potresti crearti un componente che implementa degli eventi
personalizzati...
che ne so... OnUfficioDelDirettoreClick  per esempio...
Nel secondo caso puoi scriverti delle procedure e richiamarle dalla
OnMouseDown.
Ti faccio un esempio di componente del primo caso :
************************************************************
type
  TMappaUfficio = class(TImage)
  private
    fBitmap: TBitmap;
    FColoreStanzaDelDirettore: TColor;
    FOnStanzaDelDirettore: TNotifyEvent;
  protected
    { Protected declarations }
  public
    Procedure MouseDown
     (Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer); Override;
  published
    Property BitMAP : TBitmap read fBitmap write fBitmap;
    Property OnStanzaDelDirettore : TNotifyEvent read FOnStanzaDelDirettore
write FOnStanzaDelDirettore;
    Property ColoreStanzaDelDirettore : TColor read
FColoreStanzaDelDirettore write FColoreStanzaDelDirettore;
  end;
Implementation
{ TMappaUfficio }
procedure TMappaUfficio.MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  inherited;
// ******* PUNTO INTERESSANTE : qui generi gli eventi :
 Case fBitmap.Canvas.Pixels[x,y] of
    fColoreStanzaDelDirettore : if Assigned (fOnStanzaDelDirettore) then
fOnStanzaDelDirettore;
 // fColoreStanzaImpiegati : if Assigned (fOnStanzaImpiegati) then
fOnStanzaImpiegati;
 // ecc...
End;
****************************************************************************
***********
Ok.... spero di essermi espresso bene (stavolta) .... per come la vedo io
questa è una soluzione
abbastanza rapida ed indolore :)
Ovviamente questo è solo un esempio e non è testato!!
CIAO!! DAVIDE DG