Newsgroup: it.comp.programmare.win32
Titolo: ComboBox

Ciao
Questo messaggio è per tutti ma sicuramente Guglielmo sa la risposta!
Ho creato un CComboBox e vorrei colorare le varie righe che inserisco 
con AddString.
Con il CListCtrl ho capito come fare, ma mi pare che il ComboBox sia
un po' più rognoso.
Ho provato a fare una funzione Virtual DrawItem, ma sembra che non
basti.
Mi va in crash....
Sapete com aiutarmi?
Grazie
void CComboColori::DrawItem(LPDRAWITEMSTRUCT lpdrawitemstruct)
{
	CDC dc;
	dc.Attach(lpdrawitemstruct->hDC);
	CRect ColRec = lpdrawitemstruct->rcItem;
	if (lpdrawitemstruct->itemState & ODS_SELECTED)
	{
		dc.FillSolidRect (ColRec, GetSysColor
(COLOR_HIGHLIGHT));
		dc.SetTextColor (GetSysColor (COLOR_HIGHLIGHTTEXT));
	}
	else
	{
	switch(lpdrawitemstruct->itemID)
	 {
	case 0:
	dc.FillSolidRect (ColRec, COLORREF RGB (255,255,255));
	dc.SetTextColor (GetSysColor (COLOR_WINDOWTEXT));
	break;
	}
}


Eccolo... se fai il mio nome non posso non rispondere.
1) Intanto assicurati di avere il check su HasString a true tra le proprietà 
della combo box nella dialog e che l'ownerdraw sia Fixed (non variable)
2) Eccoti due righe di codice per tracciare una combo box tradizionale con 
colori alternati sulle righe pari dispari ;-)
void MyComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 if (GetCount() == 0 || lpDrawItemStruct->itemID > GetCount()) return;
 CString str;
 GetLBText(lpDrawItemStruct->itemID, str);
 CDC dc;
 BOOL bSelected = FALSE;
 dc.Attach(lpDrawItemStruct->hDC);
 COLORREF crOldTextColor = dc.GetTextColor();
 COLORREF crOldBkColor = dc.GetBkColor();
 COLORREF crNewBkColor = RGB(255,255,0);
 if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
  (lpDrawItemStruct->itemState & ODS_SELECTED))
 {
  dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
  dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
  dc.FillSolidRect(&lpDrawItemStruct->rcItem, 
::GetSysColor(COLOR_HIGHLIGHT));
  bSelected = TRUE;
 }
 else
 {
  if (lpDrawItemStruct->itemID & 1)
   dc.FillSolidRect(&lpDrawItemStruct->rcItem, crNewBkColor);
  else
   dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
 }
 CRect rect(lpDrawItemStruct->rcItem);
 rect.DeflateRect(1,0);
 dc.DrawText(str, -1, &rect, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
 dc.SetTextColor(crOldTextColor);
 dc.SetBkColor(crOldBkColor);
 dc.Detach();
} 

colori alternati sulle righe pari dispari ;-)
Ok, però ho dei problemi con qualche riga.
Ti spiego :
io all'initdialog  metto :
	//Inserisco i colori nel combo
	for (int i=0;i<=12;i++)
	{m_Combo_Colori.AddString(" ");}
poi su DrawItem metto : 
void CComboColori::DrawItem(LPDRAWITEMSTRUCT lpdrawitemstruct)
{
//if (GetCount() == 0 || lpdrawitemstruct->itemID > GetCount()) return;   QUESTA RIGA NON FUNZIONA mi dice che GET COUNT non lo riconsce
	 CString str;
	 GetLBText(lpDrawItemStruct->itemID, str);  //QUESTA RIGA NON FUNZIONA non riconosce GetLBText
 
	CDC dc;
	BOOL bSelected = FALSE;
    	dc.Attach(lpdrawitemstruct->hDC);
 
	CRect ColRec = lpdrawitemstruct->rcItem;
	if ((lpdrawitemstruct->itemAction | ODA_SELECT) && (lpdrawitemstruct->itemState & ODS_SELECTED))
	{
		dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
		dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
		dc.FillSolidRect(&lpdrawitemstruct->rcItem,::GetSysColor(COLOR_HIGHLIGHT));
		bSelected = TRUE;
	}
	else  // per provare ho messo questo.
	{
		dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
		dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
		dc.FillSolidRect(&lpdrawitemstruct->rcItem,::GetSysColor(COLOR_HIGHLIGHT));
		bSelected = FALSE;
	}
}
Però mi si interrompe quando clicco sulla tendina per farla scendere e si ferma su : 
void CComboBox::DrawItem(LPDRAWITEMSTRUCT)
	{ ASSERT(FALSE); }

Ciao
Visto che ci sono ti chiedo anche un'altra cosa.
Nel ClistCtrl che ho creato con OwnerDraw FIxed, sono spariti i checkbox che avevo messo con il comando :
ListView_SetExtendedListViewStyleEx(m_listcontrol,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB | LVS_EX_CHECKBOXES ,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB |
LVS_EX_CHECKBOXES );
Credi si possibile rimetterli?
Grazie ciao

 riconosce GetLBText
Se non li riconosce vuol dire che la classe CMyComboBox non è derivata da 
una CComboBox.
class MyComboBox : public CComboBox
-- 
Guglielmo
I programmatori passano il tempo a combinare cose ovvie in modi non ovvi
(Robert Dewar)

 Grazie ciao
No, perchč ora spetta a te disegnarli nella DrawItem chiamando la 
DrawFrameControl.
-- 
Guglielmo

class MyComboBox : public CComboBox
AHHHH! Hai ragione era un CWnd!
Com'è possibile....ok....avrò sbagliato con il mouse...
Grazie.



Ok, questo lo faccio un'altra volta.
Ho trovato un escamotage...:)
Grazie Mille!
CIao
F