Newsgroup: it.comp.programmare.win32
Titolo: Aggiornare CDialog non modale da CView

Premetto che ho gia cercato nel NG discussioni
che potessero aiutarmi, e cosi' e' stato anche
se mi rimane sempre un piccolo problemino.
Ho scritto una piccola applicazione MDI la quale
apre immagini in scala di grigio ed effettua 
smoothing, binarizzazione ecc.
Vorrei cercare di creare una finestra (CDialog
non modale) che effettui l'istogramma del
immagine, la CDialog e' figlia della vista.
Ci sono riuscito, solo che quando effettuo
lo smoothing ( o binarizzazione )sull'immagine 
presente nella vista vorrei che l'istogramma
nella Dialog si aggiornasse automaticamente,
non riesco a farlo.
Devo necessariamente chiudere la Dialog e 
aprirla di nuovo, a quel punto si presenta 
aggiornata.
Ho provato sia con la funzione PostMessage
che con ::PostMessage.
Con la seconda ho ottenuto un risultato migliore.
Praticamente dalla mia procedura nella vista
lancio prima lo smoothing sull'immagine e 
naturalmente dopo la ::PostMessage.
ES:
void CMiaVista::OnSmoothing(){
  GetDocument()->Image->Smoothing()
  ::PostMessage((HWND)m_pHistoDlg->m_hWnd,WM_PAINT,0,0);
}
m_pHistoDlg e' il puntatore alla Dialog non modale ed
e' una variabile membro della Vista.
Ottengo il risultato che la funzione OnPaint() della
Dialog viene lanciata ( mettendoci dentro una
AfxMessageBox("") la finestrella viene visualizzata)
pero' l'istogramma disegnato nella Dialog non si
aggiorna.
Ma come e' possibile ? Mi sembra stranissimo!
Post-metto che sono alle prime armi con le MFC.
Vi ringrazio per la partecipazione al post.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


non devi inviare il messaggio di paint, devi invalidare l'area client della
window
es.
::InvalidateRect(((HWND)m_pHistoDlg->m_hWnd, 0, 0);
non usole MFC quindi non so se la classe ha il metodo InvalidateRect(),
probabilmente si e forse basta richiamare InvalidateRect(0, 0);
se poi vuoi l'aggiornamento immediato, richiama UpdateWindow() subito dopo 
(ma non dovrebbe essere necessario).

Ho provato con il metoto Invalidate della classe CDialog
ed ha funzionato, il metodo doveva essere completato con
tale chiamata :
void CMiaVista::OnSmooth() 
{
	GetDocument()->image.Smooth();
        // prima di lanciare Invalidate testo se la
        // finestra di Dialogo e' stata creata
	if(m_pHistoDlg) m_pHistoDlg->Invalidate();
        // Effettuo l'aggiornamento delle viste
	GetDocument()->UpdateAllViews(NULL); 
}
Grazie, mi hai risparmiato molte ore di sofferenza !
Ciao


 e' una variabile membro della Vista.
Fai un banale metodo chiamabile con
m_pHistoDlg->UpdateHisto();
...o simile.
Inutile impelagarsi con i messaggi. 
-- 
Luc

 m_pHistoDlg->UpdateHisto();
E quindi dovrei predisporre un metodo della
classe CHistoDlg con una sola chiamata al
suo interno ? E.g. :
void CHistoDlg::UpdateHisto(){
   Invalidate();
}
Nella funzione OnSmooth devo sempre effettuare la
chiamata dell'elaborazione sull'immagine, poi chiamo
la mia nuova funzione UpdateHisto() e aggiorno le viste :
void CMiaVista::OnSmooth() 
{
	GetDocument()->image.Smooth();
        // prima di lanciare Invalidate testo se la
        // finestra di Dialogo e' stata creata
	if(m_pHistoDlg) m_pHistoDlg->UpdateHisto();
        // Effettuo l'aggiornamento delle viste
	GetDocument()->UpdateAllViews(NULL); 
}
Ma che vantaggio otterrei nel scrivere una funzione con
un solo metodo al suo interno? 
E' un fatto di eleganza o altro ?
Forse ho capito male.
Devo mettere all'interno della UpdateHisto()anche
image.Smooth() e UpdateAllViews(NULL) ?


 un solo metodo al suo interno? 
Invalidate è generica, con una nuova funzione, invece puoi far di tutto... 
-- 
Luc