Informazioni sugli elenchi di immagini
Un elenco di immagini è una raccolta di immagini con le stesse dimensioni, ognuna delle quali può essere definita dal relativo indice. Gli elenchi di immagini vengono usati per gestire in modo efficiente set di icone o bitmap di grandi dimensioni. Tutte le immagini in un elenco di immagini sono contenute in un'unica bitmap estesa in formato dispositivo schermo. Un elenco di immagini può includere anche una bitmap monocromatica che contiene maschere usate per disegnare immagini in modo trasparente (stile icona).
L'API Microsoft Win32 fornisce funzioni e macro di elenco immagini che consentono di creare ed eliminare elenchi di immagini, aggiungere e rimuovere immagini, sostituire e unire immagini, disegnare immagini e trascinare immagini. Per usare le funzioni dell'elenco di immagini, includere il file di intestazione di controllo comune nei file del codice sorgente e collegarsi alla libreria di esportazione dei controlli comune. Inoltre, prima di chiamare qualsiasi funzione di elenco di immagini, usare la funzione InitCommonControls o InitCommonControlsEx per assicurarsi che la DLL del controllo comune venga caricata.
In questa sezione vengono illustrati gli argomenti seguenti:
- Tipi
- Creazione ed eliminazione di elenchi di immagini
- Aggiunta e rimozione di immagini
- Sostituzione e unione di immagini
- Disegno di immagini
- Trascinamento di immagini
- Informazioni sull'immagine
- Sovrapposizioni di immagini
- Icone antialiased a 32 bit
Tipi
Esistono due tipi di elenchi di immagini: non mascherati e mascherati. Un elenco di immagini non mascherate è costituito da una bitmap a colori che contiene una o più immagini. Un elenco di immagini mascherate è costituito da due bitmap di dimensioni uguali. Il primo è una bitmap a colori che contiene le immagini e la seconda è una bitmap monocromatica che contiene una serie di maschere, una per ogni immagine nella prima bitmap.
Quando viene disegnata un'immagine non mascherata, viene semplicemente copiata nel contesto del dispositivo di destinazione; ovvero viene disegnato sul colore di sfondo esistente del contesto di dispositivo. Quando viene disegnata un'immagine mascherata, i bit dell'immagine vengono combinati con i bit della maschera, producendo in genere aree trasparenti nella bitmap in cui viene visualizzato il colore di sfondo del contesto di dispositivo di destinazione. Esistono diversi stili di disegno che è possibile specificare quando si disegna un'immagine mascherata. Ad esempio, è possibile specificare che l'immagine sia dithering per indicare un oggetto selezionato.
Creazione ed eliminazione di elenchi di immagini
Per creare un elenco di immagini, chiamare la funzione ImageList_Create. I parametri includono il tipo di elenco di immagini da creare, le dimensioni di ogni immagine e il numero di immagini che si intende aggiungere all'elenco. Per un elenco di immagini non mascherate, la funzione crea una singola bitmap sufficientemente grande da contenere il numero specificato di immagini delle dimensioni specificate. Crea quindi un contesto di dispositivo compatibile con lo schermo e seleziona la bitmap. Per un elenco di immagini mascherate, la funzione crea due bitmap e due contesti di dispositivo compatibili con lo schermo. Seleziona la bitmap dell'immagine in un contesto di dispositivo e la bitmap mask nell'altra. La DLL di controllo comune contiene il codice eseguibile per le funzioni dell'elenco di immagini.
In ImageList_Create specificare il numero iniziale di immagini che saranno incluse in un elenco di immagini e il numero di immagini in base al quale l'elenco può aumentare. Quindi, se si tenta di aggiungere più immagini di quanto inizialmente specificato, l'elenco di immagini aumenta automaticamente per contenere le nuove immagini.
Se ImageList_Create ha esito positivo, restituisce un handle al tipo HIMAGELIST. Questo handle viene usato in altre funzioni dell'elenco di immagini per accedere all'elenco di immagini e gestire le immagini. È possibile aggiungere e rimuovere immagini, copiare immagini da un elenco di immagini a un altro e unire immagini da due elenchi di immagini diversi. Quando non è più necessario un elenco di immagini, è possibile eliminarlo specificando il relativo handle in una chiamata alla funzione ImageList_Destroy.
Aggiunta e rimozione di immagini
È possibile aggiungere immagini bitmap, icone o cursori a un elenco di immagini. È possibile aggiungere immagini bitmap specificando gli handle a due bitmap in una chiamata alla funzione ImageList_Add. La prima bitmap contiene una o più immagini da aggiungere alla bitmap dell'immagine e la seconda bitmap contiene le maschere da aggiungere alla bitmap mask. Per gli elenchi di immagini non mascherate, il secondo handle bitmap viene ignorato; può essere impostato su NULL.
La funzione ImageList_AddMasked aggiunge anche immagini bitmap a un elenco di immagini mascherate. Questa funzione è simile a ImageList_Add, ad eccezione del fatto che non si specifica una bitmap mask. Specificare invece un colore combinato dal sistema con la bitmap dell'immagine per generare automaticamente le maschere. Ogni pixel del colore specificato nella bitmap dell'immagine viene modificato in nero e il bit corrispondente nella maschera è impostato su 1. Di conseguenza, qualsiasi pixel nell'immagine che corrisponde al colore specificato è trasparente quando viene disegnata l'immagine.
La macro ImageList_AddIcon aggiunge un'icona o un cursore a un elenco di immagini. Se l'elenco di immagini è mascherato, ImageList_AddIcon aggiunge la maschera fornita con l'icona o il cursore alla bitmap mask. Se l'elenco di immagini non è mascherato, la maschera per l'icona o il cursore non viene utilizzata durante il disegno dell'immagine.
È possibile creare un'icona basata su un'immagine e una maschera in un elenco di immagini usando la funzione ImageList_GetIcon. La funzione restituisce l'handle alla nuova icona.
ImageList_Add, ImageList_AddMasked e ImageList_AddIcon assegnare un indice a ogni immagine man mano che viene aggiunta a un elenco di immagini. Gli indici sono in base zero; ovvero, la prima immagine nell'elenco ha un indice pari a zero, la successiva ha un indice di uno e così via. Dopo aver aggiunto una singola immagine, le funzioni restituiscono l'indice dell'immagine. Quando vengono aggiunte più immagini alla volta, le funzioni restituiscono l'indice della prima immagine.
La funzione ImageList_Remove rimuove un'immagine da un elenco di immagini.
Sostituzione e unione di immagini
Le funzioni ImageList_Replace e ImageList_ReplaceIcon sostituiscono un'immagine in un elenco di immagini con una nuova immagine. ImageList_Replace sostituisce un'immagine con un'immagine e una maschera bitmap e ImageList_ReplaceIcon sostituisce un'immagine con un'icona o un cursore.
La funzione ImageList_Merge unisce due immagini, archiviando la nuova immagine in un nuovo elenco di immagini. La nuova immagine viene creata disegnando la seconda immagine in modo trasparente sulla prima. La maschera per la nuova immagine è il risultato dell'esecuzione di un'operazione OR logica sui bit delle maschere per le due immagini esistenti.
Disegno di immagini
Per disegnare un'immagine, usare la funzione ImageList_Draw o ImageList_DrawEx. Specificare l'handle per un elenco di immagini, l'indice dell'immagine da disegnare, l'handle nel contesto del dispositivo di destinazione, una posizione all'interno del contesto di dispositivo e uno o più stili di disegno.
Quando si specifica lo stile ILD_TRANSPARENT, ImageList_Draw o ImageList_DrawEx usa un processo in due passaggi per disegnare un'immagine mascherata. In primo luogo, esegue un'operazione AND logica sui bit dell'immagine e sui bit della maschera. Esegue quindi un'operazione XOR logica sui risultati della prima operazione e sui bit in background del contesto del dispositivo di destinazione. Questo processo consente di creare aree trasparenti nell'immagine risultante; ovvero ogni bit bianco nella maschera rende trasparente il bit corrispondente nell'immagine.
Prima di disegnare un'immagine mascherata su uno sfondo a tinta unita, è necessario utilizzare la funzione ImageList_SetBkColor per impostare il colore di sfondo dell'elenco di immagini sullo stesso colore della destinazione. L'impostazione del colore elimina la necessità di creare aree trasparenti nell'immagine e consente a ImageList_Draw o ImageList_DrawEx di copiare semplicemente l'immagine nel contesto del dispositivo di destinazione, con conseguente aumento significativo delle prestazioni. Per disegnare l'immagine, specificare lo stile di ILD_NORMAL in una chiamata a ImageList_Draw o ImageList_DrawEx.
È possibile impostare il colore di sfondo per un elenco di immagini mascherate in qualsiasi momento in modo da disegnare correttamente su qualsiasi sfondo a tinta unita. Impostando il colore di sfondo su CLR_NONE le immagini vengono disegnate in modo trasparente per impostazione predefinita. Per recuperare il colore di sfondo di un elenco di immagini, usare la funzione ImageList_GetBkColor.
Gli stili ILD_BLEND25 e ILD_BLEND50 dither l'immagine con il colore di evidenziazione del sistema. Questi stili sono utili se si utilizza un'immagine mascherata per rappresentare un oggetto che l'utente può selezionare. Ad esempio, è possibile usare lo stile ILD_BLEND50 per disegnare l'immagine quando l'utente lo seleziona.
Un'immagine non mascherata viene copiata nel contesto del dispositivo di destinazione usando l'operazione di raster SRCCOPY. I colori dell'immagine hanno lo stesso aspetto indipendentemente dal colore di sfondo del contesto del dispositivo. Anche gli stili di disegno specificati in ImageList_Draw o ImageList_DrawEx non hanno alcun effetto sull'aspetto di un'immagine non mascherata.
Trascinamento di immagini
L'API Win32 include funzioni per il trascinamento di un'immagine sullo schermo. Le funzioni di trascinamento spostano un'immagine in modo uniforme, a colori e senza lampeggiare del cursore. Le immagini mascherate e non mascherate possono essere trascinate.
La funzione ImageList_BeginDrag avvia un'operazione di trascinamento. I parametri includono l'handle per l'elenco di immagini, l'indice dell'immagine da trascinare e la posizione del punto critico all'interno dell'immagine. Il punto critico è un singolo pixel che le funzioni di trascinamento riconoscono come la posizione esatta dello schermo dell'immagine. In genere, un'applicazione imposta il punto attivo in modo che coincida con il punto attivo del cursore del mouse. La funzione ImageList_DragMove sposta l'immagine in una nuova posizione.
La funzione ImageList_DragEnter imposta la posizione iniziale dell'immagine di trascinamento all'interno di una finestra e disegna l'immagine nella posizione. I parametri includono l'handle della finestra in cui disegnare l'immagine e le coordinate della posizione iniziale all'interno della finestra. Le coordinate sono relative all'angolo superiore sinistro della finestra, non all'area client. Lo stesso vale per tutte le funzioni di trascinamento delle immagini che accettano coordinate come parametri. Ciò significa che è necessario compensare la larghezza degli elementi della finestra, ad esempio il bordo, la barra del titolo e la barra dei menu quando si specificano le coordinate. Se si specifica un handle di finestra NULL quando si chiama ImageList_DragEnter, le funzioni di trascinamento disegnano l'immagine nel contesto di dispositivo associato alla finestra desktop e le coordinate sono relative all'angolo superiore sinistro dello schermo.
La funzione ImageList_SetDragCursorImage crea una nuova immagine di trascinamento combinando l'immagine specificata (in genere un'immagine del cursore del mouse) con l'immagine di trascinamento corrente. Poiché le funzioni di trascinamento usano la nuova immagine durante un'operazione di trascinamento, è consigliabile usare la funzione ShowCursor per nascondere il cursore effettivo del mouse dopo aver chiamato ImageList_SetDragCursorImage. In caso contrario, il sistema potrebbe avere due cursori del mouse per la durata dell'operazione di trascinamento.
Quando un'applicazione chiama ImageList_BeginDrag, il sistema crea un elenco di immagini interno temporaneo e quindi copia l'immagine di trascinamento specificata nell'elenco interno. È possibile recuperare l'handle nell'elenco di immagini di trascinamento temporaneo usando la funzione ImageList_GetDragImage. La funzione recupera anche la posizione di trascinamento corrente e l'offset dell'immagine di trascinamento rispetto alla posizione di trascinamento.
Informazioni sull'immagine
Esistono diverse funzioni che recuperano informazioni da un elenco di immagini. La funzione ImageList_GetImageInfo riempie una struttura IMAGEINFO con informazioni su una singola immagine, inclusi gli handle delle bitmap di immagine e maschera, il numero di piani di colore e bit per pixel e il rettangolo di delimitazione dell'immagine all'interno della bitmap dell'immagine. È possibile usare queste informazioni per modificare direttamente le bitmap per l'immagine. La funzione ImageList_GetImageCount recupera il numero di immagini in un elenco di immagini.
Sovrapposizioni di immagini
Ogni elenco di immagini include un elenco di indici da usare come sovrimpressioni. Una sovrimpressione è un'immagine disegnata in modo trasparente su un'altra immagine. Qualsiasi immagine attualmente presente nell'elenco di immagini può essere usata come sovrimpressione. È possibile specificare fino a quattro sovrimpressioni per ogni elenco di immagini. Questo limite è stato esteso a 15 nella versione 4.71.
Aggiungere l'indice di un'immagine all'elenco di sovrimpressioni usando la funzione ImageList_SetOverlayImage , specificando l'handle per l'elenco di immagini, l'indice dell'immagine esistente e l'indice di sovrimpressione desiderato. In questo modo, in effetti, indica all'elenco di immagini che "l'immagine in corrispondenza dell'indice x può essere usata come sovrimpressione e voglio fare riferimento alla sovrimpressione come indice di sovrapposizione y". Gli indici di sovrimpressione sono in base uno anziché in base zero perché un indice di sovrapposizione pari a zero indica che non verrà usata alcuna sovrimpressione.
Si specifica una sovrimpressione quando si disegna un'immagine con la funzione ImageList_Draw o ImageList_DrawEx. La sovrimpressione viene specificata eseguendo un'operazione OR logica tra i flag di disegno desiderati e il risultato della macro INDEXTOOVERLAYMASK. La macro INDEXTOOVERLAYMASK accetta l'indice di sovrapposizione e la formatta per l'inclusione con i flag per queste funzioni. Verrà disegnare l'immagine con la sovrimpressione specificata. Nell'esempio seguente viene illustrato come viene aggiunta e specificata una sovrimpressione durante il disegno dell'immagine.
ImageList_SetOverlayImage(himl, 0, 3);
ImageList_Draw(himl, 1, hdc, 0, 0, ILD_MASK | INDEXTOOVERLAYMASK(3));
Verrà disegnare l'immagine 1 e quindi sovrapporre l'immagine con l'immagine 0. Poiché 3 è l'indice di sovrimpressione specificato nella chiamata ImageList_SetOverlayImage, 3 viene inserito nella macro INDEXTOOVERLAYMASK.
Icone antialiased a 32 bit
L'antialiasing è una tecnica per ammorbidire o offuscare i bordi taglienti. In questo modo le immagini hanno un aspetto più naturale. Gli elenchi di immagini in Windows Vista e Windows 7 supportano l'uso di icone e bitmap antialiased a 32 bit. I valori di colore usano 24 bit e 8 bit vengono usati come canale alfa sulle icone. Per creare un elenco di immagini in grado di gestire un'immagine a 32 bit per pixel (bpp), chiamare la funzione ImageList_Create , passando un flag di ILC_COLOR32.
Per creare correttamente icone a 32 bit, è necessario creare più immagini per ogni icona, come illustrato nella figura seguente.
- Le prime tre immagini sono in modalità a 16 colori per l'uso in modalità provvisoria.
- Le tre icone successive vengono usate in modalità a colori 256.
- Le ultime tre icone hanno il canale alfa e possono essere usate solo nei sistemi operativi che eseguono il colore a 24 bit o superiore.
- L'ordine delle immagini nel formato icona è importante. Se l'ordine non è corretto, le versioni precedenti di Windows funzionano male durante l'estrazione delle icone. L'estrazione non corretta delle icone può causare il danneggiamento della memoria e il rendering non corretto.
- Le versioni precedenti di Windows avevano un limite di risorse a 10 icone.
Nota
È possibile usare strumenti di terze parti per generare file icona e bitmap che contengono un canale alfa. Se si usa LoadImage per caricare una bitmap a 32 bpp contenente alfa, è necessario specificare il flag LR_CREATEDIBedizione Standard CTION.