MFC ComboBox DrawItem问题

时间:2013-01-09 11:25:48

标签: c++ mfc ondrawitem

我正在编写一个DrawItem覆盖方法来修改应用程序,以便ComboBox DropDowns中的文本全部居中 使用pDC-> DrawText函数解析DT_SINGLELINE | DT_VCENTER作为最终参数。 我现在遇到的问题是我可以在DropDown中重复第一个值,但我想要一个包含所有值的列表 显示在DropDown中。

我不确定这里是否存在基本缺陷,例如应用程序中的其他控件,例如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 ); 
}

1 个答案:

答案 0 :(得分:1)

您似乎不使用lpDrawItemStruct->itemID,但始终从m_strListEntry中提取第一项。 lpDrawItemStruct->itemID包含当前正在绘制的项目。

在旁注中,我建议将CString m_strListEntry替换为CStringArray m_arrListEntry。在这种情况下,提取项目只需一行代码:

CString item = m_arrListEntry[lpDrawItemStruct->itemID];