Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Отрисовка ItemDraw CComboBox


Автор: heavix 10.2.2012, 13:58
Доброго времени суток форумчане! 
Создаю кастомный комбобокс в котором реализуется возможность задизабленых элементов...
Создал свой класс, унаследовался от 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;
    }
}


пробовал делать меньше ректангл в котором текст выводится - просто текст обрезаю - но ширина айтема такая же(
Подскажите пожалуйста как справится! Всем заранее спасибо!  

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

Автор: heavix 21.2.2012, 11:49
Цитата

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


Вот со шрифтом я тоже игрался... устанавливал его намного меньше, вот только высота контрола все равно не изменилась ((... пытался установить размер шрифта, потом изменить размер контрола - в результате в ширину размер контрола меняется, а вот высота остается такой же большой... Даже не знаю что еще можно сделать...

Автор: Estranged 2.3.2012, 19:33
В коде не видно, как вы пользуетесь собственным шрифтом, а используете шрифт самого комбо. Надеюсь, Вы дописывали MeasureItem и DrawItem, чтобы использовать свой собственный шрифт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)