我正在使用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);
我只使用以下格式插入一列:
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 :(得分:1)
我有这个问题,我想我终于找到了答案。在我的情况下,问题是该对话框具有以此样式指定的字体:
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 :(得分: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();
}
}
答案 2 :(得分:0)
我正在把这头发拉出来,因为我在同一个对话框中有两个相同的CListCtrl,一个显示省略号而另一个没有。
我的案例中的问题结果是我插入的项目由于使用_fgetts()从文件中读取项目而附加了换行符(10)。回车显示同样的问题。
项目的长度无关紧要,如果它有换行符,则最后2个字符将被删除并替换为省略号(尽管至少会显示1个字符)。该问题仅表现在Vista / Windows 7和服务器等效2008,2008 R2上。我想Windows 8和Server 2012也展示了它,但还没有测试过。
剥离换行符会使项目充满光彩!
答案 3 :(得分:0)
在我的案例中,在调整列表大小后,每行末尾出现省略号。在填写列表之前调用“SetRedraw(false)”和“SetRedraw(true)”以完成清单的完成(Tom Archer的解决方案)是解决方案。