MFC ComboBox DrawItem Проблема

Я пишу метод переопределения DrawItem для изменения приложения, чтобы текст в раскрывающихся списках ComboBox располагался по центру
используя функцию pDC-> DrawText для анализа DT_SINGLELINE | DT_VCENTER в качестве конечного параметра.
Проблема, с которой я столкнулся на данный момент, заключается в том, что я могу получить первое значение, повторенное в DropDown, но мне нужен список всех значений
отображается в DropDown.

Я не уверен, есть ли здесь фундаментальный недостаток, как в других элементах управления в приложении, например a ListCtr lpDrawItemStruct-> itemData
кажется, заполняется, когда вызывается переопределение DrawItem. Однако для случая ComboBox lpDrawItemStruct-> itemData отображается пустым.

Пожалуйста, кто-нибудь может помочь с этим? Ниже приведен код.

void CFCDropDown::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC) ;
int nSavedDC = pDC->SaveDC();

//I can't use the following because at this stage lpDrawItemStruct->itemData doesn't contain anything
//LPCTSTR lpszText = (LPCTSTR)lpDrawItemStruct->itemData ;

//I do however have access to a member variable that contains the list of items I want in the drop down
//m_strListEntry contains a CString of format "ONE;TWO;THREE;FOUR;FIVE;SIX"CString strFieldValue = m_strListEntry ;

int noOfItems  = GetCount();
CString item;

int iStartPos = 0;
int iFirstDelimiter = 0;
iFirstDelimiter = m_strListEntry.Find(LISTDELIMITER,iStartPos);

int i = iFirstDelimiter + 1;

int iStrLen = strFieldValue.GetLength();
int iNewLen = iStrLen - ++iFirstDelimiter;

item = strFieldValue.Left(i -1) ;

LPCTSTR lpszText = (LPCTSTR)item ;

//At the moment I'm getting "ONE" repeated 6 times. I want a list of all the values displayed in the DropDown.
pDC->DrawText(lpszText, strlen(lpszText), &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER) ;

pDC->RestoreDC( nSavedDC );
}

0

Решение

Похоже, вы не используете lpDrawItemStruct->itemID но всегда извлекаю первый элемент из вашего m_strListEntry, lpDrawItemStruct->itemID содержит элемент, который в данный момент рисуется.

На заметку, я рекомендую заменить CString m_strListEntry с CStringArray m_arrListEntry, В этом случае извлечение элемента будет просто одной строкой кода:

CString item = m_arrListEntry[lpDrawItemStruct->itemID];
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]