DirectX/Altre funzioni Win32: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
FrescoBot (discussione | contributi)
m Bot: apostrofo dopo l'articolo indeterminativo
m Update syntaxhighlight tags - remove use of deprecated <source> tags
 
Riga 4:
== 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:
<sourcesyntaxhighlight lang="cpp">
SetWindowText(hWnd, L"Nuovo titolo");
</syntaxhighlight>
</source>
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:
<sourcesyntaxhighlight lang="cpp">
// Per l'icona principale
SetClassLongPtr(hWnd, GCLP_HICON, (LONG) Icon);
// Per la small icon
SetClassLongPtr(hWnd, GCLP_HICONSM, (LONG) Icon);
</syntaxhighlight>
</source>
''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.
 
Riga 23:
=== Caricare l'icona ===
Ecco come ottenere un HANDLE ad icona:
<sourcesyntaxhighlight lang="cpp">
// LoadIcon per icone predefinite:
HICON Icon = LoadIcon(NULL, IDI_ERROR);
Riga 30:
// LoadImage per immagini generiche:
HICON Icon = (HICON) LoadImage(hInstance, L"C:\\Percorso\\Della\\Immagine.png", IMAGE_ICON, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
</syntaxhighlight>
</source>
*Il primo ''LoadIcon'' caricherà una icona predefinita tra quelle di Windows. Per un elenco delle icone predefinite, vedete [http://msdn.microsoft.com/en-us/library/windows/desktop/ms648072(v=vs.85).aspx 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.
Riga 39:
== 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:
<sourcesyntaxhighlight lang="cpp">
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);
</syntaxhighlight>
</source>
Come per l'icona è anche possibile fare uso di ''LoadCursor'', che utilizzere principalmente per i cursori predefiniti:
<sourcesyntaxhighlight lang="cpp">
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
// ...
</syntaxhighlight>
</source>
Per un elenco più dettagliato vedere [http://msdn.microsoft.com/en-us/library/windows/desktop/ms648391(v=VS.85).aspx 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 è:
<sourcesyntaxhighlight lang="cpp">
SetWindowPos(HWND hWnd, HWND hInsertAfter, int X, int Y, int cx, int cy, UINT flags);
</syntaxhighlight>
</source>
*hWnd: è l'HANDLE della finestra da spostare.
*X, Y: sono le nuove coordinate della finestra nello schermo.
Riga 64:
 
In definitiva:
<sourcesyntaxhighlight lang="cpp">
SetWindowPos(hWnd, NULL, 0, 0, nuovaLarghezza, nuovaAltezza, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); // Ridimensiona ma non sposta
SetWindowPos(hWnd, NULL, nuovoX, nuovoY, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); // Sposta ma non ridimensiona
SetWindowPos(hWnd, HWND_TOP, nuovoX, nuovoY, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE); // Sposta e porta in primo piano ma non ridimensiona
SetWindowPos(hWnd, HWND_BOTTOM, nuovoX, nuovoY, nuovaLarghezza, nuovaAltezza, SWP_NOACTIVATE); // Sposta, ridimensiona e nasconde sotto le altre finestre.
</syntaxhighlight>
</source>
Sono disponibili altre flags e valori di hInsertAfter, ma qui non verranno trattati. Li troverete [http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx qui].