• 解决ListCtrl控件第一列文字不能居中显示的问题/修改网格线


    把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);
    赌上我的人生为梦想,即使是臭名远扬,也要我的名字响彻天堂
  • 相关阅读:
    absolute 导致点击事件无效
    windows 下的命令操作
    localStorage 设置本地缓存
    css渐变
    vue-cli webpack全局引入jquery
    #024分段函数。
    #023单词接龙1(字符串)(女友)
    #022 Python 实验课
    #021 Java复习第一天
    #020PAT 没整明白的题L1-009 N个数求和 (20 分)
  • 原文地址:https://www.cnblogs.com/ye-ming/p/7087012.html
Copyright © 2020-2023  润新知