CListCtrl第一列为什么不能居中?

时间:2021-08-02 19:31:58
CListCtrl m_listLog;

m_listLog.InsertColumn(0, "Name", LVCFMT_CENTER, 200);
m_listLog.InsertColumn(1, "Resource", LVCFMT_CENTER, 200);

int nRow(0);
nRow = m_listLog.InsertItem(0, "str00");
m_listLog.SetItemText(nRow, 1, "str01");

nRow = m_listLog.InsertItem(0, "str10");
m_listLog.SetItemText(nRow, 1, "str11");


第二列开始,都可居中, 为什么第一列不行呢?

20 个解决方案

#1


可以先删除第一列,后来的第一列就可以居中显示了

#2


删除后的第二列就相当于第一列,在写程序时序号还是0

#3


引用 2 楼 hnwyllmm 的回复:
可以先删除第一列,后来的第一列就可以居中显示了
删除后的第二列就相当于第一列,在写程序时序号还是0
这是CListCtrl的bug吗?

#4


帮顶。

#5


先删除第一列,如此怪!

#6


先记下

#7


自绘,想居那里都可
DrawText()

#8


我处理的时候
让第一列的宽度为1
然后填充的就看不出来
第二列就能居中

#9


nRow = m_listLog.InsertItem(0, "str00");
m_listLog.SetItemText(nRow, 1, "str01");

nRow = m_listLog.InsertItem(0, "str10");把0该修改为1试下。。
m_listLog.SetItemText(nRow, 1, "str11");

#10


MS自己搞的,第一列式不能设置格式的,MSDN里有说明:
If a column is added to a list-view control with index 0 (the leftmost column) and with LVCFMT_RIGHT or LVCFMT_CENTER specified, the text is not right-aligned or centered. The text in the index 0 column is left-aligned. Therefore if you keep inserting columns with index 0, the text in all columns are left-aligned. If you want the first column to be right-aligned or centered you can make a dummy column, then insert one or more columns with index 1 or higher and specify the alignment you require. Finally delete the dummy column.

大致意思是这样的:索引为0的列(最左边的列)如果设置了LVCFMT_RIGHT或LVCFMT_CENTER属性,上面的文字并不会右对齐或居中对齐。索引为0 的列是左对齐。如果你要想第一列右对齐或者居中对齐,你可以这样做,先保留索引为0的列,其他的列均指定右对齐或居中对齐属性,最后删除索引为0的列。

下面是实例代码:
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
CString str[] ={_T(""), _T("AAA"), _T("BBB"), _T("CCC"), _T("DDDD"), _T("EEE")};
for(int i=0; i<sizeof(str)/sizeof(str[0]); i++)
{
m_list.InsertColumn(i, str[i], LVCFMT_CENTER, 100);
m_list.InsertItem(i, _T(""));
m_list.SetItemText(i, 0, _T("AAA"));
}
m_list.DeleteColumn(0);

#11


这个没有为什么
想剧中的话就重绘吧

#12


或者考虑把索引为0的列宽度设置为0,然后冻结起来。
实现隐藏效果,然后界面上第二列就取代了第一列的位置。

#13


mark一下

#14


重绘好像也改不了

#15


按12楼的方法试下,把第0列的Width设置为0,然后让第0列也不能拖动,也就是隐藏第0列..这样就可以设置后面的列居中了吧..

#16


引用 14 楼 zhou1xp 的回复:
重绘好像也改不了


我说的重绘表头

#17


LVCOLUMN   lvc;
lvc.mask   =   LVCF_FMT;
m_list2.GetColumn(0, &lvc);
lvc.fmt   &=   ~LVCFMT_JUSTIFYMASK;
lvc.fmt   |=   LVCFMT_CENTER;
m_listLayer.SetColumn(0, &lvc);

#18


引用 17 楼 wang471981125 的回复:
LVCOLUMN   lvc;
lvc.mask   =   LVCF_FMT;
m_list2.GetColumn(0, &amp;lvc);
lvc.fmt   &amp;=   ~LVCFMT_JUSTIFYMASK;
lvc.fmt   |=   LVCFMT_CENTER;
m_listLayer.SetColumn(0, &amp;lvc);

这个方法缺点在于:单击的时候会回到左边

#19


搜索半天,也就那么几个解决方法。

#20


找微软去

#1


可以先删除第一列,后来的第一列就可以居中显示了

#2


删除后的第二列就相当于第一列,在写程序时序号还是0

#3


引用 2 楼 hnwyllmm 的回复:
可以先删除第一列,后来的第一列就可以居中显示了
删除后的第二列就相当于第一列,在写程序时序号还是0
这是CListCtrl的bug吗?

#4


帮顶。

#5


先删除第一列,如此怪!

#6


先记下

#7


自绘,想居那里都可
DrawText()

#8


我处理的时候
让第一列的宽度为1
然后填充的就看不出来
第二列就能居中

#9


nRow = m_listLog.InsertItem(0, "str00");
m_listLog.SetItemText(nRow, 1, "str01");

nRow = m_listLog.InsertItem(0, "str10");把0该修改为1试下。。
m_listLog.SetItemText(nRow, 1, "str11");

#10


MS自己搞的,第一列式不能设置格式的,MSDN里有说明:
If a column is added to a list-view control with index 0 (the leftmost column) and with LVCFMT_RIGHT or LVCFMT_CENTER specified, the text is not right-aligned or centered. The text in the index 0 column is left-aligned. Therefore if you keep inserting columns with index 0, the text in all columns are left-aligned. If you want the first column to be right-aligned or centered you can make a dummy column, then insert one or more columns with index 1 or higher and specify the alignment you require. Finally delete the dummy column.

大致意思是这样的:索引为0的列(最左边的列)如果设置了LVCFMT_RIGHT或LVCFMT_CENTER属性,上面的文字并不会右对齐或居中对齐。索引为0 的列是左对齐。如果你要想第一列右对齐或者居中对齐,你可以这样做,先保留索引为0的列,其他的列均指定右对齐或居中对齐属性,最后删除索引为0的列。

下面是实例代码:
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
CString str[] ={_T(""), _T("AAA"), _T("BBB"), _T("CCC"), _T("DDDD"), _T("EEE")};
for(int i=0; i<sizeof(str)/sizeof(str[0]); i++)
{
m_list.InsertColumn(i, str[i], LVCFMT_CENTER, 100);
m_list.InsertItem(i, _T(""));
m_list.SetItemText(i, 0, _T("AAA"));
}
m_list.DeleteColumn(0);

#11


这个没有为什么
想剧中的话就重绘吧

#12


或者考虑把索引为0的列宽度设置为0,然后冻结起来。
实现隐藏效果,然后界面上第二列就取代了第一列的位置。

#13


mark一下

#14


重绘好像也改不了

#15


按12楼的方法试下,把第0列的Width设置为0,然后让第0列也不能拖动,也就是隐藏第0列..这样就可以设置后面的列居中了吧..

#16


引用 14 楼 zhou1xp 的回复:
重绘好像也改不了


我说的重绘表头

#17


LVCOLUMN   lvc;
lvc.mask   =   LVCF_FMT;
m_list2.GetColumn(0, &lvc);
lvc.fmt   &=   ~LVCFMT_JUSTIFYMASK;
lvc.fmt   |=   LVCFMT_CENTER;
m_listLayer.SetColumn(0, &lvc);

#18


引用 17 楼 wang471981125 的回复:
LVCOLUMN   lvc;
lvc.mask   =   LVCF_FMT;
m_list2.GetColumn(0, &amp;lvc);
lvc.fmt   &amp;=   ~LVCFMT_JUSTIFYMASK;
lvc.fmt   |=   LVCFMT_CENTER;
m_listLayer.SetColumn(0, &amp;lvc);

这个方法缺点在于:单击的时候会回到左边

#19


搜索半天,也就那么几个解决方法。

#20


找微软去

#21