#include ".\moderncomboboxctrl.h"
IMPLEMENT_DYNAMIC(CModernComboBoxCtrl, CComboBox)
CModernComboBoxCtrl::CModernComboBoxCtrl()
{
}
CModernComboBoxCtrl::~CModernComboBoxCtrl()
{}
void CModernComboBoxCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct->CtlType == ODT_COMBOBOX);
LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData;
ASSERT(lpszText != NULL);
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
// Save these value to restore them when done drawing.
COLORREF crOldTextColor = dc.GetTextColor();
COLORREF crOldBkColor = dc.GetBkColor();
// If this item is selected, set the background color
// and the text color to appropriate values. Erase
// the rect by filling it with the background color.
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));
}
else
dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
// Draw the text.
dc.DrawText(
lpszText,
strlen(lpszText),
&lpDrawItemStruct->rcItem,
DT_CENTER|DT_SINGLELINE|DT_VCENTER);
// Reset the background color and the text color back to their
// original values.
dc.SetTextColor(crOldTextColor);
dc.SetBkColor(crOldBkColor);
dc.Detach();
}
Перегрузка DrawItem
Код:
собственно код для самой DrawItem взял из MSDN. Контрол на диалоге создается в ресурсах и потом сабкласится и заполняется примерно таким кодом
Код:
CModernComboBoxCtrl* combo = new CModernComboBoxCtrl;
combo->SubclassDlgItem(IDC_COMBOBOX, this);
for (int i=0; i<languages.GetCount(); i++)
combo->AddString(languages.GetAt(i));
combo->SelectString(-1,theApp.Status.generalSettings.Language);
combo->SubclassDlgItem(IDC_COMBOBOX, this);
for (int i=0; i<languages.GetCount(); i++)
combo->AddString(languages.GetAt(i));
combo->SelectString(-1,theApp.Status.generalSettings.Language);
Но вся фишка в том что элемент структуры lpDrawItemStruct->itemData приходит пустым(т.е. нулевым), а там содержится указатель на текст и естественно DrawItem падает из-за этого.
Где я ошибся???
Я с сабкласингом не возился. Так что посоветую просто наследовать клас контрола, и создать его на диалоге руками. Тогджа уж 100% заработает.