江南才子 发表于 2021-7-9 09:10:41

MFC列表控件List Control控件的使用方法

  拖一个List Control到对话框, 添加变量m_list , 设置表格属性View为 Report 。

        初始化表格
  设置列框,文本背景颜色,列名,列的布局样式等。
CRect rectL;
m_List.GetWindowRect(&rectL);
int widL = rectL.right - rectL.left;
int nColL = widL / 4;//列宽

m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);// 整行选择、网格线
m_List.SetTextBkColor(RGB(224, 238, 238));//设置文本颜色

m_List.InsertColumn(0, _T("学号"), LVCFMT_LEFT, nColL);
m_List.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, nColL);
m_List.InsertColumn(2, _T("专业"), LVCFMT_LEFT, nColL);
m_List.InsertColumn(3, _T("成绩"), LVCFMT_LEFT, nColL);        给表格插入数据
  (1)先插入行,InsertItem(), 注意,第一个参数是行号,第二个可以为空字符串,或者设为第0列的名称。
CString id[] = { "2019001","2019002","2019003","2019004","2019005","2019006" };
CString name[] = { "鲁班", "后裔", "猴子", "亚瑟", "安其拉", "甄姬" };
CString zhuanye[] = { "射手", "射手", "刺客", "战士", "法师", "法师" };
CString score[] = { "100", "98", "100","90", "92", "91" };

for (int i = 0; i < 6; i++)
{
    // 1. 先插入一行,i是行号,第二个参数是第0列的内容;可以不填为空
    //m_List.InsertItem(i, id);
    m_List.InsertItem(i, "");

    // 2.设置该行每一列的内容
    m_List.SetItemText(i, 0, id);
    m_List.SetItemText(i, 1, name);
    m_List.SetItemText(i, 2, zhuanye);
    m_List.SetItemText(i, 3, score);
}  效果如下:

  动态插入也可以,添加定时器消息,比如,先插入前3列,最后一列分数,动态插入。
  此时不需要先插入行,因为之前几列已经插入好了,最后一列不需要再用InsertItem().
void CListControlDemoDlg::OnTimer(UINT_PTR nIDEvent)
{
CString score[] = { "100", "98", "100","90", "92", "91" };

static int add = 1;

for (int i = 0; i < 6; i++)
{
CString str;
str.Format("-%d", add);
m_List.SetItemText(i, 3, score + str);
}

add++;

CDialog::OnTimer(nIDEvent);
}  List Control的作用很多,比如还可以在第0列添加checkbox,  做一个全选,反选的功能。
  MFC控件的比较难用,如果不是特殊需要,最好还是用Qt, MFC的API太难用了,Qt相对简单,而且做得界面也漂亮,qss语法很好修改样式,做出各种效果。
  List Control有一个很坑的地方,如果你把 Owner Draw Fixed属性设为True, 又忘记写重载类,那么会有DrawItem()的bug.


  
文档来源:51CTO技术博客https://blog.51cto.com/u_12570763/3012396
页: [1]
查看完整版本: MFC列表控件List Control控件的使用方法