Newsgroup: it.comp.lang.vo-clipper
Titolo: Vo e Bitmap

Ciao a tutti,
ho una finestra che contiene un pulsante associato ad una bitmap. Vorrei, 
secondo determinate condizioni, disegnarci sopra qualcosa, e fin quì nessun 
problema poichè lo faccio usando il metodo draw della finestra. Il problema 
è che se ripasso sul pulsante con il mouse mi si cancella quello che ho 
disegnato al volo e ritorna la bitmap originale. Come posso fare a fissare 
il disegno che faccio?
Grazie per l'aiuto.
                                                            Francesco Leo 

Dimenticavo: ho provato a disegnare nel metodo expose della finestra ma si 
cancella lo stesso. 

 ha scritto nel messaggio 
news:46e94e16$0$17940$4faf...@reader1.news.tin.it...

Avanza una ipotesi e se invece cambi al volo la bitmap associata al bottone 
magari distruggendolo e ricreandolo.
Danilo 

 ha scritto nel messaggio 
news:46e96a89$0$16028$5fc...@news.tiscali.it...

E' proprio per evitare di dover realizzare più bitmap che ci disegno sopra, 
mi sono creato una bitmap di sfondo e, secondo il caso, ci disegno sopra 
delle identificazioni. Considera che i bitmap sono circa 30 e gli status 4, 
di conseguenza dovrei creare 120 bitmap!
Grazie comunque per il suggerimento.
                                Francesco

 Ciao a tutti,

In generale, il disegno lo devi fare durante l'evento WM_PAINT. Purtroppo 
non ti so dire come applicare questo concetto al codice VO.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

 EMG
WM_PAINT è un messaggio, non un evento, che invia l'applicazione quando è 
richiesto il ridisegno della finestra, il problema è da dove intercettare 
l'evento in VO. La soluzione potrebbe essere il dispatch() ma non ho ancora 
provato.
Grazie comunque.
                                                        Francesco Leo 

Ciao Francesco
       Ho metodo di una classe che ho personalizzato che clona il
bitmap passato com handle ( BitMap:Handle() ) che puoi utilizzare
modificando la parte del metodo che viene utilizzato per il disegno
del bitmap :
            Praticamente dove viene utilizzata l'api BitBlt o la
strech... oltre ad utilizzarla per il disegno del bitmap la puoi
utilizzare per  disegnarci sopra e alla fine hai un bitmap formato dal
bitmap originale + il disegno applicato su di esso.
          Penso che sia un buon suggerimento.
Un aluto da Napoli, Luigi De Palma
METHOD __Clone(hBMP AS PTR,;
               iWidth  :=0 AS INT,;
               iHeight :=0 AS INT,;
               iX      :=0 AS INT,;
               iY      :=0 AS INT,;
               lResize :=FALSE AS LOGIC) AS PTR PASCAL CLASS
DPLBitMap
	    //
	     LOCAL hDC, hDCOld, hDCNew, hOldBmp, hNewBmp AS PTR
	     LOCAL hBMPInfo                              IS _winBITMAP
	     LOCAL iOldStrechMode                        AS INT
	    //
	     IF hBMP==NULL_PTR
	   	    IF SELF:hBitmap==NULL_PTR
	   	   	  RETURN NULL_PTR
	   	    ENDIF
	   	    hBmp   :=SELF:hBitMap
	     ENDIF
	    //
	     IF iWidth<=0 .or. iHeight<=0 .or. lResize
	        IF GetObject(hBMP, _SizeOf( _WINBITMAP ), @hBMPInfo)=0
	           RETURN NULL_PTR
	        ENDIF
	        IF iWidth <=0;iWidth :=hBMPInfo.bmWidth
	        ENDIF
	        IF iHeight<=0;iHeight:=hBMPInfo.bmHeight
	        ENDIF
	     ENDIF
	    //
	     hDC      :=CreateDC (PSZ (_CAST, "DISPLAY"), NULL_PSZ, NULL_PSZ,
NULL_PTR)
         hDCOld   :=CreateCompatibleDC( hDC )
	     hDCNew   :=CreateCompatibleDC( hDC )
	     hOldBmp  :=SelectObject(hDCOld, hBMP)
	     hNewBmp  :=CreateCompatibleBitmap(hDC, iWidth, iHeight)
        //
	     SelectObject (hDCnew, hNewBmp)
	     IF!lResize
	        BitBlt (hDCNew, 0, 0, iWidth, iHeight, hDCOld, iX, iY,
SRCCOPY)
	     ELSE
	        iOldStrechMode := SetStretchBltMode(hDCNew, HALFTONE)
	        StretchBlt(hDCNew, 0, 0, iWidth          , iHeight          ,
hDCOld ,;
                               0, 0, hBMPInfo.bmWidth,
hBMPInfo.bmHeight, SRCCOPY )
            SetStretchBltMode(hDCNew, iOldStrechMode)
         ENDIF
	     DeleteObject (hOldBmp)
	     DeleteDC( hDC    )
	     DeleteDC( hDCOld )
	     DeleteDC( hDCNew )
        //
       //
RETURN hNewBmp

E' un ottimo suggerimento, ma non ho la classe per applicare il 
metodo.......... :-(
Grazie!
                            Francesco Leo 

 WM_PAINT è un messaggio, non un evento,
Sì, scusa. Dato che il messaggio viene inviato all'evento corrispondente 
spesso per brevità chiamo l'evento con il nome del messaggio.
