Newsgroup: it.comp.programmare.win32
Titolo: GetDlgItem e Dialog Procedure

Salve a tutti...
Sto iniziando a lavorare con le Dialog Box (modeless in questo caso).
Ho bisogno di settare alcuni controlli al momento della creazione del
dialog stesso.
Mi pare di aver notato che GetDlgItem non ritorna il giusto handler se
sistemata all'interno dell'elaborazione del messaggio WM_CREATE e
WM_INITDIALOG (piu' che altro l'handler ritornato e' NULL). Ci sono
altri messaggi inviati al momento della creazione oppure mi debbo
arrangiare in qualche altro modo?
Vi ringrazio in anticipo...

WM_INITDIALOG
Ho appena notato che questo messaggio non viene mai mandato.
Sottolineo che ho creato il dialog come finestra principale
(specificando la WndProc nella WindowClass e settando l'opportuno
parametro CLASS nel .rc)

 parametro CLASS nel .rc)
Se e' una dialog modeless per intenderci creata con la funzione Create il
messaggio non viene mandato.

messaggio non viene mandato.
Mannaggia, lo sospettavo! E' consigliabile forzare il messaggio dopo
la Create con un SendMessage o ci sono controindicazioni?
Altra domanda: come mai la GetDlgItem non funziona come dovrebbe
all'interno di WM_CREATE? Forse il dialog non ha ancora i controlli
assegnati ((la GetLastError mi restituisce un errore di ID
sconosciuto).
Ti ringrazio per la risposta!!

 ha scritto nel messaggio
news:mhb4ou8ee1tfdnn1u...@4ax.com...

Non sono sicuro di aver capito la situazione.....
Stai parlando di un Modeless Dialog....
Per crearne uno ci vuole CreateDialog o CreateDialogIndirect (o le due
versioni con il Parametro aggiuntivo).
Una dialog creata così posta SEMPRE WM_INITDIALOG (almeno da quanto ne so)
e in questo messaggio la funzione GetDlgItem ... ritorna SEMPRE un handle
valido al controllo (salvo problemi gravi).
/* Inizio Interpretazione */
Però da quello che scrivi mi sembra quasi che tu registri una classe in
funzione del modello di una dialog all'interno del tuo file risorse e quindi
ti crei la finestra con CreateWindow e appioppandogli la WndProc....
// Mani in avanti
Premesso che una simile procedura non sapevo si potesse fare e cmq non l'ho
mai fatta....
// Mani al loro posto
La DlgProc.. non è una WndProc
E mentre tutte le finestre hanno una WndProc la DlgProc serve per la
gestione appunto delle Dialog e subentra alla WndProc DOPO la creazione
della dialog.
Insomma immagina la crazione della dialog come qualcosa del genere:
CreateWindow () //  Parent
WM_CREATE -> Nella WndProc
// Creazione Controlli
CreateWindow() // Child Window... tante quanti controlli hai
// A questo punto posto il msg WM_INITDIALOG
IsDialogMessage() -> te lo porta alla dialog proc dove ti ritrovi tutti i
controlli bell'e pronti
Quindi secondo questo iter è naturale che nel WM_CREATE non si riesca ad
ottenere l'handle dei controlli perchè ancora non sono stati creati.
/* Fine Interpretazione */
Ciao
Molebio

 ottenere l'handle dei controlli perchè ancora non sono stati creati.
Infatti mi era venuto questo dubbio... Diciamo che forzando il
messaggio WM_INITDIALOG le cose sembrano funzionare ma non so se e'
proprio la soluzione ideale. Magari con un WM_USER (che ancora non
conosco e non ho mai usato) si risolve in modo piu' pulito).
Ti ringrazio per la risposta!
-- 
       Tremal-Naik -- Ghouls Emperor -- GnuPGid: 0xF093D6AD
E.A. Poe Klingon Translation Project: 
http://www.cs.unibo.it/~mbenini
List of my abandonware games: 
http://www.cs.unibo.it/~mbenini/abandon
    My miniatures page: 
http://www.cs.unibo.it/~mbenini/miniature

 modeless dialog box non possono averlo se create in modo classico).
si può, si può
nell' rc:
MENU_PRINCIPALE MENU DISCARDABLE
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "Ripristina",MN_FILE_RIPRISTINA, GRAYED
        MENUITEM "Esegui Copia di sicurezza",MN_FILE_COPIA_DI_SICUREZZA,
GRAYED
        MENUITEM SEPARATOR
        MENUITEM "Esci",MN_FILE_ESCI
    END
        POPUP "Help", HELP
    BEGIN
        MENUITEM "Guida",MN_HELP_GUIDA
        MENUITEM "Informazioni",MN_HELP_INFO, GRAYED
    END
END
E nel modello della tua dialog sempre nell'rc.
MENU MENU_PRINCIPALE
Ok Grazie.. ora ne so di + ;)
Ciao
Molebio

Ok Grazie.. ora ne so di + ;)
Grazie a te!

 shortcut?
Ni...
Diciamo che sono una caratteristica dei dialog.. se la implementi :)
Infatti la navigazione col TAB le frecce e le caratteristiche "standard"
vengono implementate dalla funzione IsDIalogMessage().
Cmq ho rivisto su MSDN la funzione IsDialogMessage() dovrebbe funzionare per
tutte le finestre che contengono dei controlli quindi anche nel caso tuo.
Quando la inserirai nel message loop ( a proposito ricorda che se la
funzione ha successo il messaggio è stato processato e quindi devi passare a
quello successivo) come per magia la tua "dialog" si uniformerà alle
specifiche Bill.
Ciao
Molebio

Diciamo che sono una caratteristica dei dialog.. se la implementi :)
Difatti con l'IsDialogMessage nel loop i tasti funzionano... Anche
oggi abbiamo imparato qualcosa di nuovo! :)

 
[...]
Lungi da me l'idea di correggere il Petzold, ma puoi utilizzare 
DefDlgProc come wndproc (passandola come .lpfnWndProc della tua classe) 
e continuare a utilizzare la "normale" dialog proc per la gestione dei 
messaggi anche utilizzando una classe ad-hoc per la dialog 
(l'importante è riservare DLGWINDOWEXTRA bytes per ogni finestra).
In alternativa puoi implementare la tua WndProc in modo che richiami 
DefDlgProc invece che DefWindowProc. Nel caso del WM_CREATE devi però 
richiamarla _prima_ di gestire tu il messaggio in modo che possa 
associare i vari controlli al relativo ID. Anche nel secondo caso (se 
la memoria non mi tradisce) devi comunque passare a CreateDialog una 
dlgproc che si può limitare a ritornare FALSE se vuoi gestire i 
messaggi nella WndProc (sinceramente non vedo grandi vantaggi, a meno 
che la tua finestra non debba gestire condizioni davvero particolari).
-- 
Valter Minute
vmi...@inwind.it
 (the reply address of this message is invalid)

 DefDlgProc come wndproc
Ma dopo non rischio un errore di non corrispondenza tra i tipi di
ritorno delle funzioni?
Vado a provare queste tue soluzioni immediatamente... Ti ringrazio per i
consigli!
