Newsgroup: it.comp.programmare.win32
Titolo: Modificare il colore del testo di un controllo

Ciao a tutti.
Ho provato a modificare il colore del testo (con SetTextColor) di un
controllo Edit dsabilitato. Questo invia un messaggio WM_CTLCOLORSTATIC
invece che il solito WM_CTLCOLOREDIT che permette di accedere all'HDC del
controllo. Il problema è che riesco a modificare il background, il modo con
cui viene disegnato il background, ma non il colore del testo che rimane
inesorabilmente grigino pallido. Il problema è stato risolto sostituendo
l'edit control con uno static control, ma così mi tocca fare una dialgo con
gli static e una con gli edit (o creare i controlli a run-time, ma è una
palla). C'è qualcuno che ha una soluzione? O anche solo una spiegazione del
perché non si riesce a fare (sono un curioso di natura).
---------------------
Ing. Costantino Grana

Se ti riferisci al VC++ io gestisco il cambio del colore del background e del
testo in questo modo:
HBRUSH MyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 CBrush *brush;
 LOGBRUSH br;
 // TODO: Change any attributes of the DC here
  if (pWnd->GetDlgCtrlID () == IDC_MyControl)
  {
    // Edit disabilitata
   brush=&my_edit_disable;
   brush->GetLogBrush(&br);
   pDC->SetBkColor(br.lbColor);
   pDC->SetTextColor(MY_TEXTCOLOR1);
   hbr=(HBRUSH) *brush;
  }
  else
 switch (nCtlColor)
 {
  case CTLCOLOR_STATIC:          pDC->SetTextColor(MY_TEXTCOLOR2);
pDC->SetBkMode(TRANSPARENT);
                                                        hbr=(HBRUSH)
GetStockObject(NULL_BRUSH);
                                                        break;
  case CTLCOLOR_EDIT:              brush=&my_edit_enable;
brush->GetLogBrush(&br);
pDC->SetBkColor(br.lbColor);
pDC->SetTextColor(MY_TEXTCOLOR3);
                                                        hbr=(HBRUSH) *brush;
                                                        break;
  default:    break;
 }
 // TODO: Return a different brush if the default is not desired
 return hbr;
}
--
       Stefano Malavasi

   }
Se ho capito bene se questo è il messaggio inviato dal controllo che mi
interessa, prendi un brush che hai creato precedentemente, assegni al
background il colore del brush e poi imposti il testo a MY_TEXTCOLOR1. Poi
ritorni il tuo brush.
Non sarebbe stata la stessa cosa impostare il background a TRANSPARENT e poi
impostare il colore del testo come hai fatto?
---------------------
Ing. Costantino Grana

 ha scritto nel messaggio
news:a3p22s$p3f$1...@newsfeed.cineca.it...

Ciao,
Temo che il tuo problema non sia di facile risoluzione.
Mi pare di capire che nel caso di EDIT disattive la procedura di disegno del
controllo imposti il colore del testo successivamente all'invio del
messaggio WM_CTLCOLORSTATIC inficiando un eventuale chiamata SetTextColor
precedente.
Comunque potresti beffare windows disegnandoti il tuo controllo
indipendentemente e impedendo a lui di modificarlo, personalmente farei una
funzioncina del genere:
HBRUSH DisegnaEdtDisattiva(HDC hdc,HWND hwndEdt,COLORREF colTesto)
{
 char *pBufferEdt ;
 int iEdtLen  ;
 RECT rctClient ;
 iEdtLen = GetWindowTextLength(hwndEdt) + 1    ;
 if (iEdtLen == 1) return (NULL)        ;
 pBufferEdt = new char [iEdtLen]        ;
 if (pBufferEdt == NULL) return ((HBRUSH) NULL)   ;
 GetWindowText(hwndEdt,pBufferEdt,iEdtLen)     ;
 GetClientRect(hwndEdt,&rctClient)      ;
 SetTextColor(hdc,colTesto)          ;
 SetBkMode(hdc,TRANSPARENT)          ;
 TextOut(hdc,0,0,pBufferEdt,iEdtLen-1)      ;
 ExcludeClipRect( hdc,
       rctClient.left,rctClient.top,
       rctClient.right,rctClient.bottom) ;
 delete [] pBufferEdt            ;
 return ((HBRUSH) GetStockObject(NULL_BRUSH))    ;
}
Te la chiami nel tuo WM_CTLCOLORSTATIC e ti risolve il problema se poi
anzichè usare un buffer dinamico ne usi uno statico elimini pure qualche
linea.

 pure qualche linea.
Funziona alla grande! Ho solo dovuto sostituire new e delete con malloc e
free dato che uso il C liscio (ma presto mi svilupperò anch'io) e aggiungere
una SelectObject (hdc,GetStockObject(ANSI_VAR_FONT)); per avere i font
coerenti (e più carini).
Grazie mille per l'aiuto.
---------------------
Ing. Costantino Grana

 pure qualche linea.
Funziona alla grande! Ho solo dovuto sostituire new e delete con malloc e
