Cum schimb background-ul unui CComboBox ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Cum schimb background-ul unui CComboBox ?

Post by mesajflaviu » 26 Mar 2011, 21:51

Cum pot schimba culoarea edit-box-ului unui control CComboBox care stilul CBS_DROPDOWNLIST ?

Am incercat in modul urmator , dar fara succes :

Code: Select all

HBRUSH CComboBoxExt::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO: Change any attributes of the DC here

//	if(nCtlColor == CTLCOLOR_STATIC) <-- am incercat si asa
	if(nCtlColor == CTLCOLOR_EDIT)
	{
		if(! m_bAlertText)pDC->SetTextColor(COLOR_BLACK);
		else pDC->SetTextColor(COLOR_RED);
		if(! m_bAlertBkg)pDC->SetBkColor(COLOR_WHITE);
		else
		{
			pDC->SetBkColor(COLOR_ALERT);
			hbr = m_hBrushAlert;
		}
	}

	pDC->SetBkMode(TRANSPARENT);

	// TODO: Return a different brush if the default is not desired

	return hbr;
}



User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Cum schimb background-ul unui CComboBox ?

Post by cristianamarie » 27 Mar 2011, 10:41

Nu sint sigur, dar cred ca trebuie subclasat edit controlul de la combo (COMBOBOXINFO hwndItem e editul).
Aici cred ca trebuie implementate WM_CTLCOLOREDIT (sau WM_CTLCOLORSTATIC, parca, daca editul e disabled sau readonly) si returnezi un HBRUSH cu back color-ul tau; probabil WM_ERASEBACKGROUND, si evident subclass si WM_(NC)DESTROY ca sa restaurezi WNDPROC-ul original.
Daca editul din combo e richedit, acolo ai deja EM_SETBKGNDCOLOR, WM_CTLCOLOR... nu sint suportate, dar nu cred ca e cazul aici.
Nuclear launch detected

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum schimb background-ul unui CComboBox ?

Post by mesajflaviu » 27 Mar 2011, 19:09

O alta cerinta a rezolvarii problemei ar fi sa nu folosesc COMBOBOXINFO pentru ca nu e functional pe Windows NT SP6 ... dar o sa incerc si aceasta metoda ...
Last edited by mesajflaviu on 28 Mar 2011, 08:49, edited 1 time in total.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum schimb background-ul unui CComboBox ?

Post by Ovidiu Cucu » 27 Mar 2011, 23:29

In primul rand, un combobox cu stilul CBS_DROPDOWNLIST NU contine un control Edit.

Totusi controlul va fi notificat, dar nu via WM_CTLCOLOR asa cum se intelege din codul tau, ci via =WM_CTLCOLOR (prefixat cu '=' in lista din ClassWizard). E vorba de mesaje REFLECTATE de care povestem AICI si AICI.

Deci codul ar trebui sa arate ca in exemplul urmator:

Code: Select all

class CMyComboBox : public CComboBox
{
// ...
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
// ...
};

Code: Select all

//...
   ON_WM_CTLCOLOR_REFLECT()
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyComboBox message handlers

HBRUSH CMyComboBox::CtlColor(CDC* pDC, UINT nCtlColor) 
{
   HBRUSH hBrush = NULL;
   switch(nCtlColor)
   {
   case CTLCOLOR_EDIT:
      {
         pDC->SetBkColor(RGB(255, 0, 0));
         pDC->SetTextColor(RGB(255, 255, 255));
         hBrush = m_brush;
      }
      break;
   //...
   }
   return hBrush;
}

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum schimb background-ul unui CComboBox ?

Post by mesajflaviu » 28 Mar 2011, 17:42

Acum merge snur ! Multumesc mult !!!

Post Reply