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


Автор: oper54 24.6.2005, 14:55
Хочу изменить стандартные контролы.
Для создания контролов насколько я знаю - наследуют класс нужного контрола или CWnd,
в этом классе используют DrawItem для изменения прорисовки контрола (например класс круглой кнопки).
Если можно пример(с коментариями) создания контрола с использованием этой функции,
или ссылку на документацию по теме создания контролов.

Автор: En_t_end 24.6.2005, 19:34
oper54
Есть очень хороший ресурс по контролам, там по идее должны быть исходники... www.codeproject.com -> http://www.codeproject.com/script/articles/subcat.asp?id=3
Посмотри... там их много.

Автор: JoyEx 24.6.2005, 19:36
MSDN

Visual C++ MFC Samples

CTRLTEST Sample: Implements Custom Controls -> Example: Owner Drawing (Menu and List Box)

А принцип там простой: в DrawItem() получаете контекст (HDC) окна и сами в нем рисуете, а в MeasureItem() можно установить размеры.

Код


void ... MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
    lpMIS->itemHeight = MY_ITEM_HEIGHT;
}

void ... DrawItem(LPDRAWITEMSTRUCT lpDIS)
{

CDC* pDC = CDC::FromHandle(lpDIS->hDC);

}

Автор: lioness 17.9.2008, 11:29
А кто бы подсказал, почему я ВООБЩЕ не прихожу в DrawItem? 

Это мой контрол в диалоге:
Код

    CListBoxAdvancedEx        m_myListbox;


Fixed для Owner Draw в свойствах поставила. 

Это в моем классе CListBoxAdvancedEx.h  для модернизированного ListBox-a
Код

    public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);


И в процедуре 

Код

/////////////////////////////////////////////////////////////////////////////
// CListBoxAdvancedEx message handlers

void CListBoxAdvancedEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
    // TODO: Add your code to draw the specified item
    CDC cdc;

               и так далее..

я не бываю сАААвсем  smile 

Автор: Earnest 18.9.2008, 08:52
А связывание через DDX_Control есть?

Автор: lioness 18.9.2008, 09:25
Да. В диалоге есть:

Код

void DMyDialog::DoDataExchange(CDataExchange* pDX)
{
    //{{AFX_DATA_MAP(CStartwerteDlg)
.....
    DDX_Control(pDX, IDC_LIST_LASTFALL, m_myListbox);
.....
    //}}AFX_DATA_MAP
}


и информация в этот ListBox заносится совершенно правильно. Мне нужно было только, чтобы некоторые строки стояли в красном цвете. Красный цвет в соответствующее поле заношу при m_myListbox.addLine.  То есть, я бываю в процедуре класса CListBoxAdvancedEx.срр

Я не посещаю DrawItem в классе CListBoxAdvancedEx. Ведь точно ни в какую таблицу этот event не заносится? Должно автоматически прерываться?  Чего в супе не хватает...?

Автор: lioness 22.10.2008, 14:49
Никто ничего не ответил, но так тайна и осталась покрытая мраком.
Я взяла другой класс, который производный от 

Код

class AFX_EXT_CLASS CListCtrlAdvanced : public CListCtrl


И в нем легко разного цвета сделать строчки и столбцы с текстом выстроились ровненько, независимо от длины самой текстовой строчки, что мне и требовалось. 

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