DirectX/Creare la finestra: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
m Update syntaxhighlight tags - remove use of deprecated <source> tags
Riga 6:
== main ==
Dimenticate il caro vecchio ''main''. Quando si programma Win32 si usa '''WinMain'''. Un entry point di esempio è:
<sourcesyntaxhighlight lang="cpp">
#include <Windows.h>
 
Riga 13:
return 0;
}
</syntaxhighlight>
</source>
Argomenti:
* '''hInstance''' è un HANDLE, ossia un codice che identifica l'applicazione (una specie di Process ID - pid)
Riga 70:
=== Creazione della struttura ===
La struttura da creare è WNDCLASSEX. In questa struttura (detta classe) è contenuto quasi tutto il necessario a generare una finestra.
<sourcesyntaxhighlight lang="cpp">
struct WNDCLASSEX
{
Riga 86:
HICON hIconSm;
};
</syntaxhighlight>
</source>
* '''cbSize''' deve essere impostato a sizeof(WNDCLASSEX). Questo permette in futuro l'espansione della struttura stessa, mantenendo retrocompatibilità.
* '''style''' imposta alcuni parametri secondari della finestra. Generalmente useremo ''CS_HREDRAW | CS_VREDRAW''. Questa impostazione chiede a Windows di ridisegnare la finestra in caso di modifiche all'altezza ed alla larghezza.
Riga 101:
 
Riempiamo ora questa struttura:
<sourcesyntaxhighlight lang="cpp">
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
Riga 117:
wc.lpszClassName = L"DxTutorial1";
wc.hIconSm = NULL;
</syntaxhighlight>
</source>
'''ZeroMemory''' è la nostra prima API Win32. Non fa nient'altro che azzerare la memoria di una data struttura. Infatti:
<sourcesyntaxhighlight lang="cpp">
#define ZeroMemory(Destination, Length) memset(Destination, 0, Length);
</syntaxhighlight>
</source>
'''LoadIcon''' e '''LoadCursor''' vengono usate per generare HANDLE a icona e cursore partendo dal nome del file. In questo caso però anzichè usare il nome del file abbiamo usato delle costanti che rispondono a icone e cursori predefiniti. IDI_APPLICATION è l'icona di programma generico. IDC_ARROW è la freccia. Un altro cursore predefinito è IDC_WAIT (la clessidra fino a Windows XP, il cerchio blu di caricamento da Windows Vista in poi). Ultima particolarità: la '''L''' davanti a "DxTutorial1". Quella L indica al compilatore di codificare la stringa in UTF-16 e non come semplice stringa di ''char''.
 
A questo punto dobbiamo dare questi dati a Windows. Windows infatti terrà nella sua memoria interna questa struttura a cui noi ci riferiremo solo tramite il valore contenuto in ''lpszClassName'', o tramite il valore restituito da questa chiamata. Per dare in pasto questa struttura a Windows:
<sourcesyntaxhighlight lang="cpp">
ATOM res = RegisterClassEx(&wc);
if (!res)
Riga 132:
return -1;
}
</syntaxhighlight>
</source>
ATOM è un valore a 16bit che identifica internamente a Windows il valore di lpszClassName. Come se fosse un indice in un array di stringhe che contengono ''ClassName''s. A questo punto usare il valore dato da RegisterClassEx o il valore lpszClassName è equivalente. A noi basta sapere però che se il suo valore è 0, c'è stato un errore e che non si può andare avanti finché non l'avrete corretto.
 
=== Creare la finestra ===
Creiamo ora la finestra usando la classe appena registrata. La funzione da usare è:
<sourcesyntaxhighlight lang="cpp">
HWND WINAPI CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
</syntaxhighlight>
</source>
Non lasciamoci spaventare dal numero di argomenti (c'è di peggio in Direct3D) e vediamo cosa inserire:
* '''lpClassName''' qui andrà messo il valore lpszClassName della classe oppure il valore ''res'' ritornato da ''RegisterClassEx'' (con un cast a LPCTSTR)
Riga 152:
 
Quindi:
<sourcesyntaxhighlight lang="cpp">
HWND windowHandle = CreateWindow(L"DxTutorial1", L"Titolo della finestra", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
// In alternativa se preferite usare l'atom al posto della ClassName:
HWND windowHandle = CreateWindow((LPCTSTR) res, L"Titolo della finestra", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
</syntaxhighlight>
</source>
 
=== Mostrare la finestre ===
A questo punto dopo aver creato la finestra non ci resta che mostrarla con:
<sourcesyntaxhighlight lang="cpp">
ShowWindow(HWND hWnd, int nCmdShow);
</syntaxhighlight>
</source>
* '''hWnd''' è l'HANDLE alla finestra appena creata.
* '''nCmdShow''' indica come la finestra deve essere mostrata (ridotta ad icona, massimizzata, ecc.). Normalmente qui andrebbe passato l'argomento a WinMain ''nCmdShow'', ma noi abbiamo deciso di ignorare quel valore e passeremo SW_SHOWDEFAULT, che mostra una normalissima finestra davanti a voi.
 
Quindi:
<sourcesyntaxhighlight lang="cpp">
ShowWindow(windowHandle, SW_SHOWDEFAULT);
</syntaxhighlight>
</source>
 
== Conclusione ==
Riga 175:
 
Ecco il codice completo di questo modulo:
<sourcesyntaxhighlight lang="cpp">
#include <Windows.h>
#include <stdio.h>
Riga 209:
return 0;
}
</syntaxhighlight>
</source>
 
[[Categoria:DirectX|Creare la finestra]]