c++ - samsung - CListCtrl muestra puntos suspensivos a pesar de tener mucho espacio(solo Win2008 y Win7)
memoria interna llena y no tengo nada (4)
Estoy usando un CListCtrl para mostrar algunos elementos con iconos en el modo ListView. La mayoría de las veces solo hay un elemento en la lista con mucho espacio a la derecha, pero en mi sistema Win2008 (o Win7) trunca el texto usando puntos suspensivos (por ejemplo, "Tanque" se trunca en "Ta ...") . Esto no ocurre con todos los datos (incluso algunas cadenas más largas funcionan), sino repetidamente con el ejemplo "Tanque". También en un sistema WinXP funciona bien, siempre.
La vista de lista se crea a través de un archivo rc con
CONTROL "List2",IDC_LIST,"SysListView32",LVS_LIST | WS_BORDER | WS_TABSTOP,320,27,195,38
entonces es instanciado
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);
Estoy insertando solo 1 columna con el siguiente formato:
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.iSubItem = 0;
myListCtrl.InsertColumn(0,&lvc);
Y los datos se insertan
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);
He intentado
myListCtrl.SetColumnWidth(column, LVSCW_AUTOSIZE_USEHEADER);
tanto como
myListCtrl.SetColumnWidth(column, LVSCW_AUTOSIZE);
Y un
myListCtrl.SetExtendedStyle(LVS_EX_AUTOSIZECOLUMNS);
tampoco hizo el truco.
¿Algunas ideas?
Micha
Tuve este problema y creo que finalmente encontré la respuesta. El problema en mi caso era que el diálogo tenía una fuente especificada en este estilo:
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"
.
.
.
Si DS_SETFONT
la línea FONT
y el indicador CListCtrl
, CListCtrl
comenzó a mostrar el texto sin truncamiento nuevamente.
Mi suposición es que está usando diferentes fuentes para medir el ancho del texto y hacer el dibujo, esto está causando el truncamiento.
Esto podría ayudarte. Llame a esta función después de haber insertado todas sus columnas y filas.
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();
}
}
Estaba tirando de mi pelo en este, ya que tenía 2 CListCtrl idénticos en el mismo cuadro de diálogo y uno mostraba las elipsis y el otro no.
El problema en mi caso resultó ser que los elementos que estaba insertando tenían un carácter de nueva línea anexa (10) como resultado de leer los elementos del archivo con _fgetts (). El retorno de carro muestra el mismo problema.
La longitud del elemento no importaba; si tenía un carácter de línea nueva, los dos últimos caracteres se quitarían y se reemplazarían con puntos suspensivos (aunque se mostrarían al menos 1 carácter). El problema solo se manifestó en Vista / Windows 7 y los servidores equivalentes 2008, 2008 R2. Imagino que Windows 8 y Server 2012 también lo muestran, pero aún no lo han probado.
¡Despojar al personaje de la nueva línea muestra el ítem en toda su gloria!
En mi caso aparecieron puntos suspensivos al final de cada fila después de cambiar el tamaño de la lista. La llamada a "SetRedraw (falso)" antes de completar la lista y "SetRedraw (verdadero)" para finalizar la finalización de la lista de verificación (la solución de Tom Archer) fue la solución.