Newsgroup: it.comp.lang.c++
Titolo: WM_CREATE e WM_INITDIALOG (scomparsi???)

Dato che per un mio programma tutto si svolgeva in una Dialog ho pensato di
eliminare la window che la
conteneva, ho registrato la classe della dialog, quindi ho effettuato questa
chiamata per crearla indicando nei
parametri che non apparteneva a nessuna window:
hDialogl=CreateDialog( hInstance ,  "class_name" , 0 , NULL ) ;
Questo in breve sintesi quello che ho fatto e devo dire che tutto funziona
alla perfezione a parte che non
mi sembra di ricevere piu' i messaggi WM_CREATE e WM_INITDIALOG come mai?
qualcuno sa' indicarmi
cosa ho sbagliato, la winprocedure della dialog e quella canonica con in
piu' al termine una chiamata a windows
per i messaggi non processati.
Il problema l'ho risolto ugualmente con una non troppo ortodossa chiamata
del tipo:
 SendMessage(hDialog,WM_INITDIALOG,0L,0L);
ma non mi sembra una soluzione esatta, oltretutto perche' vorrei capire cosa
non va' , per il resto funziona tutto bene.
Roberto

piu' al termine una chiamata a windows per i messaggi non processati.
Tra l'altro, una dialog procedure non deve mai chiamare la
window-procedure di default (DefWindowProc), bensi` deve
tornare zero se non ha processato un messaggio, non-zero
se lo ha processato; eccetto per WM_INITDIALOG per cui
deve tornare zero se ha gia` settato opportunamente il focus,
non-zero se deve settarlo Windows per suo conto.
Alex

Penso di avere un problema analogo :
Ho un'applicazione MFC con un dialogo modale cone finestra principale.
Quasta applicazione ha all'interno un UI-thread che manda al dialogo
principale
un messagge utente (WM_USER+100), ma alla finestra dialogo non arriva un
fico secco.
Dove si perdono i fichi . ehm.. i messaggi ?
Ho già buttato quasi una giornata di tempo, se qualcuno mi da una dritta lo
ringrazio di cuore.
Saluti.

Ho fatto una mega MISSILATA !
Ho usato ON_COMMAND(...) anzicché ON_MESSAGE(...)
Adesso il messaggio lo gestisce bene !
Fate tesoro di queste MISSILATE !

Guarda che non me lo sono inventato questo metodo, è indicato in un esempio
di "Petzold"
sul "programmare in win95" "HEXCALC" io sono stato confortato da questo e ho
cosi' eliminato
la window principale. se tu sai un altro metodo piu' ortodosso te ne sarei
grato se me lo indicassi.
ciao , roberto
Alex Martelli ha scritto nel messaggio ...


un messagge utente (WM_USER+100), ma alla finestra dialogo non arriva 
Se lo _manda_, cioe` usa specificamente SendMessage, dovrebbe
funzionare (elaborazione sincrona). Hai usato SendMessage o
PostMessage...?
Alex

Grazie Alex per l'aiuto, ma come a messaggio era una mia missilata, uso
troppo il cut&paste.
Saluti.

grato se me lo indicassi.
Non mi e` chiaro cosa c'entri la window principale.  Quello che
gia` suggerivo, e consiglio a suggerire, e` che se vuoi usare un
dialogo, puoi fare una dialog procedure (invece della window
procedure), e allora riceverai anche il WM_INITDIALOG che oggi
ti manca (da documentazione in linea, questo messaggio e`
inviato solo a una dialog procedure, quindi, non avendone tu
una, non c'e` da stupirsi che manchi).  Quanto a WM_CREATE,
quello e` inviato da CreateWindow, quindi, visto che CreateWindow
non ne fai, di nuovo non mi stupisce che WM_CREATE non
debba arrivare.  Come ti dicevo, mi sfugge il vantaggio di questo
peculiare approccio -- ho dato un'occhiata affrettata al Petzold
in merito, e non mi pare che chiarisca quale vantaggio ci si
possa aspettare (rispetto al discorso "normale", per una app
Window che non deve far altro che mostrare un dialogo, di
crearlo con DialogBox, cioe` modale, con una dialog procedure,
EndDialog per terminare, ecc).
Alex

una dialog (o sbaglio?) da qui l'approccio
No che non sbagli, ma ci deve essere ancora qualcosa che
mi sfugge.  Hai esigenze strane o particolari di controllare il
loop degli eventi, o che altro...?  Se no, perche` non fai tutto
entro un normale, tranquillo dialogo modale, scrivendo una
dialog procedure invece di una window procedure, terminando
con EndDialog, ecc ecc, come dicevo nel messaggio scorso?
Se le esigenze strane di loop degli eventi ci sono, un dialogo
non-modale (sempre con dialog procedure ecc, ma iniziato
con CreateDialog [con l'ultimo parametro settato a indirizzo
della tua dialog procedure, non a 0!] e finito con DestroyWindow,
invece che creato con DialogBox e finito con EndDialog) puo`
forse bastare.
Quello che mi sfugge, per riassumere, e`: OK, non vuoi creare
una finestra con CreateWindow, per usare invece la comodita`
di un dialog editor, e sin qua, benissimo e normalissimo; ma non
capisco come da questo si passi allo strano idioma di usare un
dialogo senza dialog-procedure, e che vantaggi debba dare.
Alex

Quello che mi sfugge, per riassumere, e`: OK, non vuoi creare


Gestisco delle procedure in Time-idle inoltre ho un Thread da gestire.
Il thread non dovrebbe essere un problema -- l'idle-time, si`, se
uno usa un dialogo modale (poiche` il message loop se lo prende
in questo caso il sistema, che non chiama la tua OnIdle).  Ci
sono vari possibili approcci, ma forse il piu` semplice, visto che
il dialogo e` l'unica finestra della tua applicazione, e` di farne un
dialogo non modale e gestire tu il message loop (basta ricordarsi
di chiamare anche la IsDialogMessage...).
Alex