Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отрисовка ItemDraw CComboBox, Отрисовка ItemDraw CComboBox 
:(
    Опции темы
heavix
Дата 10.2.2012, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Доброго времени суток форумчане! 
Создаю кастомный комбобокс в котором реализуется возможность задизабленых элементов...
Создал свой класс, унаследовался от CComboBox... переопределил виртуальную метод
DrawItem следующим образом:

Код

void 
CDisableItemComboBox::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 item is Disabled
    bool enabled = enabledStatus_[lpDrawItemStruct->itemID];
    // 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((enabled)?(::GetSysColor(COLOR_HIGHLIGHTTEXT)):(::GetSysColor(COLOR_GRAYTEXT)));
        dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
        dc.FillSolidRect(&lpDrawItemStruct->rcItem, ::GetSysColor(COLOR_HIGHLIGHT));
    }
    else
    {
        dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
        if(!enabled)
            dc.SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
    }

    // Draw the text.
    const RECT &rc=lpDrawItemStruct->rcItem;
    dc.ExtTextOut(rc.left + 2,
                        rc.top + 2,
                        ETO_OPAQUE, &rc,lpszText, strlen(lpszText), NULL);
    // Reset the background color and the text color back to their
    // original values.
    dc.SetTextColor(crOldTextColor);
    dc.SetBkColor(crOldBkColor);

    dc.Detach();
}
 

Обьявляю объект в паренте, исспользую DDX_control - сабклашу от комбика из ресурсов...
У меня в ресурсах несколько комбиков - все одного размера... у одного из них ownerdraw - fixed
Так вот собственно вопрос:
Никак не могу понять почему именно этот элемент(кастомный) выглядит больше и имеет больший отступ между текстом внутри элементов?
Я пробовал ставить ownerdraw в variable, и обрабатывал MeasureItem, где явно задавал lpMeasureItemStruct->itemHeight размеру текста, но результат тот же(
код такой:
Код

void 
CDisableItemComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
    ASSERT(lpMeasureItemStruct->CtlType == ODT_COMBOBOX);

    if (lpMeasureItemStruct->itemID != (UINT) -1)
    {
        LPCTSTR lpszText = (LPCTSTR) lpMeasureItemStruct->itemData;
        ASSERT(lpszText != NULL);
        CSize   sz;
        CDC*    pDC = GetDC();

        sz = pDC->GetTextExtent(lpszText);

        ReleaseDC(pDC);

        lpMeasureItemStruct->itemHeight = sz.cy;
    }
}


пробовал делать меньше ректангл в котором текст выводится - просто текст обрезаю - но ширина айтема такая же(
Подскажите пожалуйста как справится! Всем заранее спасибо!  
PM MAIL   Вверх
Estranged
Дата 15.2.2012, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



Все правильно делаете. Только вот собственный combo имеет какой же шрифт, как и другие стандартные? Вдруг он больше по высоте
PM MAIL   Вверх
heavix
Дата 21.2.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Цитата

   Все правильно делаете. Только вот собственный combo имеет какой же шрифт, как и другие стандартные? Вдруг он больше по высоте


Вот со шрифтом я тоже игрался... устанавливал его намного меньше, вот только высота контрола все равно не изменилась ((... пытался установить размер шрифта, потом изменить размер контрола - в результате в ширину размер контрола меняется, а вот высота остается такой же большой... Даже не знаю что еще можно сделать...
PM MAIL   Вверх
Estranged
Дата 2.3.2012, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



В коде не видно, как вы пользуетесь собственным шрифтом, а используете шрифт самого комбо. Надеюсь, Вы дописывали MeasureItem и DrawItem, чтобы использовать свой собственный шрифт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0728 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.