Newsgroup: it.comp.programmare.win32
Titolo: Opzioni finestra

Stò iniziando a fare pratica con le finestre, e ho due dubbi:
1) creando una finestra, anche non mettendo WM_CAPTION come stile (mettendo
magari 0), appare sempre la barra
2) come mai mostrando la finestra ingrandita passando SW_SHOWMAXIMIZED a
ShowWindow() draggando col mouse sulla barra posso spostare la finestra,
mentre negli altri programmi non succede? Come posso fare per tenerla
bloccata?
3) per cambiare in qualunque momento lo stato di una finestra (icona,
normale, esteso), ho provato a usare ShowWindow(), che funziona. Subito dopo
chiamo UpdateWindow(che, da quanto ne so dovrebbe mandare un messaggio
WM_PAINT per comandare il disegno dell'area client). Ho provato mettendole
nella window procedure per processare un messaggio LBUTTONDOWN, e alla
pressione del mouse nell'area client la finestra viene modificata, ma non
sembra che venga mandato il messaggio WM_PAINT dato che l'area client non
viene ridisegnata (c'è una scritta centrata verticalmente e orizzontalmente
nella finestra)
Grazie
--
Marco Iannaccone     
marc...@tin.it
ICQ: 18748121           Tolkien
"I've... seen things you people wouldn't believe. Attack ships on fire off
the shoulder of Orion.
I watched C-beams... glitter in the dark near the Tanhauser Gate. All
those... moments will be lost... in time..., like... tears... in... rain."
FAQ it.comp.lang.c: 
http://www.programmazione.it/linguaggi/c/itcomplangc.htm
FAQ it.comp.lang.c++: 
http://www.programmazione.it/linguaggi/c/lang_faq.htm

 ha scritto nel messaggio
news:8pg2mf$l18$1...@nslave1.tin.it...


 viene ridisegnata
La spiegazione e` quella che WM_PAINT aggiorna solo le regioni
invalidate della client. UpdateWindow() non invalida nulla, si limita a
spedire WM_PAINT; quindi prima devi chiamare InvalidateRect().
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/

 spedire WM_PAINT; quindi prima devi chiamare InvalidateRect().
Ok. Però, al momento della creazione della finestra, tutta l'area client è
gia invalidata, no?
Risulta logico quindi passare UpdateWindow() per mandare WM_PAINT, come in
tutti gli esempim che ho visto.
Come mai allora, anche senza gli stili della classe CS_HREDRAW e  CS_VREDRAW
anche senza UpdateWindow() il messaggio WM_PAINT viene mandato dopo la
creazione?
Inoltre, se la classe ha gli stili CS_HREDRAW | CS_VREDRAW, questo significa
che ad ogni ridimensionameto (es. con i tasti per estendere la finestra, col
drg and drop, o tramite ShowWindow() ) viene invalidata l'area e mandato
WM_PAINT o quale eventualente delle due? E se gli stili non sono presenti?
--
Marco Iannaccone     
marc...@tin.it
ICQ: 18748121           Tolkien
"I've... seen things you people wouldn't believe. Attack ships on fire off
the shoulder of Orion.
I watched C-beams... glitter in the dark near the Tanhauser Gate. All
those... moments will be lost... in time..., like... tears... in... rain."
FAQ it.comp.lang.c: 
http://www.programmazione.it/linguaggi/c/itcomplangc.htm
FAQ it.comp.lang.c++: 
http://www.programmazione.it/linguaggi/c/lang_faq.htm
"Lorenzo Lutti" <lorenz...@DOHtiscalinet.it> ha scritto nel messaggio
news:ZOQu5.20510$2I.3...@news.infostrada.it...


nella finestra)
Forse ti dimentichi di aggiornare dimensioni della finestra. Potresti
postare il codice che controlla WM_PAINT, se non e' troppo lungo?
Due consigli: se usi il MS VC++, considera il programma Spy++, che ti mostra
tutti i messaggi che vengono spediti alla tua finestra. Secondo, quando non
sai se una parte di codice venga eseguita o meno, usa OutputDebugString().
Saluti,
    Mardy

 postare il codice che controlla WM_PAINT, se non e' troppo lungo?
No, scusa, errore mio. Se come stili della classe imposto CS_HREDRAW e
CS_VREDRAW, dato che ad ogni ridimensionamento viene invalidata l'area
client, viene automaticamente mandato WM_PAINT, e quindi, se ho capito bene,
UpdateWindow() servirebbe solo ad accelerare le cose. In un altra risposta
mi hanno detto che se non uso quei due stili per la classe, devo invalidare
io l'area client, no?
Grazie per le risposte, comunque!


 non sono presenti?
CS_xREDRAW serve per invalidare *tutta* la client se tu allarghi la
finestra in orizzontale e/o verticale. Se non li specifichi, verranno
invalidati soltanto i pezzi che hai "scoperto" in piu`.
Ti faccio un esempio: se tu crei una finestra per mostrare un bitmap che
si deve sempre ridimensionare per occuparla tutta, allora quegli stili
ti servono perche` tanto a ogni ridimensionamento devi ridisegnare
tutto; se invece crei una finestra che mostra un bitmap di dimensioni
fisse, non importa tornare a disegnare tutte le volte le sue porzioni
che restano inalterate.


 che restano inalterate.
Questo vale se la bitmap avente dimensioni fisse deve reimanere nella stessa
posizione, no? Se deve trovarsi invece sempre centrata nella finestra, deve
essere invalidata tutta l'area, vero?


 essere invalidata tutta l'area, vero?
Si`.


direttamente la CreateWindow() a farlo per te. Mi sembra logico.
Non ci giurerei. Ho visto piu' volte esempi di questo tipo:
hWnd = CreateWindow(...);
ShowWindow(hWnd, SW_NORMAL);
UpdateWindow(hWnd);
E' chiaro che appena la finestra viene creata, viene inviato anche il
WM_PAINT, dal momento che tutta la finestra e' invalidata. Ma non viene
inviato con SendMessage(), bensi' con PostMessage() o qualcosa di simile,
infatti lo ritroviamo nella coda dei messaggi.Ora, tra la chiamata a
CreateWindow() e il primo GetMessage() (e successivi amici) l'applicazione
potrebbe fare qualcos'altro (generalmente nulla :-) ), ma in ogni caso le
tre righe ci codice scritte sopra hanno un significato: disegnare la
finestra subito, prima di chiamare GetMessage() (e i soliti amici).
Saluti,
    Mardy

 ha scritto nel messaggio
news:wZNv5.57$0C2...@news.infostrada.it...


 potrebbe fare qualcos'altro (generalmente nulla :-) )
Nella stragrande maggioranza dei casi il risultato "finale" e` identico,
e d'altra parte si tratta di pochi millisecondi: troppo poco perche`
l'utente se ne accorga in modo utile.


con UpdateWindow(), no?
Si'. :-)
Saluti,
    Mardy