Newsgroup: it.comp.programmare.win32
Titolo: Dubbio su WM_CREATE

Mi sorge un dubbio, anzi due. Quando si crea una finestra con CreateWindow()
o CreateWindowEx(), prima che queste ritornino, è inviato un messaggio
WM_CREATE direttamente alla Windows Procedure.
1) Se la finestra non può essere creata (ad esempio per mancanza di risorse)
il messaggio non è proprio inviato no?
2) Il messaggio è inviato ogni volta che si crea una finestra in qualsiasi
modo, o solo quando è creata con una delle due funzioni citate prima?
Grazie.
--
Marco Iannaccone
marc...@tin.it
ICQ UIN: 18748121     MetalCoder
"This is a new ship, boy, but she's got the right name.
You treat her like a lady, and she'll always bring you home."
    Dr. Leonard H. McCoy to Data - Encounter at Farpoint - Star Trek TNG

 ICQ UIN: 18748121     MetalCoder
dove ti ho già visto?
icl-js ?
--
ciao
xaero

 modo, o solo quando è creata con una delle due funzioni citate prima?
Viene inviata solo se ci sono le chiamate a CreateWindow/Ex(), ma un
applicazione potrebbe benissimo inviarlo senza passare dalle funzioni
succitate, è sufficiente rispettare il tipo dei parametri indicati dal
messaggio stesso.
Ciao! :-)
--
- Carlo -
c.b...@libero.it

 alla WndProc.
Temo non sia cosě, per due motivi:
1 - The WM_CREATE message is sent when an application requests that a window
be created by calling the CreateWindowEx or CreateWindow function. (The
message is sent before the function returns.)
Lascia trasparire che comunque sia il messaggio viene inviato.
2 - if an application processes this message, it should return 0 to continue
creation of the window. If the application returns -1, the window is
destroyed and the CreateWindowEx or CreateWindow function returns a NULL
handle.
Quindi la finestra viene creata, non mostrata, se la WindowProc processa il
messaggio la finestra viene mostrata, altrimenti viene distrutta.
Ciao! :)



La DefWindowProc ritorna sempre FALSE (0) quando processa un WM_CREATE, 
proprio per evitare che, non specificando alcuna gestione di questo 
messaggio, la finestra non venga creata.
Comunque se la finestra non č stata creata (o meglio č stata creata e 
immediatamente distrutta) perche WM_CREATE ha ritornato TRUE, GetLastError 
dovrebbe tornare 0.
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

Infatti, questo è quello che pensavo anch'io, ovvero che WM_CREATE è mandato
solo se è stato effettivamente possibile creare la finestra (c'erano risorse
disponibili, etc...). Nel WM_CREATE, d'altra parte, sià ha accesso
all'handle della finestra (su MSDN c'è un esempio OpenGL, in cui viene
creato il contesto OpenGL a partire dall'handle della finestra processando
WM_CREATE).
Se poi la window procedure processando il messaggio restituisce -1, allora
la finestra è distrutta e viene inviato WM_DESTROY, no?
--
Marco Iannaccone
marc...@tin.it
ICQ UIN: 18748121     MetalCoder
"This is a new ship, boy, but she's got the right name.



Non sono sicuro che venga inviato il WM_DESTROY, dovresti fare una prova 
per essere sicuro.
Comunque normalmente non è una buona idea di tornare TRUE da WM_CREATE per 
bloccare la creazione di una finestra a seguito di un errore in fase di 
inizializzazione. 
Come minimo devi gestire l'eventuale condizione di errore in due diversi 
punti del programma (dentro il WM_CREATE e dopo la CreateWindow).


Ho provato facendo stampare un messaggio su un file alla ricezione del
messaggio WM_DESTROY, ed ho fatto restituire -1 alla ricezione di WM_CREATE.
Il messaggio viene stampato, quindi WM_DESTROY viene effettivamente inviato.
Se la finestra non viene proprio creata, invece, non viene mandato ne
WM_CREATE, ne WM_DESTROY (dato che non c'č niente da distruggere).
Provando a creare una figlia della prima finestra (quella che viene
distrutta), dato che viene passato un handle nullo alla seconda, questa non
puň venire creata, e non viene ricevuto WM_CREATE (anche qui ho fatto
stampare un messaggio, che per la prima finestra č invece ovviamente
stampato).
