DirectX/Altre funzioni Win32: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nuova pagina: {{DirectX}} 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 risparmia...
(Nessuna differenza)

Versione delle 10:06, 13 ott 2011

Indice del libro

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:

SetWindowText(hWnd, L"Nuovo titolo");

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:

// Per l'icona principale
SetClassLongPtr(hWnd, GCLP_HICON, (LONG) Icon);
// Per la small icon
SetClassLongPtr(hWnd, GCLP_HICONSM, (LONG) Icon);

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:

// LoadIcon per icone predefinite:
HICON Icon = LoadIcon(NULL, IDI_ERROR);
// LoadIcon per icone create nelle risorse (non spiegato in questo libro):
HICON Icon = LoadIcon(hInstance, L"NomeDellaRisorsa");
// LoadImage per immagini generiche:
HICON Icon = (HICON) LoadImage(hInstance, L"C:\\Percorso\\Della\\Immagine.png", IMAGE_ICON, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
  • 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:

HCURSOR Cursor = (HCURSOR) LoadImage(hInstance, L"C:\\Percorso\\Del\\Cursore.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
SetClassLongPtr(hWnd, GCLP_HCURSOR, (LONG) Cursor);

Come per l'icona è anche possibile fare uso di LoadCursor, che utilizzere principalmente per i cursori predefiniti:

LoadCursor(NULL, IDC_ARROW);    // Freccia normale
LoadCursor(NULL, IDC_WAIT);     // Clessidra fino a Windows XP, cerchio blu di attesa da Vista in poi
LoadCursor(NULL, IDC_HAND);     // Manina dei link
// ...

Per un elenco più dettagliato vedere qui.