把CListCtrl设置为Report风格,但是插入第一列的时候(InsertColumn)的时候会发现文字不能居中。即使使用了LVCFMT_CENTER,其他列都可以正常居中,但第一列仍然靠左显示。
插入第一列后,改变它的参数:
LVCOLUMN lvc; lvc.mask = LVCF_FMT; GetColumn(0, &lvc); lvc.fmt &=~ LVCFMT_JUSTIFYMASK; lvc.fmt |= LVCFMT_CENTER; SetColumn(0, &lvc);
第一列式不能设置格式的,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);
修改网格线颜色:
const MSG *msg = GetCurrentMessage(); DefWindowProc(msg->message, msg->wParam, msg->lParam); //这两句不能省,否则程序会因消息循环出现异常 // Draw the lines only for LVS_REPORT mode if ((GetStyle() & LVS_TYPEMASK) == LVS_REPORT) { // Get the number of columns CClientDC dc(this); CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0); int nColumnCount = pHeader->GetItemCount(); // The bottom of the header corresponds to the top of the line RECT rect; pHeader->GetClientRect(&rect); int top = rect.bottom; // Now get the client rect so we know the line length and // when to stop GetClientRect(&rect); // The border of the column is offset by the horz scroll int borderx = 0 - GetScrollPos(SB_HORZ); CPen listSepPen(PS_SOLID, 1, RGB(0, 0, 0)); //定制你的分割线的颜色 CPen *pOldPen = dc.SelectObject(&listSepPen); for (int i = 0; i < nColumnCount; i++) { // Get the next border borderx += GetColumnWidth(i); // if next border is outside client area, break out if (borderx >= rect.right) break; // Draw the line. dc.MoveTo(borderx, top); dc.LineTo(borderx, rect.bottom); } // Draw the horizontal grid lines // First get the height if (!GetItemRect(0, &rect, LVIR_BOUNDS)) return; int height = rect.bottom - rect.top; GetClientRect(&rect); int width = rect.right; for (int i = 1; i <= GetCountPerPage(); i++) { dc.MoveTo(0, top + height*i); dc.LineTo(width, top + height*i); } dc.SelectObject(pOldPen);