Я создаю подкласс в поле со списком WTL, и я рисую его элементы. Элемент управления имеет атрибуты CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWVARIABLE
, и я использую смешанный класс COwnerDraw для реализации DrawItem () и MeasureItem (). Когда раскрывающийся список недоступен, элементы отображаются правильно. Однако когда выпадающий список открыт, элемент управления в выпадающем списке пуст и элемент не отрисован. Что я делаю не так?
Класс WTL выглядит следующим образом:
class CMyComboBox :
public CWindowImpl<CMyComboBox, CComboBox>,
public COwnerDraw<CMyComboBox>
{
public:
BEGIN_MSG_MAP_EX(CMyComboBox)
CHAIN_MSG_MAP(COwnerDraw<CMyComboBox>)
CHAIN_MSG_MAP_ALT(COwnerDraw<CMyComboBox>, 1)
END_MSG_MAP()
void DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDCHandle dc = lpDIS->hDC;
dc.FillSolidRect(&lpDIS->rcItem, lpDIS->itemID == 0 ?
RGB(255,0,0) : RGB(0,255,0));
}
void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemWidth = 12;
lpMeasureItemStruct->itemHeight = 12;
}
};
Класс используется в диалоге и подклассами выглядит так:
m_cbMy.SubclassWindow(GetDlgItem(IDC_COMBO1));
m_cbMy.AddString(_T("Item 1"));
m_cbMy.AddString(_T("Item 2"));
Изменение атрибутов управления на CBS_OWNERDRAWFIXED
ничего не меняет.
Edit:
Благодаря помощи Najmeddine я понял, что мне нужно обработать WM_PAINT, чтобы нарисовать настоящий комбинированный список, а не только элементы в раскрывающемся списке. К сожалению, теперь я также должен нарисовать элемент управления со списком. Есть ли способ позволить GDI нарисовать границу и опустить стрелку, чтобы мне нужно было только нарисовать "внутренности" элемента управления?