2013-01-09 5 views
0

ComboBox DropDowns의 텍스트가 모두 최종 매개 변수로 DT_SINGLELINE | DT_VCENTER를 구문 분석하는 pDC-> DrawText 함수를 사용하여 의 가운데에 맞도록 응용 프로그램을 수정하는 DrawItem 재정의 메서드를 작성했습니다. 현재 내가 가지고있는 문제는 DropDown에서 첫 번째 값을 반복 할 수 있지만 모든 값 목록을 DropDown에 표시하고 싶습니다. MFC ComboBox DrawItem 문제

응용 프로그램의 다른 컨트롤과 같이 근본적인 결함이있는 경우 확실하지 않습니다. ListCtr lpDrawItemStruct-> itemData 은 DrawItem 재정의가 호출 될 때 채워진 것처럼 보입니다. 그러나 ComboBox lpDrawItemStruct-> itemData의 경우에는 비어있는 것으로 표시됩니다.

누구든지 도와 드릴 수 있습니까? 아래는 지금까지의 코드입니다. 당신이 lpDrawItemStruct->itemID를 사용하지만 항상 m_strListEntry에서 첫 번째 항목을 추출하지 않는 것처럼

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

리소스 편집기의 데이터 속성을 통해 ComboBox 내용을 추가하는 경우 '문자열 있음'도 사용할 수 있습니다. 그런 다음 GetLBText (lpDIS-> itemID, strItem);로 그릴 텍스트를 얻을 수 있습니다. 그렇지 않으면'm_strListEntry'가 설정 될 때마다 ComboBox를 채 웁니다. –

답변

1

는 것 같습니다. lpDrawItemStruct->itemID에는 현재 그려지는 항목이 포함되어 있습니다.

CString m_strListEntryCStringArray m_arrListEntry으로 바꾸는 것이 좋습니다. 이 경우 항목 추출은 단 한 줄의 코드 일 것입니다.

CString item = m_arrListEntry[lpDrawItemStruct->itemID];