Gli operatori logici in Visual Basic Net? Li trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
La funzione BitBlt: Tutorial completo
BitBlt è l'acronimo di Bit Block Tansfer contenuta nella libreria GDI32.dll che permette il trasferimento di una sezione rettangolare di un'immagine, in un'altra area rettangolare di pari dimensioni. Questo permette di eseguire tutte le operazioni tipiche delle applicazioni grafiche come ad esempio Copia, Incolla, Taglia.
La prima cosa importante da tenere a mente è che Visual Basic non riconosce quando state invocando la funzione: se infatti state tentando di compiere un'operazione utilizzando BitBlt su un'immagine (la cosiddetta bltting operation), la cui proprietà AutoRedraw è settata su True, dovrete necessariamente richiamare un Refresh dell'immagine in modo tale da permettere al programma di effettuare l'aggiornamento dell'immagine. Infatti quando la proprietà AutoRedraw è impostata su True, il sistema colloca l'immagine contenuta nella PictureBox (la cosiddetta persistant bitmap) in memoria e dunque tutte le modifiche potranno essere apportate solamente all'immagine esistente in memoria e non su quella che si vede sullo schermo. Per poter eseguire modifiche sull'immagine visibile bisogna, come già detto, dire al sistema operativo di aggiornare l'immagine visibile con quella presente in memoria. Per fare ciò basta un semplicissimo:

'aggiorna l'immagine di destinazione
Picture2.Refresh


Dichiarazioni generali (Modulo):
Il codice seguente mostra le dichiarazioni generali da inserire in un modulo (scopo globale), in modo che siano richiamate da ogni parte del codice.

'indica l'obbligo di dichiarazione di tutte le variabili
Option Explicit
'comincia l'elenco delle costanti
Public Enum RasterOps
'copia l'immagine primitiva nell'immagine di destinazione
SRCCOPY = &HCC0020
'combina i pixel dell'immagine di destinazione con quelli 'dell'immagine di partenza usando l'operatore Booleano AND
SRCAND = &H8800C6
'combina i pixel dell'immagine di destinazione con quelli 'dell'immagine di partenza usando l'operatore Booleano XOR
SRCINVERT = &H660046
'combina i pixel dell'immagine di destinazione con quelli 'dell'immagine di partenza usando l'operatore Booleano OR
SRCPAINT = &HEE0086
'inverte l'immagine di destinazione e la combina con l'immagine di partenza usando l'operatore Booleano AND
SRCERASE = &H4400328
'rende completamente bianca l'immagine di destinazione
WHITENESS = &HFF0062
'rende completamente nera l'immagine di destinazione
BLACKNESS = &H42
End Enum
'dichiarazioni pubbliche della funzione BitBlt
Declare Function BitBlt Lib "gdi32" ( _
ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As RasterOps _
) As Long

Passiamo oltre le costanti elencate, quelle cioè comprese tra Public Enum ed End Enum e concentriamoci sulle vere dichiarazioni della funzione BitBlt. Prendiamo in considerazione i parametri della funzione ed in particolare:

ByVal hDestDC As Long, _
..
ByVal hSrcDC As Long, _

Gli oggetti della tabella soprastante sono rispettivamente l'oggetto di destinazione (hDC) e l'oggetto sorgente o primitivo (hSrcDC). Ciò significa che la funzione BitBlt trasferirà un'immagine passandola da un'area di memoria ad un'altra. Il sistema operativo avrà però bisogno di essere informato sulla posizione nella quale troverà l'immagine di partenza e quella nella quale trasferirla. E sarà proprio allora che l'hDC entrerà in gioco. Che cosa vuol dire hDC? Il sistema operativo assegna un contesto univoco ad ogni controllo PictureBox dell'applicazione che si sta sviluppando. Si può quindi usare l'hDC per riferirsi al contesto univoco assegnato ad ogni PictureBox. Questo passerà un valore che sarà poi trasferito alla funzione API.
Non è quindi sufficiente utilzzare un'istruzione del tipo:

BitBlt Picture2 From Picture1

Quello che invece potremo fare è una cosa del genere:

BitBlt Picture2.hDC from Picture1.hDC

Tavola dei parametri della funzione BitBlt

'l'hDC dell'oggetto (l'hDC della PictureBox di destinazione) sul 'quale le modifiche apportate dalla funzione BitBlt verranno 'applicate
ByVal hDestDC As Long
'le coordinate "Left" del rettangolo di destinazione
ByVal x As Long
'le coordinate "Top" del rettangolo di destinazione
ByVal y As Long
'la lunghezza del rettangolo di destinazione
ByVal nWidth As Long
'l'altezza del rettangolo di destinazione
ByVal nHeight As Long
'l'hDC dell'oggetto (l'hDC della PictureBox) di partenza
ByVal hSrcDC As Long
'le coordinate "Left" del rettangolo (PictureBox) di partenza
ByVal xSrc As Long
'le coordinate "Top" del rettangolo (PictureBox) di partenza
ByVal ySrc As Long
'specifica l'operazione che deve essere compiuta
ByVal dwRop As Long

Diamo ora un'occhiata ai parametri seguenti, cioè x e y:

ByVal x As Long, _
..
ByVal y As Long, _

I parametri x ed y permettono di specificare l'esatta posizione dell'oggetto di destinazione in cui trasferire l'immagine di partenza, proprio come qualsiasi altro oggetto all'interno di un secondo oggetto contenitore (ad esempio una label all'interno di una Form. Dunque x ed y hanno in pratica le stesse funzionalità dei parametri Left e Top. Tuttavia, se si vuole essere precisi, non sono la stessa cosa. Ecco perchè conviene fare riferimento al seguente specchietto riassuntivo:
  • x indica la distanza compresa tra il limite sinistro dell'oggetto di destinazione e le coordinate dell'estrema sinistra della posizione nella quale si vuole inserire l'immagine originaria
  • y indica la distanza compresa tra il limite superiore dell'oggetto di destinazione e le coordinate superiori della posizione nella quale si vuole inserire l'immagine originaria

    C'è una sola cosa da tenere bene in mente quando si impostano i valori di x ed y e cioè che la loro unità di misura è settata in pixels e non in pollici o in centimetri.

    Vediamo adesso i parametri:

    ByVal xSrc As Long, _
    ..
    ByVal ySrc As Long, _

    xSrc e ySrc permettono di individuare la posizione dei pixels all'interno dell'immagine sorgente che devono essere trasferiti in memoria. Quindi rappresentano una specifica ancora maggiore e più profonda rispetto ai parametri x ed y. Inoltre si possono indicare nello stesso modo che abbiamo già visto per x ed y:
  • xSrc indica la distanza compresa tra il limite sinistro dell'oggetto di destinazione e le coordinate dell'estrema sinistra della posizione nella quale si vuole inserire l'immagine originaria
  • ySrc indica la distanza compresa tra il limite superiore dell'oggetto di destinazione e le coordinate superiori della posizione nella quale si vuole inserire l'immagine originaria

    Notare che anche i valori xSrc ed ySrc sono rappresentati in unità di misura pixels.

    I successivi parametri da vedere sono:

    ByVal nWidth As Long, _
    ..
    ByVal nHeight As Long, _

    Come avrete già capito nWidth ed nHeight rappresentano le dimensioni del rettangolo di partenza che si "stacca" dall'oggetto sorgente che deve essere trasferito in memoria. Adesso che i parametri che definiscono sorgente e destinazione sono stati studiati, vediamo il modo in cui il sistema operativo compie le operazioni che ci interessano, ossia quelle di trasferimento di pixels tra un'immagine visibile ed una locata in memoria. La funzione BitBlt permette un passaggio di pixel in molti modi, che possono essere controllati e specificati specificando l'operazione da compiere sull'immagine.
    Prendiamo in considerazione il seguente parametro:

    ByVal dwRop As RaserOps _


    La prima cosa da sapere è che il colore del pixel è un valore puramente numerico. Ciò significa che ogni operazione sui pixel è soggetto all'applicazione dei principi dell'Algebra Booleana.
    Il parametro in questione permette di specificare quale tipo di operazione compiere sia sull'immagine di partenza che su quella di destinazione. Vediamo le operazioni più comuni:

    'copia nella sua interezza la bitmap di partenza in quella di destinazione
    SRCCOPY
    'combina i pixels della bitmap di destinazione con 'quelli della bitmap di partenza, usando l'operatore 'algebrico AND
    SRCAND
    'esegue l'operazione descritta sopra utilizzando 'questa volta l'operatore algebrico XOR
    SRCINVERT
    'esegue l'operazione descritta sopra utilizzando 'questa volta l'operatore algebrico OR
    SRCPAINT

    Facciamo un breve esempio per capire meglio come si comporta BitBlt in presenza di questo o di quell'operatore algebrico.
    Se il pixel dell'immagine di partenza è bianco e lo si vuole sovrapporre ad un pixel nero dell'immagine di destinazione, i parametri appena sopra elencati daranno questi risultati:
  • SRCCOPY: il pixel di partenza sostituirà quello di destinazione che di conseguenza diventerà bianco
  • SRCAND: il pixel di destinazione rimarrà nero
  • SRCINVERT: il pixel di destinazione diventerà bianco
  • SRCPAINT: il pixel di destinazione diventerà bianco

    Un'ultima considerazione: non si possono utilizzare in modo troppo disinvolto le notazioni .Top, .Height ecc. in quanto come già visto le unità di misura devono necessariamente corrispondere, in quanto il valore ritornato sarà espresso in Twips. Dunque bisognerà convertire tutta la misurazione degli oggetti in pixels. L'oggetto Screen è dotato di proprietà che consentono proprio quest'operazione ossia:

    Screen.TwipsPerPixelX
    'e
    Screen.TwipsPerPixelY

    Queste due proprietà ritornano il numero di Twips contenuti rispettivamente orizzontalmente e verticalmente in un Pixel, tenendo conto della risoluzione impostata dall'utente.
    Dunque per convertire un valore in Twips in Pixels basta dividere il valore in Twips per TwipsPerPixel_ . Ad esempio:

    Dim LngLeft As Long
    Dim LngTop As Long
    LngLeft = Form1.Left \ Screen.TwipsPerPixelsX
    LngTop = Form1.Top \ Screen.TwipsPerPixelsY

    Per finire ecco un esempio che potrete scaricare e consultare.

    Scarica qui l'esempio

  • Archivio:
    Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
    Proponi un argomento

    Visual Basic Italia© copyright 2000 - tutti i diritti riservati
    E-mail:
    vbitalia@libero.it