Newsgroup: it.comp.lang.c++
Titolo: CStati colorato

> 
http://www.geocities.com/sunsetstrip/stage/7787
 <<
<<<<<<<<<<<< _
Metal...@iol.it
 >>>>>>>>>>>>>>
(remove asterisk to reply)

Però c'è il problema del colore: come glielo cambio?
Io farei cosi`: aggiungerei al dialogo il controllo statico, col Class
Wizard la relativa variabile m_myStatic di tipo CStatic alla classe
dialogo, inoltre sempre al dialogo una variabile BOOL m_inside messa
a FALSE nel costruttore, e due gestioni di messaggi Windows
(sempre col wizard, facciamolo lavorare...:-):
void CMidiaDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    BOOL newInside =
        ChildWindowFromPoint(point) == &m_myStatic;
    if(m_inside != newInside) {
        m_inside = newInside;
        m_myStatic.Invalidate(TRUE); // garantiamo repaint
    }
}
HBRUSH CMidiaDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if(m_inside && pWnd==&m_myStatic) {
        return CBrush(0xFF0000);    // blu...
    }
    return hbr;
}
Questo dovrebbe garantire che lo static assume fondo blu
quando ci passi col mouse, e torna normale quando esci
(forse dovrai settare la cattura del mouse per essere certo
di riscontrare l'uscita se molto veloce...).  Facci sapere se
ti funziona!
Alex

ti funziona!
funziona !!!!!
GRAZIE TANTE!
ho fatto così:
void CAboutDlg::OnMouseMove(UINT nFlags, CPoint point)
{
 //trova la finestra che sta sotto al mouse
 CWnd* WndUnderMouse=ChildWindowFromPoint(point);
 //vede se il cursore sta sopra ad uno dei controlli che mi interessano
 m_bOnMail=(WndUnderMouse==&m_MailStatic);
 m_bOnWeb=(WndUnderMouse==&m_WebStatic);
 if
OnMail||m_bOnWeb){  
  SetCursor(m_hCursorManina);//cursore a manina  
  m_MailStatic.Invalidate(FALSE);//ridisegna il controllo
  m_WebStatic.Invalidate(FALSE);//ridisegna il controllo
 }
 else {
  SetCursor(m_hCursorStandard);
  m_MailStatic.Invalidate(FALSE);
  m_WebStatic.Invalidate(FALSE);
 };
 CDialog::OnMouseMove(nFlags, point);  
}
HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 if ((m_bOnMail&&(pWnd==&m_MailStatic))||(m_bOnWeb&&(pWnd==&m_WebStatic))){
  //testo verde
  pDC->SetTextColor(RGB(0,127,0));
 }
 else pDC->SetTextColor(RGB(0,0,0));//testo nero
 return hbr;
}
invece di usare la cattura del mouse ho fatto ridisegnare i due controlli ogni volta che il mouse si muove (si devono illuminare uno alla volta, tipo dei link su una pagina web).
Così funziona benone, ma pensavo: c'è un modo che impegni meno la macchina? (così continua a ridisegnare i due controlli anche se il mouse si muove su altre parti del dialogo).


Cosě funziona benone, ma pensavo: c'č un modo che impegni meno la macchina?
(cosě continua a ridisegnare i due controlli anche se il mouse si muove su
altre parti del dialogo).
La piccola ottimizzazione c'era nel codice di esempio che io ho
postato, e dispiace vedere che l'hai eliminata e adesso chiedi
di nuovo come farla... semplicemente, si tratta di mandare una
Invalidate solo ai controlli il cui stato di "inside" *cambia* in questo
mouse-movement -- da zero a due di essi (zero nella maggior
parte dei casi, quando il mouse si muove entro lo stesso control
o al di fuori di tutti i control "tenuti d'occhio").
Nel mio esempietto c'era un solo control, quindi io tenevo sotto
controllo il suo stato inside/outside con una semplice variable
booleana.  Soluzione piu` generale: tieni l'HWND dell'ultimo
controllo "dentro" cui sei secondo la ChildWindowFromPoint
chiamata in MouseMove -- solo se questa HWND _cambia_
da una MouseMove alla successiva devi fare qualcosa, se no
esci tranquillo dalla MouseMove.
Alex

        ChildWindowFromPoint(point) == &m_myStatic;
Questo confronto mi confonde. ChildWindowFromPoint(point) ritorna un
HWND, mentre m_myStatic dovrebbe essere un oggetto di tipo CStatic.
Forse & e' sovraccaricato nelle MFC per poter avere hadler degli
oggetti?

oggetti?
No, MFC non sovraccaricano operator&(); i meccanismi in gioco qui
sono diversi (v. sopra).
Alex

> 
http://www.geocities.com/sunsetstrip/stage/7787
 <<
<<<<<<<<<<<< _
Metal...@iol.it
 >>>>>>>>>>>>>>
(remove asterisk to reply)
PS per Alex: ora ho inserito la "tua" ottimizzazione nel mio codice.
;-)))

>PGP public key avaiable with "finger 
xywza...@helen.cli.di.unipi.it
<<
fingerprint: D1E7 641F 1821 74BA  1836 9B50 B37C 5FA3