尽管有足够的空间(仅Win2008和Win7),CListCtrl显示省略号

时间:2012-01-31 11:32:20

标签: c++ winapi user-interface mfc clistctrl

我正在使用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);

也没有做到这一点。

有什么想法吗?

米莎

4 个答案:

答案 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的解决方案)是解决方案。