Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перегрузка DrawItem

16K
27 июля 2006 года
Deeoni$
21 / / 09.06.2006
Стояла задача Выделять строки в комбобоксе и листбоксе своим, нестандартным цветом. Реализовать решил перегрузив DrawItem для этих контролов. Написал класс для комбо бокс
Код:
#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 взял из 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);


Но вся фишка в том что элемент структуры lpDrawItemStruct->itemData приходит пустым(т.е. нулевым), а там содержится указатель на текст и естественно DrawItem падает из-за этого.

Где я ошибся???
398
29 июля 2006 года
Alexandoros
630 / / 21.10.2005
Я с сабкласингом не возился. Так что посоветую просто наследовать клас контрола, и создать его на диалоге руками. Тогджа уж 100% заработает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог