其中我用到了ClistCtrl的Report报表形式,此处便记录下相关的代码,本篇为list的初始化和单击单元格实现输入的功能

第一步就是添加ClistCtrl控件,然后为其添加变量,此处我们将其变量设为 m_list_input

ClistCtrl初始化

此处仅为示例代码,具体根据自己的项目修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CRect rect;

// 获取输入(INPUT)列表视图控件的位置和大小
m_list_input.GetClientRect(&rect);

// 为列表视图控件添加全行选中和栅格风格
m_list_input.SetExtendedStyle(m_list_input.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

// 为列表视图控件添加七列
m_list_input.InsertColumn(0, _T("序号"), LVCFMT_CENTER, rect.Width() / 7, 0);
m_list_input.InsertColumn(1, _T("姓名"), LVCFMT_CENTER, rect.Width() / 7, 1);
m_list_input.InsertColumn(2, _T("语文"), LVCFMT_CENTER, rect.Width() / 7, 2);
m_list_input.InsertColumn(3, _T("数学"), LVCFMT_CENTER, rect.Width() / 7, 3);
m_list_input.InsertColumn(4, _T("英语"), LVCFMT_CENTER, rect.Width() / 7, 4);
m_list_input.InsertColumn(5, _T("总分"), LVCFMT_CENTER, rect.Width() / 7, 5);
m_list_input.InsertColumn(6, _T("名次"), LVCFMT_CENTER, rect.Width() / 7, 6);

单击单元格输入数据

首先,我们需要添加一个Edit控件,并为其设置默认不显示属性。对其添加变量为” m_edit_input “

接下来我们重写OnClick函数实现单击显示Edit控件并出现在相应的位置。代码如下

  1. 先在头文件中添加m_Row和m_Col,用来保存鼠标单击的行号和列标

    1
    2
    int m_Row = -1;
    int m_Col = -1;
  2. 在cpp文件OnClick中输入如下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void CxxxxProDlg::OnClickListInput(NMHDR* pNMHDR, LRESULT* pResult)
    {
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    CRect rc;
    CString strTemp;
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    m_Row = pNMListView->iItem;
    m_Col = pNMListView->iSubItem;

    if (m_Col != 0) // 选择子项
    {
    m_list_input.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);
    m_edit_input.SetParent(&m_list_input);
    m_edit_input.MoveWindow(rc);
    m_edit_input.SetWindowTextW(m_list_input.GetItemText(m_Row, m_Col));
    m_edit_input.ShowWindow(SW_SHOW);
    m_edit_input.SetFocus();//设置Edit焦点
    m_edit_input.ShowCaret();//显示光标
    m_edit_input.SetSel(0, -1);//全选
    }
    *pResult = 0;
    }

最后我们输入完数据后需要将该数据存入对应的单元格中,代码如下

1
2
3
4
5
6
7
void CxxxxProDlg::OnKillfocusEdit1()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
m_edit_input.GetWindowTextW(str);
m_list_input.SetItemText(m_Row, m_Col, str);
m_edit_input.ShowWindow(SW_HIDE);