Newsgroup: it.comp.programmare.win32
Titolo: Visual c++   HBRUSH

Sto usando Visual c++ 2008.
Ho creato un pennello per colorare una edit box:
HBRUSH CEditColor2Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT
nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	if (pWnd->GetDlgCtrlID() == IDC_EDIT1)
	{
		// rosso
		pDC->SetTextColor(RGB(255, 0, 0));
		pDC->SetBkMode(TRANSPARENT);
		pDC->SetBkColor(RGB(255,0,0));
	}
	return hbr;
}
però quando cerco di modificare il colore premendo un pulsante mi da
errore:
void CEditColor2Dlg::OnBnClickedButton1()
{
	CDC* pDC;
	CWnd* pWnd;
	if (pWnd->GetDlgCtrlID() == IDC_EDIT1)
	{
		pDC->SetTextColor(RGB(255, 0, 0));
		pDC->SetBkMode(TRANSPARENT);
		pDC->SetBkColor(RGB(255,0,0));
	}
}
mi sapete dire cosa sto sbagliando?

 mi sapete dire cosa sto sbagliando?
pDC e pWnd sono due puntatori e in OnBnClickedButton1 non puntano a niente.
Potresti provare con:
void CEditColor2Dlg::OnBnClickedButton1()
{
	CWnd* pWnd = GetDlgItem(IDC_EDIT1);
	CDC* pDC = pWnd->GetDC();
	pDC->SetTextColor(RGB(255, 0, 0));
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetBkColor(RGB(255,0,0));
	pWnd->ReleaseDC(pDC);
}
Ma probabilmente non ti funzionerebbe: l'approccio corretto mi pare 
essere proprio quello di utilizzare la funzione OnCtlColor.
Ti conviene creare una variabile di modulo che contiene il colore della 
edit ed impostare solo il valore di tale variabile nella funzione 
OnBnClickedButton1, per poi utilizzare la variabile per definire il 
colore nella funzione OnCtlColor.
Es.
struct CtlColor
{
	COLORREF m_TextColor;
	COLORREF m_BkColor;
	int m_BkMode;
	CBrush m_brBkgnd;
	CtlColor()
	{
		m_TextColor = ::GetSysColor(COLOR_WINDOWTEXT);
		m_BkColor = ::GetSysColor(COLOR_3DFACE);
		m_BkMode = OPAQUE;
		m_brBkgnd = m_brBkgnd.CreateSolidBrush(m_BkColor);
	}
}
class CEditColor2Dlg
{
	CtlColor m_CtlColorEdit1;
}
HBRUSH CEditColor2Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	if (pWnd->GetDlgCtrlID() == IDC_EDIT1)
	{
		pDC->SetTextColor(m_CtlColorEdit1.m_TextColor);
		pDC->SetBkMode(m_CtlColorEdit1.m_BkMode);
		pDC->SetBkColor(m_CtlColorEdit1.m_BkColor);
		return (HBRUSH)m_CtlColorEdit1.m_brBkgnd;
	}
	else
	{
		return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	}
}
void CEditColor2Dlg::OnBnClickedButton1()
{
	m_CtlColorEdit1.m_TextColor = RGB(255, 0, 0);
	m_CtlColorEdit1.m_BkMode = TRANSPARENT;
	m_CtlColorEdit1.m_BkColor = RGB(255, 0, 0);
	if (m_nBkMode == TRANSPARENT)
	{
		m_CtlColorEdit1.m_brBkgnd.CreateStockObject(NULL_BRUSH);
	}
	else
	{
		m_CtlColorEdit1.m_brBkgnd.CreateSolidBrush(m_CtlColorEdit1.m_BkColor);
	}
	GetDlgItem(IDC_EDIT1)->UpdateWindow();
}

 - Mostra testo citato -
Scusa la mia ignoranza ma il debug mi da un sacco di errori, dove devo
mettere questo:



Per chi potesse avere lo stesso problema ho risolto così:
HBRUSH CEditColor8Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT
nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
      if (pWnd->GetDlgCtrlID() == m_iEditColor)
      {
            pDC->SetTextColor(m_lForeColor);
            pDC->SetBkMode(TRANSPARENT);
            DeleteObject(m_BackBrush);
            m_BackBrush = CreateSolidBrush(m_lBackColor);
            hbr = m_BackBrush;
      }
	return hbr;
}
void CEditColor8Dlg::OnBnClickedButton1()
{
	CString sText;
	sText = "colore";
	m_iEditColor = IDC_EDIT1;
	m_lForeColor = RGB(0,0,255);
               m_lBackColor = RGB(255,0,0);
               GetDlgItem(m_iEditColor)->SetWindowText(sText);
}

 }
E' piů o meno come ti avevo indicato.
Io avevo semplicemente creato una struttura "contenitore" per le 
variabili, che nel tuo caso sono m_iEditColor, m_lForeColor e m_lBackColor.
La dichiarazione della struttura la dovevi mettere nel .h della dialog 
(magari anche all'interno della classe CEditColor8Dlg), cosě come la 
dichiarazione della variabile m_CtlColorEdit1 la dovevi mettere dentro 
la dichiarazione della classe CEditColor8Dlg, visto che si tratta di una 
variabile membro della stessa, in pratica al posto delle tue variabili 
m_iEditColor, m_lForeColor e m_lBackColor.