2012-01-31 6 views
4

Я использую CListCtrl для отображения некоторых элементов с значками в режиме ListView. В большинстве случаев в списке есть только один элемент с большим количеством места вправо, но в моей системе Win2008 (или Win7) он обрезает текст с помощью многоточия (например, «Танк» усечен до «Та ...») , Это не происходит со всеми данными (даже некоторые более длинные строки работают), но неоднократно с примером «Танк». Также в системе WinXP он отлично работает - всегда.CListCtrl показывает многоточие, несмотря на много места (только Win2008 и Win7)

Представление списка создается с помощью файла гс с

CONTROL "List2",IDC_LIST,"SysListView32",LVS_LIST | WS_BORDER | WS_TABSTOP,320,27,195,38 

тогда она конкретизируется

myListCtrl.SubclassDlgItem(IDC_LIST, this); 
myListCtrl.ModifyStyle(LVS_OWNERDRAWFIXED, LVS_SHAREIMAGELISTS | LVS_SINGLESEL | LVS_SHOWSELALWAYS); 

ListView_SetBkColor(myListCtrl.m_hWnd,PMAINFRM->GetColor(IDCOLOR_LI_BKG)); 
ListView_SetTextBkColor(myListCtrl.m_hWnd,PMAINFRM->GetColor(IDCOLOR_LI_BKG)); 

myListCtrl.SetImageList(PMAINFRM->GetImageList(IDICO_16),LVSIL_NORMAL); 
myListCtrl.SetImageList(PMAINFRM->GetImageList(IDICO_16),LVSIL_SMALL); 

Я вставив только один столбец, в следующем формате:

LV_COLUMN lvc; 
lvc.mask = LVCF_FMT | LVCF_SUBITEM; 
lvc.fmt = LVCFMT_LEFT; 
lvc.iSubItem = 0; 
myListCtrl.InsertColumn(0,&lvc); 

И данные вставляются

int index = 0; 
int nItem = m_lstClass.InsertItem(index,(LPTSTR) strLabel, iIconID)); 
myListCtrl.SetItemData(nItem, (DWORD)index); 
myListCtrl.SetItemState(nItem, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); 

Я попытался

myListCtrl.SetColumnWidth(column, LVSCW_AUTOSIZE_USEHEADER); 

, а также

myListCtrl.SetColumnWidth(column, LVSCW_AUTOSIZE); 

и А

myListCtrl.SetExtendedStyle(LVS_EX_AUTOSIZECOLUMNS); 

не делать трюк либо.

Любые идеи?

Миха

+0

Вы пытались вручную установить ширину столбца в методах InsertColumn() или SetColumnWidth(), чтобы увидеть, происходит ли что-то другое? – uesp

+0

@uesp Да, никакого эффекта. Я даже попытался установить столбец шириной 0f 800, но ничего не изменилось (CString testHeader = "testHeader"; m_lstCtrl.InsertColumn (0, (LPCTSTR) testHeader, LVCFMT_LEFT, 800, 0);) – Micha

+0

Какой стиль стиля вы инициализируете контроль? –

ответ

0

Я имел эту проблему, и я думаю, что я, наконец, нашел ответ. Проблема в моем случае было то, что диалог был шрифт, указанный в этом стиле:

IDD_DIALOG_TurnOnOffRecords DIALOG 0, 0, 376, 263 
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "Turn on off records" 
FONT 8, "@Arial Unicode MS" 
. 
. 
. 

Если я удалил FONT линию и DS_SETFONT флаг, CListCtrl начал показывать текст без усечения снова.

Мое предположение заключается в том, что он использует разные шрифты для измерения ширины текста и на самом деле делает чертеж, это вызывает усечение.

1

Это может вам помочь. Вызовите эту функцию после того, как вы вставили все свои столбцы и строки.

void SizeAllColumns(CListCtrl& list) 
{ 
    CHeaderCtrl* pHeader = list.GetHeaderCtrl(); 
    ASSERT(pHeader); 
    if (pHeader) 
    { 
    // Turn off redraw until the columns have all been resized 
    list.SetRedraw(FALSE); 

    for (int iCurrCol = 0; 
     iCurrCol < pHeader->GetItemCount(); 
     iCurrCol++) 
    { 
     list.SetColumnWidth(iCurrCol, LVSCW_AUTOSIZE); 

     int nCurrWidth = list.GetColumnWidth(iCurrCol); 

     list.SetColumnWidth(iCurrCol, LVSCW_AUTOSIZE_USEHEADER); 

     int nColHdrWidth = list.GetColumnWidth(iCurrCol); 

     list.SetColumnWidth(iCurrCol, max(nCurrWidth, nColHdrWidth)); 
    } 

    // Now that sizing is finished, turn redraw back on and 
    // invalidate so that the control is repainted 
    list.SetRedraw(TRUE); 
    list.Invalidate(); 
    } 
} 
0

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

Проблема в моем случае оказалась в том, что элементы, которые я вставлял, имели добавленный символ новой строки (10) в результате чтения элементов из файла с помощью _fgetts(). Возврат каретки отображает ту же проблему.

Длина элемента не имеет значения, если у него был символ новой строки, тогда последние 2 символа будут разделены и заменены на многоточие (хотя будет показано хотя бы 1 символ). Эта проблема проявилась только в Vista/Windows 7 и эквивалентах сервера 2008, 2008 R2. Я полагаю, Windows 8 и Server 2012 также показывают это, но еще не тестировали это.

Снятие символа новой строки отображает элемент в его полной славе!

0

В моем случае появилось многоточие в конце каждой строки после изменения размера списка. Вызов «SetRedraw (false)» перед заполнением списка и «SetRedraw (true)», чтобы завершить доработку контрольного списка (решение Tom Archer), было решением.

 Смежные вопросы

  • Нет связанных вопросов^_^