Member 13089825 Ответов: 1

Drawitem не получает вызова


я создал свой собственный пользовательский элемент управления CMyComboBox класса и его производных от CCombobox.
я добавил DrawItem в качестве виртуальной функции, но эта функция не вызывается при загрузке моего ежедневника
не могли бы вы сказать мне, как вызвать drawitem здесь
2) мне нужно объединить все функции combobox в этом классе
не могли бы вы пожалуйста, дайте мне некоторые предложения по этому вопросу

Что я уже пробовал:

oid CMyComboBox:: DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct - >CtlType == ODT_COMBOBOX);
LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct- & gt;itemData;
ASSERT(lpszText != NULL);
CDC dc;

dc. Attach(lpDrawItemStruct- & gt;hDC);

// Сохраните эти значения, чтобы восстановить их после завершения рисования.
COLORREF crOldTextColor = dc. GetTextColor();
COLORREF crOldBkColor = dc. GetBkColor();

// Если этот пункт выбран, установите цвет фона
// и цвет текста до соответствующих значений. Стирать
// прямая кишка, заполнив ее цветом фона.
если ((lpDrawItemStruct-&ГТ;itemAction &амп; ODA_SELECT) и усилитель; &
(lpDrawItemStruct- & gt;itemState & ODS_SELECTED))
{
dc.SetTextColor (:: GetSysColor(COLOR_HIGHLIGHTTEXT));
постоянного тока.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
dc. FillSolidRect(& lpDrawItemStruct->rcItem,:: GetSysColor(COLOR_HIGHLIGHT));
}
еще
{
dc. FillSolidRect(& lpDrawItemStruct-> rcItem, crOldBkColor);
}

// Нарисуйте текст.
постоянного тока.То drawtext(
lpszText,
(int)_tcslen(lpszText),
& lpDrawItemStruct- & gt;rcItem,
DT_CENTER|DT_SINGLELINE|DT_VCENTER);

// Сбросьте цвет фона и цвет текста обратно на их место.
// изначальные значения.
dc. SetTextColor(crOldTextColor);
dc. SetBkColor(crOldBkColor);

постоянного тока.Отсоединить();
}

1 Ответов

Рейтинг:
2

Jochen Arndt

Чтобы получить DrawItem() функция будет вызвана вы должны сделать элемент управления собственником нарисованным путем установки CBS_OWNERDRAWVARIABLE флаг стиля. Это можно сделать, передав стиль при вызове Create() или указание соответствующей опции в Редакторе ресурсов при использовании contol в шаблоне диалогового окна.


Member 13089825

Привет, я попытался передать CBS_OWNERDRAWVARIABLE в функции create, но все еще не получил вызова drawitem
BOOL TestDlg:: OnInitDialog()
{
CDialogEx:: OnInitDialog();
MyComboBox m_combobox;
Crect тогда rectDummy;
ректдумми.SetRectEmpty();
//m_combobox = новый CJimsUiComboBox();
если (m_combobox.Create (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | CBS_SORT |
CBS_OWNERDRAWVARIABLE, rectDummy, this, 1))
{
}

Jochen Arndt

В приведенном выше коде вы создаете локальный экземпляр, который удаляется при выходе из функции. Удалять

MyComboBox m_combobox;

и убедитесь, что он является членом вашего класса TestDlg.

Member 13089825

Привет спасибо за ваше предложение
drwaitem получает вызов, но я получаю здесь некоторые ненужные данные.
combox имеет данные "item0", "item 1" (добавлено это в dailog- & gt;combobox - >Data)
но в drawitem его грядет какая-то мусорная ценность
DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct - >CtlType == ODT_COMBOBOX);
LPCTSTR lpszText = (LPCTSTR)lpDrawItemStruct - > itemData;/ / здесь получаем ненужную строку
пример:'敤'

и пожалуйста, подскажите мне, как изменить цвет текста и фона в зависимости от выбранного элемента combobox
не могли бы вы предложить мне здесь

Jochen Arndt

Элемент itemData содержит строки, добавленные с помощью функций-членов Ccombobbox AddString или InsertString.
Таким образом, itemData должна содержать допустимые строки, и я не знаю, что не так.

Обратите внимание, что значения, передаваемые в CCombobBox::SetItemData (), отличаются и не указаны в DRAWITEMSTRUCT.

Member 13089825

Когда я вставляю данные, как показано ниже, его исключение выбрасывания
TestDlg::Oninitdialog Не()
{

CDialogEx:: OnInitDialog();

m_combobox.InsertString(0, L "item 0"); / / m_combobox является членом mycombobox и объявлен в testdlg.ч m_combobox MyComboBox ;

m_combobox.InsertString(1, L " пункт 1");

Jochen Arndt

Вы сделали это после вызова m_combobox?Создать()?

Member 13089825

я добавил, как показано ниже, но все еще бросаю исключение
Crect тогда rectDummy;
ректдумми.SetRectEmpty();
m_combobox.Create (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | CBS_SORT | CBS_OWNERDRAWVARIABLE, rectDummy, this, 1);
m_combobox.AddString(L " item 0");
m_combobox.AddString (L "item22") и если я комментирую addstring, то он не выбрасывает исключение, а drawitem не получает вызова при вызове create()

Jochen Arndt

Какое исключение?
Проверьте возвращаемое значение Create (), чтобы убедиться, что ваш элемент управления был создан.
Используйте отладочную сборку и начните с отладки, чтобы узнать, где это происходит.

Обратите внимание также, что вы ничего не увидите на экране, даже если нет никаких исключений, потому что вы проходите пустой rect (combobox имеет высоту и ширину ноль пикселей).

Member 13089825

привет, create возвращает только true.
я прошел как CRect rectDummy(0,0,40,40);но он показывает новое окно в диалоге
не могли бы вы, пожалуйста, подсказать мне, что у нас есть pass rect value

Jochen Arndt

Rect определяет положение в диалоговом окне и размер. Я не могу сказать вам, что там проходить, потому что только вы должны знать, где должен быть показан контроль.

Он не должен отображаться в новом окне. Возможно,вам следует удалить стиль WS_BORDER.