DirectX/Altre funzioni Win32: differenze tra le versioni
m Bot: apostrofo dopo l'articolo indeterminativo |
m Update syntaxhighlight tags - remove use of deprecated <source> tags |
||
Riga 4: | Riga 4: | ||
== Cambiare il titolo della finestra == |
== 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: |
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: |
||
< |
<syntaxhighlight lang="cpp"> |
||
SetWindowText(hWnd, L"Nuovo titolo"); |
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. |
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 == |
== Cambiare icona == |
||
Una volta ottenuto un HANDLE ad icona, ossia un HICON e sufficiente questo codice: |
Una volta ottenuto un HANDLE ad icona, ossia un HICON e sufficiente questo codice: |
||
< |
<syntaxhighlight lang="cpp"> |
||
// Per l'icona principale |
// Per l'icona principale |
||
SetClassLongPtr(hWnd, GCLP_HICON, (LONG) Icon); |
SetClassLongPtr(hWnd, GCLP_HICON, (LONG) Icon); |
||
// Per la small icon |
// Per la small icon |
||
SetClassLongPtr(hWnd, GCLP_HICONSM, (LONG) 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. |
''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: | Riga 23: | ||
=== Caricare l'icona === |
=== Caricare l'icona === |
||
Ecco come ottenere un HANDLE ad icona: |
Ecco come ottenere un HANDLE ad icona: |
||
< |
<syntaxhighlight lang="cpp"> |
||
// LoadIcon per icone predefinite: |
// LoadIcon per icone predefinite: |
||
HICON Icon = LoadIcon(NULL, IDI_ERROR); |
HICON Icon = LoadIcon(NULL, IDI_ERROR); |
||
Riga 30: | Riga 30: | ||
// LoadImage per immagini generiche: |
// LoadImage per immagini generiche: |
||
HICON Icon = (HICON) LoadImage(hInstance, L"C:\\Percorso\\Della\\Immagine.png", IMAGE_ICON, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); |
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 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. |
*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: | Riga 39: | ||
== Cambiare 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: |
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: |
||
< |
<syntaxhighlight lang="cpp"> |
||
HCURSOR Cursor = (HCURSOR) LoadImage(hInstance, L"C:\\Percorso\\Del\\Cursore.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); |
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); |
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: |
Come per l'icona è anche possibile fare uso di ''LoadCursor'', che utilizzere principalmente per i cursori predefiniti: |
||
< |
<syntaxhighlight lang="cpp"> |
||
LoadCursor(NULL, IDC_ARROW); // Freccia normale |
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_WAIT); // Clessidra fino a Windows XP, cerchio blu di attesa da Vista in poi |
||
LoadCursor(NULL, IDC_HAND); // Manina dei link |
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]. |
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 == |
== 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 è: |
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 è: |
||
< |
<syntaxhighlight lang="cpp"> |
||
SetWindowPos(HWND hWnd, HWND hInsertAfter, int X, int Y, int cx, int cy, UINT flags); |
SetWindowPos(HWND hWnd, HWND hInsertAfter, int X, int Y, int cx, int cy, UINT flags); |
||
</syntaxhighlight> |
|||
</source> |
|||
*hWnd: è l'HANDLE della finestra da spostare. |
*hWnd: è l'HANDLE della finestra da spostare. |
||
*X, Y: sono le nuove coordinate della finestra nello schermo. |
*X, Y: sono le nuove coordinate della finestra nello schermo. |
||
Riga 64: | Riga 64: | ||
In definitiva: |
In definitiva: |
||
< |
<syntaxhighlight lang="cpp"> |
||
SetWindowPos(hWnd, NULL, 0, 0, nuovaLarghezza, nuovaAltezza, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); // Ridimensiona ma non sposta |
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, 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_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. |
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]. |
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]. |
||
Versione attuale delle 07:03, 19 apr 2020
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[modifica]
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[modifica]
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[modifica]
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[modifica]
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.
Spostare e ridimensionare la finestra[modifica]
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 è:
SetWindowPos(HWND hWnd, HWND hInsertAfter, int X, int Y, int cx, int cy, UINT flags);
- 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:
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.
Sono disponibili altre flags e valori di hInsertAfter, ma qui non verranno trattati. Li troverete qui.