CListCtrl показывает многоточие, несмотря на достаточно места (только Win2008 и Win7) - PullRequest
4 голосов
/ 31 января 2012

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

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

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);

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

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);

тоже не добился цели.

Есть идеи?

Миха

Ответы [ 4 ]

1 голос
/ 15 апреля 2013

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

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();
  }
}
1 голос
/ 12 апреля 2013

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

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 снова начал отображать текст без усечения.

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

0 голосов
/ 30 сентября 2013

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

0 голосов
/ 12 сентября 2013

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

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

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

Снятие символа новой строки показало предмет во всей красе!

...