Eseguire
una ricerca veloce nell' archivio delle risorse di Visual Basic
Italia®:
|
Preso
dall'archivio...
Premere il pulsante sotto per accedere direttamente ad un articolo
o ad un esempio preso in modo casuale dall'archivio.
|
Ultimo
e-book pubblicato:
"INTRODUZIONE
AI CSS"
Lo scopo del CSS language è quello di controllare lo
stile dei vari elementi che concorrono a formare un
documento HTML.
Si può operare in tre modi collegamento ad un foglio di stile
esterno;definizione degli stili all'inizio
del documento utilizzo della proprietà style all'interno
di un Tag HTML (embedded style). Questo e-book introduttivo
servirà per apprendere tali nozioni fondametali dei fogli
di stile.
Prezzo: € 0.0.
|
Contatti.
Utilizzare l'email generica per domande relative al sito:
oppure scrivere
ad un responsabile di area.
Responsabile
del sito: >Andrea
Martelli
Responsabile area "Corso di VB":
> Giorgio Abraini
|
|
|
|
DirectX8:
Applicazioni a tutto schermo o in modalità finestra (windowed) |
Visualizzare
un'applicazione a tutto schermo |
Gran
parte delle applicazioni che usano le DirectX sono dotate
di una modalità di visualizzazione a tutto schermo:
risulterebbe infatti piuttosto scomodo dover ridurre il campo
di lavoro per lasciare spazio alla barra delle applicazioni
ed alla barra del titolo.
Anche nel progetto sviluppato nell'articolo precedente si
aggiungerà tale modalità. Il passo da compiere
immediatamente è quello di permettere all'applicazione
di chiudersi. Questo perchè non essendoci più
controlli e pulsanti di chiusura nella modalità a tutto
schermo, si rischia di dover riavviare il computer per terminare
l'applicazione.
Dovrà essere aggiunto allora il seguente codice al
listato:
Private
Sub
Form_Click()
Unload Me
End Sub |
Questo
permette di terminare l'applicazione cliccando col mouse su
un qualsiasi punto dello schermo, proprio perchè la form
in questa modalità di visualizzazione ha le stesse dimensioni
dello schermo intero.
Il passo decisivo per compiere l'operazione in esame è
costituito dall'assegnazione di valori alle variabili Visualizzazione
(del tipo D3DDISPLAYMODE che cioè racchiude le informazioni
sulle modalità di visualizzazione delle immagini) e D3DWindow
(del tipo D3DPRESENT_PARAMETERS contiene i parametri di visualizzazione
della finestra di esecuzione dell'applicazione).
Ed in particolare questo tipo di operazione dovrà essere
compiuta all'interno della funzione Inizializza(), vedremo tra
poco in quale punto esatto:
With
Visualizzazione
.Format = D3DFMT_X8R8G8B8
.Width = 640
.Height = 480
End With
With D3DWindow
.SwapEffect = D3DSWAPEFFECT_FLIP
.BackBufferCount = 1
.BackBufferFormat = Visualizzazione.Format
.BackBufferHeight = 480
.BackBufferWidth = 640
.hDeviceWindow = Me.hWnd
End With |
Vediamo
di analizzare il blocco di codice. Le linee dalla seconda alla
quarta assegnano il formato all'immagine. Nella memoria nella
quale sono archiviate infatti le immagini hanno un formato che
può essere scelto e modificato a piacimento. E si parla
di formato non solo riguardo alla dimensione delle stesse (attraverso
le linee tre e quattro infatti si è impostata la dimensione
delle immagini su una grandezza di 640 pixel in larghezza e
480 in altezza, che come si vedrà, corrisponde proprio
alle dimensioni dello schermo intero) ma anche riguardo alla
loro definizione.
Il grado di definizione permette di indicare quanti bit di memoria
sono richiesti per visualizzare ogni singolo pixel di un'immagine.
Nel precedente articolo abbiamo già visto quali costanti
possono essere assegnate alla variabile. In questo caso la costante
D3DFMT_X8R8G8B8 indica che ogni pixel sarà visualizzato
attraverso 32 bit utilizzando un sistema di colori ARGB dove
cioè si considera oltre la combinazione rosso, blu e
verde, anche la trasparenza della figura.
La settima linea invece determina la procedura di visualizzazione
delle immagini. Indicando la costante D3DSWAPEFFECT_FLIP Direct3D
si considerano tutte le partizioni della memoria che contengono
le immagini ossia i backbuffer dove le immagini vengono archiviate
in attesa di essere visualizzate sullo schermo ossia nel frontbuffer.
Si viene così a formare una sequenza per la quale ad
ogni buffer viene assegnato un determinato indice da 0 ad n-1
(dove n corrisponde al totale dei buffer presenti e 0 corrisponde
al buffer che conteneva l'immagine visualizzata meno di recente):
Nell'esempio
in figura i buffer totali sono 3. Quindi n assumerà il
valore 3. L'ultimo buffer avrà dunque indice n - 1 =
3 - 1 = 2, il secondo n - 2 = 3 - 2 = 1 ed il primo, cioè
quello in attesa di essere visualizzato n - 3 = 3 - 3 = 0.
Questo sistema di rotazione servirà nella visualizzazione
delle immagini al richiamo del metodo Present dell'oggetto Direct3DDevice8
in modo tale che il FrontBuffer che contiene l'immagine correntemente
mostrata diventi l'ultimo backbuffer (indice n-1) ed il backbuffer
che aveva indice 0 adesso diventi il frontbuffer:
Sfortunatamente
però questo sistema di rotazione dei buffer può
implicare un uso della memoria al di sopra delle capacità
del processore. Ecco perchè è possibile indicare
una seconda costante ossia D3DSWAPEFFECT_DISCARD che utilizza
una sequenza molto simile a D3DSWAPEFFECT_FLIP ma che elimina
il buffer una volta visualizzata l'immagine.
Questo non permette di determinare il contenuto dei buffer una
volta visualizzati dal momento che vengono via via svuotati.
Molto più immediata è invece la sequenza creata
dalle costanti D3DSWAPEFFECT_COPY e D3DSWAPEFFECT_COPY_VSYNC
con le quali viene utilizzato solamente un backbuffer il cui
contenuto viene visualizzato immediatamente nel frontbuffer.
Ritornando al codice, l'ottava riga indica il numero di backbuffer
presenti, cioè uno che è il minimo per poter eseguire
correttamente l'applicazione.
Le linee nove, dieci e undici non fanno altro che impostare
le dimensioni delle immagini dei backbuffer con le quali verranno
poi visualizzate sullo schermo e la definizione delle stesse
in termini di bit per pixel. Notare che se la modalità
è a tutto schermo le dimensioni delle immagini devono
coincidere con quelle dello schermo. La penultima riga infine
determina a quale form applicare la visualizzazione a tutto
schermo.
Il codice sopra va inserito nella funzione Inizializza() in
modo che adesso appaia nel seguente modo:
Private
Function
Inizializza() As Boolean
Dim Visualizzazione As
D3DDISPLAYMODE
Dim D3DWindow As
D3DPRESENT_PARAMETERS
Set DX = New
DirectX8
Set D3D = DX.Direct3DCreate()
D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Visualizzazione
With Visualizzazione
.Format = D3DFMT_X8R8G8B8
.Width = 640
.Height = 480
End With
With D3DWindow
.SwapEffect = D3DSWAPEFFECT_FLIP
.BackBufferCount = 1
.BackBufferFormat = Visualizzazione.Format
.BackBufferHeight = 480
.BackBufferWidth = 640
.hDeviceWindow = Me.hWnd
End With
Set D3DDevice = D3D.CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, _
Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DWindow)
Inizializza = True
Exit Function
Errore:
Inizializza = False
End Function |
Se il codice funziona come dovrebbe, si visualizzerà
l'applicazione a tutto schermo come mostrato in figura:
Se
nella routine Form_Load si cambia invece il colore di fondo
della form si otterrà uno schermo del colore scelto.
E' inoltre possibile inserire controlli a piacimento gestendoli
come si farebbe normalmente con l'unica accortezza di estendere
al massimo il piano in fase di progettazione per adattare le
dimensioni della form allo schermo intero. In questo modo quando
si andranno a posizionare i controlli si potrà avere
un'idea migliore delle proporzioni finali.
Infine è buona norma svuotare alla chiusura dell'applicazione
quella porzione di memoria utilizzata dai vari oggetti (DirectX8,
Direct3D8, Direct3DDevice8 e tutti gli altri eventualmente presenti
nel progetto).
Nella routine Form_Unload() si dovrà inserire quindi
il seguente codice:
Private
Sub
Form_Unload(Cancel As Integer)
Set DX =
Nothing
Set D3D = Nothing
Set D3DDevice = Nothing
End Sub |
Scarica
qui
l'esempio completo per questo articolo
» "Full
screen DirectDraw programming"
|
|