2015-06-10 3 views
1

У меня есть MFC List Control в Visual Studio 2013 (C++) со списком элементов (View Report)Как я могу использовать многострочный элемент в MFC ListControl?

LVCOLUMN lvColumn; 

     lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; 
     lvColumn.fmt = LVCFMT_LEFT; 
     lvColumn.cx = 120; 
     lvColumn.pszText = "Full Name"; 
     ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(0, &lvColumn); 

     lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; 
     lvColumn.fmt = LVCFMT_LEFT; 
     lvColumn.cx = 75; 
     lvColumn.pszText = "Profession"; 
     ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(1, &lvColumn); 

     lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; 
     lvColumn.fmt = LVCFMT_LEFT; 
     lvColumn.cx = 80; 
     lvColumn.pszText = "Fav Sport"; 
     ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(2, &lvColumn); 

     lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; 
     lvColumn.fmt = LVCFMT_LEFT; 
     lvColumn.cx = 75; 
     lvColumn.pszText = "Hobby"; 
     ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(3, &lvColumn); 

     LVITEM lvItem; 
     int nItem; 

     lvItem.mask = LVIF_TEXT; 
     lvItem.iItem = 0; 
     lvItem.iSubItem = 0; 
     lvItem.pszText = "Sandra C. Anschwitz"; 
     nItem = ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(&lvItem); 

     ((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 1, "Singer"); 
     ((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 2, "HandBall"); 
     ((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 3, "Beach"); 

Как я могу получить многострочные элементы для полного имени, профессии, спорта и хобби?

ответ

2

Удивительно, но это невозможно с CListCtrl по умолчанию. Но, с небольшим пользовательским кодированием (и некоторым обманом), вы можете получить необходимый эффект.

Во-первых, вам нужно получить свой собственный класс из CListCtrl и установить бит рисования владельца (Владелец Draw Fixed = true) для стиля управления. В своем родительском диалоговом классе создайте список изображений (вот трюк). Список изображений будет использоваться для указания высоты каждой строки элемента управления списком. В моем примере я использовал:

m_imagelist.Create(48, 48, ILC_COLOR4, 10, 10); 
m_listctrl.SetImageList(&m_imagelist, LVSIL_SMALL); 

Вы должны будете играть с сми и су значения для списка изображений, чтобы соответствовать вашим потребностям. Ваш элемент управления будет использовать список изображений для каждой строки, поскольку он ожидает отображения значков. Затем добавьте обработчик DrawItem так:

void MyClistCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    { 
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); 

    CString text = _T("Now is the time \nfor all good men\nto come to the aid"); 
    pDC->DrawText(text , &lpDrawItemStruct->rcItem, DT_TOP); 
    // TODO: Add your code to draw the specified item 
    } 

В моем примере это приводит ...

enter image description here

Это не может быть элегантным решением, но это работает. Примечание. При таком подходе каждая строка будет иметь одинаковую высоту.

EDIT: Существует несколько способов получить текст строки. Проще всего было бы использовать GetItemText так:

CString txt = GetItemText(lpDrawItemStruct->itemID, 0); 
pDC->DrawText(txt, &lpDrawItemStruct->rcItem, DT_TOP); 

выше, предполагает установить текст для каждой строки, используя один из методов CListCtrl установить текст.

+0

Большое спасибо, но можете ли вы рассказать мне, как вставлять текст предмета и другую информацию в DrawItem()? В настоящее время я называю 'SetItemText (nItem, 1, Actoss.str(). C_str());' Теперь, как вызвать DrawItem()? например какова должна быть ценность LPDRAWITEMSTRUCT? –

+1

@TOWI_Parallelism DrawItem вызывается, когда необходимо визуализировать элемент управления рисованием владельца. Вы не называете это напрямую. MFC вызовет вашу реализацию, давая вам возможность нарисовать содержимое элемента управления. [LPDRAWITEMSTRUCT] (https://msdn.microsoft.com/en-us/library/kfd1y2sd.aspx) будет заполнена информацией, которую вы используете для рисования элемента управления. – rrirower

+0

, но есть ли способ вставить желаемый текст для каждого элемента в LPDRAWITEMSTRUCT? В вашем коде все элементы будут иметь одинаковый txt. –