# DirectX/Altre funzioni Win32

DirectX
Copertina Tutti i moduli · Sviluppo
    CopertinaDirectX/Copertina
* Ripasso di matematicaDirectX/Ripasso di matematica
** Calcolo vettorialeDirectX/Calcolo vettoriale
** Calcolo matricialeDirectX/Calcolo matriciale
** TrasformazioniDirectX/Trasformazioni
* Creare il progetto con VS2010DirectX/Creare il progetto con VS2010
* InizializzazioneDirectX/Inizializzazione
** Win32
*** Creare la finestraDirectX/Creare la finestra
*** Terminale di debugDirectX/Terminale di debug
*** Message loopDirectX/Message loop
*** Altre funzioni Win32DirectX/Altre funzioni Win32
Modifica il sommario
In questo modulo potrete trovare delle funzioni non strettamente correlate al mondo della grafica, ma che comunque è sempre utile avere a portata di mano, per risparmiare tempo prezioso sprecato su Google.

## Cambiare il titolo della finestra

Se ben ricordate, il titolo della finestra era stato impostato in CreateWindow. Come facciamo a cambiarlo una volta che la finestra è stata aperta? Molto semplicemente:
Ricordo che hWnd è l'HANDLE della finestra a cui si vuole cambiare il titolo, ed il secondo argomento è il valore da impostare come titolo e presenta la L iniziale, per essere codificata come UTF-16.

## Cambiare icona

Una volta ottenuto un HANDLE ad icona, ossia un HICON e sufficiente questo codice:
SetClassLong è una funzione che va a modificare la classe WNDCLASSEX, dopo che già è stata registrata. In realtà dovrebbe modificare l'area di memoria extra allocata dopo la classe (impostata su richiesta con il membro cbClsExtra). Ma passando offset negativi, andremo a modificare la classe stessa. SetClassLong tuttavia funzionerebbe correttamente solo su sistemi a 32 bit. SetClassLongPtr è stata creata per compatibilità con i sistemi 64 bit, ma funzionerà anche con quelli a 32 bit.
GCLP_HICON e GCLP_HICONSM, sono dei valori interi negativi che indicano l'offset dell'area dati successiva alla classe. Essendo negativi però vanno a modificare la classe stessa. In particolare i valori hIcon e hIconSm. Icon è il nostro HANDLE che deve essere portato a tipo LONG.

### Caricare l'icona

Ecco come ottenere un HANDLE ad icona:
* Il primo LoadIcon caricherà una icona predefinita tra quelle di Windows. Per un elenco delle icone predefinite, vedete qui.
* Il secondo LoadIcon che vuole come primo parametro hInstance, carica una icona creata come risorsa del progetto. Questo è un argomento complesso che non rientra nell'argomento di questo libro.
* Infine LoadImage, preferito su LoadIcon. Come parametri prende, il solito hInstance, il percorso completo dell'icona (UTF-16), il tipo di immagine (IMAGE_ICON, IMAGE_BITMAP, IMAGE_CURSOR), le dimensioni desiderate (width, height), e delle flag.
Quando viene caricata un'immagine di tipo IMAGE_ICON o IMAGE_CURSOR, si lasciano entrambe le dimensioni a zero e tra le flags si trova anche LR_DEFAULTSIZE, Windows caricherà quella determinata immagine con le dimensioni adatte ad una Icona od un Cursore.

## Cambiare cursore

Il processo per cambiare il cursore è analogo a quello per cambiare l'icona. Si carica un'immagine con LoadImage di tipo IMAGE_CURSOR, e usando SetClassLongPtr la si imposta alla finestra:
Come per l'icona è anche possibile fare uso di LoadCursor, che utilizzere principalmente per i cursori predefiniti:
Per un elenco più dettagliato vedere qui.

## Spostare e ridimensionare la finestra

Per entrambi gli scopi esiste un'unica funzione: SetWindowPos. Questa funzione consente di spostare, ridimensionare, mostrare e nascondere una finestra con un solo comando. La sintassi è:
* hWnd: è l'HANDLE della finestra da spostare.
* X, Y: sono le nuove coordinate della finestra nello schermo.
* cx, cy: sono le nuove dimensioni della finestra.
* hInsertAfter serve per controllare l'ordine delle finestre. Impostandolo ad HWND_TOP, la finestra apparirà in primo piano, con HWND_BOTTOM, la finestra sarà nascosta da tutte le altre. Specificando un HANDLE di un'altra finestra, la nostra sarà appena sopra quella specificata.
* flags: con questo parametro possiamo escludere, il movimento, o il ridimensionamento, insomma possiamo scegliere quale delle tre funzioni usare, o farle usare tutte. Per esempio con SWP_NOMOVE, X ed Y sono ignorati. Con SWP_NOSIZE vengono ignorati cx e cy, mentre con SWP_NOZORDER, viene mantenuta la posizione relativa alle altre finestre, ignorando hInsertAfter. Un ulteriore flage SWP_NOACTIVATE. Normalmente SetWindowPos invia un messaggio di tipo WM_ACTIVATE alla finestra. Usando questa flag evitiamo questo effetto indesiderato.
In definitiva:
Sono disponibili altre flags e valori di hInsertAfter, ma qui non verranno trattati. Li troverete qui.