Newsgroup: it.comp.programmare.win32
Titolo: Domanda interessante sulle MFC

Ho questo problema. Ho una finestra di dialogo con dei controlli,
realizzata con l'editor di risorse di visual c++ 6.0. Non sono ancora
riuscito a capire, una volta definito un font e associato questo font ad
es. ad un push button, come variare il colore del testo scritto
all'interno del push button. So dell'esistenza dei device context e GDI,
però come si opera nel caso di una finestra creata con editor di risorse
a cui non faccio direttamente riferimento con strutture tipo RECT,
coordinate etc. etc.?
Se qualcuno ha a disposizione esempi sull'uso dei font, dei colori,
nelle finestre di dialogo, mi farebbe un grosso favore!
Grazie! Riccardo Mingozzi.
rmin...@hotmail.com

 all'interno del push button. So dell'esistenza dei device context e GDI,
Prova a gestire il WM_CTLCOLOR (con OnCtlColor nella tua classe
di dialogo) facendo in essa la SetTextColor che desideri.  Se
questo non ti da` un grado sufficiente di controllo, dovrai
probabilmente ricorrere al subclassing del bottone oppure ad
un bottone owner-drawn.
Alex

Ho provato a gestire WM_CTLCOLOR, andando a chiamare la funzione
SetTextColor() dentro la  OnCtlColor(), però senza nessun risultato.
Non mi è chiaro chi è che genera il messaggio WM_CTLCOLOR. Io uso la
SetWindowText per scrivere il testo.
Supponiamo che io abbia una dialog con ID = IDD_USER1 e un pulsante
dentro la dialog con ID = IDC_BUTTON1.
la mia OnCtlControl è siffatta:
HBRUSH CUser1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 // TODO: Change any attributes of the DC here
 // TODO: Return a different brush if the default is not desired
  if ( pWnd == GetDlgItem(IDC_BUTTON1))
  {
    pDC->SetTextColor(RGB(128,128,0));
    pDC->SetBkColor(RGB(255,255,255));
  }
 return hbr;
}
mentre nella funzione che scrive i pulsanti ho
 pDlg->GetDlgItem(IDC_BUTTON1)->SetFont(&MyFontButton);
 pDlg->GetDlgItem(IDC_BUTTON1)->SetWindowText(str);
Fatto in questo modo, però il colore non cambia, rimangono i colori
standard. Qualcuno mi può aiutare?
Riccardo (
rmin...@hotmail.com
)

 Non mi è chiaro chi è che genera il messaggio WM_CTLCOLOR. Io uso la
Nessuno (i veri messaggi, e li genera Windows, si chiamano WM_CTLCOLORBTN
e cosi` via), ma MFC sintetizza un singolo WM_CTLCOLOR (per compatibilita`
col passato) dai vari WM_CTLCOLORBTN e soci.  Comunque, questo non ha
molta importanza.
Setta invece il bit di stile owner-draw per il tuo bottone (nell'editor
di risorse di studio, naturalmente) e gestisci nel tuo dialogo il
messaggio WM_DRAWITEM piu` o meno in questo modo:
void CPippoDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    if(nIDCtl == IDC_BUTTON1) {
        COLORREF clrBack  = RGB(255,255,255);
        COLORREF clrFront = RGB(255,0,0);
        UINT uState = DFCS_BUTTONPUSH;
        if(lpDrawItemStruct->itemState & ODS_SELECTED)
            uState |= DFCS_PUSHED;
        CDC dc; dc.SetOutputDC(lpDrawItemStruct->hDC); dc.SaveDC();
        CRect rc(lpDrawItemStruct->rcItem);
        dc.DrawFrameControl(&rc, DFC_BUTTON, uState);
        rc.DeflateRect(2,2);
        dc.FillSolidRect(&rc, clrBack);
        CString strText;
        GetDlgItemText(nIDCtl, strText);
        dc.SetTextColor(clrFront);
        dc.SetBkColor(clrBack);
        dc.DrawText(strText, &rc, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
        if(lpDrawItemStruct->itemState & ODS_FOCUS) {
            rc.DeflateRect(3,3);
            dc.DrawFocusRect(&rc);
        }
        dc.RestoreDC(-1);
    }
}
Puoi anche scegliere di incapsulare queste funzionalita` in una
tua classe che erediti da CButton, e che fa override della funzione
virtuale DrawItem (questo perche` MFC si occupa di "riflettere"
il WM_DRAWITEM, che e` diretto al tuo dialogo, allo specifico
oggetto-bottone), ma non mi sembra necessario.
Alex