MFC利用List Control实现Excel部分功能:单个单元格编辑、多行数据粘贴、左键框选统一框选范围所有数据。

目录

1.添加List Control控件。​编辑

2.给List Control控件添加CListCtrl变量 m_ListCtrl;

3.设置表格属性 SetListControlStyle(CListCtrl *m_ListCtrl)

4.表格初始化

5.实现单个单元格编辑输入 

5.1创建虚拟编辑框

5.2销毁创建的虚拟编辑框

5.3加入点击表格触发函数

5.4销毁对话框,下次点击表格另一单元格或点击到表格以外调用该函数进行虚拟编辑框的销毁

6.实现多行粘贴到List Control控件

6.1获取剪切板内容

6.2分割每一行数据 

6.3给对话框类重载虚函数PreTranslateMessage(MSG* pMsg)为了响应Ctrl键按下

6.4添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数响应何时按下Ctrl V

6.5粘贴到对应行列中paste(vector>ClipboardNumber, int Item, int SubItem)

7.实现左键框选并统一框选范围内的数据。

7.1 在头文件中定义:                                                                                                       

7.2为控件IDC_Listcontrol添加事件处理函数:OnLvnBegindragTraylist

7.3为弹出框添加事件处理函数:OnLButtonUp//鼠标左键抬起即触发

7.4框选实现函数Box_select()


1.添加List Control控件。

2.给List Control控件添加CListCtrl变量 m_ListCtrl;

3.设置表格属性 SetListControlStyle(CListCtrl *m_ListCtrl)

void CMTFTestDemoDlg::SetListControlStyle(CListCtrl *m_ListCtrl)
{
	LONG lStyle;
	lStyle = GetWindowLong(m_ListCtrl->m_hWnd, GWL_STYLE);// 获取当前窗口style 
	lStyle &= ~LVS_TYPEMASK; // 清除显示方式位 
	lStyle |= LVS_REPORT; // 设置style 
	SetWindowLong(m_ListCtrl->m_hWnd, GWL_STYLE, lStyle);// 设置style 
	DWORD dwStyle = m_ListCtrl->GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT;// 选中某行使整行高亮(只适用与report 风格的listctrl ) 
	dwStyle |= LVS_EX_GRIDLINES;// 网格线(只适用与report 风格的listctrl )
	//dwStyle |= LVS_EX_CHECKBOXES;//item 前生成checkbox 控件 
	m_ListCtrl->SetExtendedStyle(dwStyle); // 设置扩展风格
}

4.表格初始化

    //表格初始化 在对话框初始化函数中进行表格初始化
	e_Item = 0;
	e_SubItem = 0;
	SetListControlStyle(&m_ListCtrl);
	haveeditcreate = false;//虚拟编辑框是否创建的标志位
	CFont m_font;
	m_font.CreatePointFont(100, "新宋体");
	m_ListCtrl.SetFont(&m_font);
	CRect mRect;
	m_ListCtrl.GetWindowRect(&mRect);
	int height = mRect.Height();
	int width = mRect.Width();
	CImageList   m_1;
	CString ROW = "";
	m_1.Create(1, (height / (9 + 1) - 1), TRUE | ILC_COLOR32, 1, 0);  //设置行高
	m_ListCtrl.SetImageList(&m_1, LVSIL_SMALL);
	m_ListCtrl.InsertColumn(0, "Cam#", LVCFMT_LEFT, width / 5);
	m_ListCtrl.InsertColumn(1, "MedSag", LVCFMT_LEFT, width / 5);
	m_ListCtrl.InsertColumn(2, "MedTan", LVCFMT_LEFT, width / 5);
	m_ListCtrl.InsertColumn(3, "PassSag", LVCFMT_LEFT, width / 5);
	m_ListCtrl.InsertColumn(4, "PassTan", LVCFMT_LEFT, width / 5);
	for (int i = 0; i < 9; i++)
	{
		ROW.Format("Cam%d", i + 1);
		m_ListCtrl.InsertItem(i, ROW);
	}

//设置表格显示的内容
void CMTFTestDemoDlg::OninitListCtrl()
{
	int col = 1;
	CString temp = "";
	for (int i = 0; i < 9; i++)
	{
		col = 1;
		temp.Format("%.2f", Medium_Sag[i]);
		m_ListCtrl.SetItemText(i, col, temp);
		col++;
		temp.Format("%.2f", Medium_Tan[i]);
		m_ListCtrl.SetItemText(i, col, temp);
		col++;
		temp.Format("%.2f", Pass_Sag[i]);
		m_ListCtrl.SetItemText(i, col, temp);
		col++;
		temp.Format("%.2f", Pass_Tan[i]);
		m_ListCtrl.SetItemText(i, col, temp);
	}
	return;
}
//更新表格内容到数组
void CMTFTestDemoDlg::UpdataListCtrl()
{
	CString temp = "";
	int col = 1;
	for (int i = 0; i < 9; i++)
	{
		col = 1;
		temp = m_ListCtrl.GetItemText(i, col);
		Medium_Sag[i] = atof(temp);
		col++;
		temp = m_ListCtrl.GetItemText(i, col);
		Medium_Tan[i] = atof(temp);
		col++;
		temp = m_ListCtrl.GetItemText(i, col);
		Pass_Sag[i] = atof(temp);
		col++;
		temp = m_ListCtrl.GetItemText(i, col);
		Pass_Tan[i] = atof(temp);
	}
	return;
}

5.实现单个单元格编辑输入 

5.1创建虚拟编辑框

void CMTFTestDemoDlg::createEdit(NM_LISTVIEW *pEditCtrl, CEdit *createdit, int &Item, int &SubItem, bool &havecreat, CListCtrl *m_ListCtrl)
{
	Item = pEditCtrl->iItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
	SubItem = pEditCtrl->iSubItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
	createdit->Create(ES_AUTOHSCROLL | WS_CHILD | ES_LEFT | ES_WANTRETURN, CRect(0, 0, 0, 0), this, IDC_EDIT_CREATEID);//创建编辑框对象,IDC_EDIT_CREATEID为控件ID号3000,在Resource.h中定义
	havecreat = true;
    createdit->SetFont(this->GetFont(), FALSE);//设置字体,不设置这里的话上面的字会很突兀的感觉
	createdit->SetParent(m_ListCtrl);//将list control设置为父窗口,生成的Edit才能正确定位,这个也很重要
	CRect  EditRect;
	m_ListCtrl->GetSubItemRect(e_Item, e_SubItem, LVIR_LABEL, EditRect);//获取单元格的空间位置信息
	EditRect.SetRect(EditRect.left + 1, EditRect.top + 1, EditRect.right - 1, EditRect.bottom - 1);//+1和-1可以让编辑框不至于挡住列表框中的网格线
	CString strItem = m_ListCtrl->GetItemText(e_Item, e_SubItem);//获得相应单元格字符
	createdit->SetWindowText(strItem);//将单元格字符显示在编辑框上
	createdit->MoveWindow(&EditRect);//将编辑框位置放在相应单元格上
	createdit->ShowWindow(SW_SHOW);//显示编辑框在单元格上面
	createdit->SetFocus();//设置为焦点
	createdit->SetSel(-1);//设置光标在文本框文字的最后
}

5.2销毁创建的虚拟编辑框

void CMTFTestDemoDlg::distroyEdit(CListCtrl *list, CEdit* distroyedit, int &Item, int &SubItem)
{
	CString meditdata;
	distroyedit->GetWindowText(meditdata);
	list->SetItemText(Item, SubItem, meditdata);//获得相应单元格字符
	distroyedit->DestroyWindow();//销毁对象,有创建就要有销毁,不然会报错
}

5.3加入点击表格触发函数

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值