MFC中利用ListControl制作空表格,由键盘输入数据并保存在数组中

实现的功能:Dlg窗口弹出表格,用户通过双击表格的空白处结汇自动添加一行,点击该行的空白格变成可编辑模式,键盘输入数据后,该数据被存入定义的数组中。这个问题在网上看了很多文档都没有比较完整的方法,我也是请教了师兄才做出来的,MFC新手怕忘就写下来啦~

  1. 创建对话框及必要的控件
    创建对话框,命名为listControl,由类向导创建类ClistControlDlg;
    在对话框中拖入一个listControl控件,命名为m_store_items,风格:report;
    添加一个editControl控件,命名为m_edit_pos,默认是Control变量;
  2. 创建表格(所在函数:BOOL ClistControlDlg::OnInitDialog()

// TODO: 在此添加额外的初始化代码
DWORD dwStyle = m_store_items.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;	//使整行高亮
dwStyle |= LVS_EX_GRIDLINES;//网格线
m_store_items.SetExtendedStyle(dwStyle);
//设置表头,第一行标题,后面的数字表示列宽
m_store_items.InsertColumn(0,"ID号/位置号",LVCFMT_LEFT,80);
m_store_items.InsertColumn(1,"上表面y",LVCFMT_LEFT,60);
m_store_items.InsertColumn(2,"上表面z",LVCFMT_LEFT,60);
m_store_items.InsertColumn(3,"下表面y",LVCFMT_LEFT,60);
m_store_items.InsertColumn(4,"下表面z",LVCFMT_LEFT,60);
return TRUE;

3.创建好表格格式后,点击列表框添加双击事件代码

void ClistControlDlg::OnNMDblclkStoreItems(NMHDR *pNMHDR, LRESULT *pResult)
// TODO: 在此添加控件通知处理程序代码
	CRect rc;
	CString strTemp;
	NM_LISTVIEW *pNMListView=(NM_LISTVIEW *)pNMHDR;
	m_Row=pNMListView->iItem;//每一行的item从零开始,双击选中行号
	m_Col=pNMListView->iSubItem;//每一行中的列就是SubItem也是从零开始,获得选中列号
	if(m_Row==-1||m_Col==-1)//点击空白处添加一行,并且设置焦点为最后一行第二列
	{
		m_Row=m_store_items.GetItemCount();
		strTemp.Format(_T("%d"),m_Row+1);
		m_store_items.InsertItem(m_Row,strTemp);
	m_store_items.SetItemState(m_Row,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
		m_store_items.EnsureVisible(m_Row,FALSE);

	}
	if(m_Col!=-1)//选择子项
	{
		m_store_items.GetSubItemRect(m_Row,m_Col,LVIR_LABEL,rc);
		m_edit_pos.SetParent(&m_store_items);
		m_edit_pos.MoveWindow(rc);
		m_edit_pos.SetWindowTextA(m_store_items.GetItemText(m_Row,m_Col));//设置选中框的数值(由用户输入 )
		str0 = m_store_items.GetItemText(m_Row,m_Col);//获取选中框中的数据
		m_edit_pos.ShowWindow(SW_SHOW);//显示在窗口中
		m_edit_pos.SetFocus();//设置edit焦点
		m_edit_pos.ShowCaret();//显示光标
		m_edit_pos.SetSel(-1);
		
	}
	*pResult = 0;
  1. 点击edit控件添加killFocus函数void ClistControlDlg::OnEnKillfocusEdit()
// TODO: 在此添加控件通知处理程序代码
	m_edit_pos.GetWindowTextA((LPTSTR)(LPCTSTR)str0,-1);//获取输入框中的数据
	m_store_items.SetItemText(m_Row,m_Col,str0);//设置选中框的字符为刚刚输入的值
    //将输入的数据传递给结构体数组
	if(m_Col%4==0)
		damage[m_Row].downz=str0;
	else if(m_Col%3==0)
		damage[m_Row].downy=str0;
	else if(m_Col%2==0)
		damage[m_Row].upz=str0;
	else 
		damage[m_Row].upy=str0;
  1. 补充,将需要的数组写在一个结构体中
    MFC中利用ListControl制作空表格,由键盘输入数据并保存在数组中_第1张图片
  2. 效果如图所示:
    MFC中利用ListControl制作空表格,由键盘输入数据并保存在数组中_第2张图片

你可能感兴趣的:(C++,MFC)