Newsgroup: it.comp.programmare.win32
Titolo: DestroyWindow ..... dubbi.

Ho sempre saputo (petzold insegna) che per eliminare una finestra
basta inviare un messaggio WM_CLOSE o fare click sul menu di sistema
in alto a dx .
La winProc passa il WM_CLOSE a DefWindowProc la quale chiama
DestroyWindow per eliminare la finestra corrente e tutte le child ad
esso associata .
Ora provate ad usare MemProof per vedere nel conteggio delle risorse
le finestre ancora attive in una applicazione e vi accorgerete che se
non chiamate esplicitamente DestroyWindow la Vostra finestra risultera
ancora attiva ma non solo,
saranno attive anche tutte le child ad essa associata .
Anche l'SDK dice che DefWindowProc richiama DestroyWindow per la
finestra attiva e tutte le child collegate quindi presumo che MemProof
prenda un colossale abbaglio (possibile?) .
Mi e' venuto un serio dubbio in proposito .
Posso sapere come fate Voi ad eliminare una finestra ?
Non usate un codice simile al seguente ?
        case WM_CLOSE :
        if ( ChiudoWin()  == 1 ) break ; // richiamo DefWindowProc
       return 0 ; // altrimenti continuo 
        case WM_DESTROY :
        PostQuitMessage (0) ;
        return 0 ;
       }
 return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
'
 

 esso associata .
Personalmente, come riportato in
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_close.asp
ho sempre trattato il messaggio chiamando DestroyWindow
o al piu' con
PostMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_EXIT,0),NULL);
nella finestra principale in cui vi e' il messaggio da Menu'
case IDM_EXIT:
	DestroyWindow(hWnd);
	break;
e non direttamente con
case WM_CLOSE:
	DestroyWindow(hWnd);
	break;
perche', stranamente, solo nella finestra principale,
non funzionava affatto bene.
Non mi sono pero' soffermato a capire perche', (solita fretta).
Saluti
JJ
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_close.asp
dove appunto si dice che di default DefWindowProc richiama
DestroyWindow.
Allora perche MemProof mi dice che tali finestre sono ancora in uso ?

 wrote in message
news:j9p4g1p66nj8c2b9i...@4ax.com

Come sempre dipende anche da altre cose..
Per esempio un caso come quello che hai descritto
l'ho visto in una situazione cosi':
CMyDialog m_dlg;// globale, l'oggetto esiste gia'!!!!
m_dlg conterra' controlli.
A un certo punto lo si crea:
m_dlg.Create(GetModuleHandle(NULL),hWnd);
poi lo si "distrugge" con WM_DESTROY o DefWindowProc ecc.
... ma i controlli risultano esistere ancora.
Risulta ovvio se si pensa che invece tutto scompare
regolarmente con una gestione come la seguente:
CMyDialog *p_dlg;// globale ma l'oggetto non esiste
p_dlg = new CMyDialog;// ora l'oggetto esiste
p_dlg->Create(GetModuleHandle(NULL),hWnd);
poi lo si "distrugge" con WM_DESTROY
		case WM_DESTROY:
			delete p_dlg;
			p_dlg = NULL;
			break;
... e non vi sara' traccia dei controlli, nemmeno in memoria.
Prova a vedere se e' questo il Tuo caso.
Saluti.


			delete p_dlg;
No.
Ripeto che SDK afferma :
DefWindowProc richiama DestroyWindow per la
finestra attiva e tutte le child collegate (quindi anche i controlli) 
Perche' allora i controlli esistono ancora ?

> Perche' allora i controlli esistono ancora ?
???
Suggerimenti...
chiama DestroyWindow e osserva il valore di ritorno
 (c'e' un messaggio di errore? GetLastError?).
Segui il "percorso di morte". In teoria dovrebbero
distruggersi prima le child via messaggio WM_DESTROY
che dovrebbe arrivare, se tutto funziona normalmente.
PotresTi usare un subclassing per intrappolare
il messaggio, se arriva.
Magari potresTi riportare una descrizione di funzionamento
ed una sintesi esaustiva del codice incriminato su cui
poter fare qualche ragioamento.
Saluti


 che dovrebbe arrivare, se tutto funziona normalmente.
piccolo appunto: MSDN dice che quando arriva WM_DESTROY si può assumere
che le child esistano ancora tutte, quindi presumo che WM_DESTROY arrivi
prima al parent e *poi* alle child.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 prima al parent e *poi* alle child.
Infatti. 
Ma la cancellazione dovrebbe avvenire prima per le childs.
Mi spiego meglio.
Arriva WM_DESTROY al parent (o owner), quindi alle childs
e quindi viene fatta la "deattivazione".
A questo punto dovrebbe avvenire la distruzione delle childs
e *poi* del parent.
Da Windows NT Win32 API SuperBible
"DestroyWindow......Windows 95 Windows NT
DestroyWindow deletes the window identified by hWnd. Child windows of
hWnd are deleted first.
The function sends WM_DESTROY and WM_NCDESTROY messages to the window to
deactivate it
before deleting it. The window’s menu is destroyed, the thread message
queue is flushed, and any
clipboard ownership is removed.
Use to remove and delete windows that were created with CreateWindow.
DestroyWindow is also
used to end Windows applications by destroying the parent window, and to
delete modeless dialogs
created with the CreateDialog function."
Saluti ;)


Luigi ha ragione. MSDN afferma che vengono distrutte prima le child
windows
(
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/destroywindow.asp?frame=true
)
Anche io ho il tuo stesso dubbio su DestroyWindow perche' anche io uso
MemProof ( programma che apprezzo molto ). Pero' sono convinto che non
sia infallibile...
Secondo me alcuni errori/avvertimenti che riporta sono generati
analizzando le informazioni di debug aggiunte dal BCC ( o Delphi...
usando MemProof non penso tu possa utilizzare altri compilatori ).
Per esempio se crei un oggetto COM MemProof non riesce piu' a capire se
ci sono Memory Leak anche se sono evidenti nel codice, forse pero' e'
pretendere troppo che riesca a gestire situazioni anomale con oggetti
OLE / COM.
Le mie sono congetture cmq perche' non conosco molto bene MemProof e
poco la programmazione COM.
Tornando al discorso iniziale io prima distruggo esplicitamente le
child windows e poi la finestra principale (WinCtrls e' una classe mia
per gestire i vari controlli di una finestra, pWin un puntatore alla
classe della finestra corrente):
        case WM_DESTROY:
            ::PostQuitMessage( 0 );
            return 0;
        case WM_CLOSE:
            pWin->winCtrls.OnClose();
            ::DestroyWindow( hWnd );
            return 0;
E in OnClose() di WinCtrls:
void WinCtrls::OnClose( void )
{
    if( hDefPushButton != NULL )
    {
        DestroyWindow( hDefPushButton );
        hDefPushButton = NULL;
    }
// E via di seguito per gli altri controlli della finestra
}