MFC CListctrl里面使用编辑框和下拉框

对于需要使用到子控件的单元格,就把子控件移动到需要使用的位置就好。
1、创建工程,添加控件CEdit和CListCtrl到对话框。
在这里插入图片描述
分别添加控件变量:

protected:
	CEdit m_Edit;
	CListCtrl m_ListCtrl;
	int m_row;//选中行
	int m_col;//选中列

2、需要在对话框初始化里面响应Init().

void CListEditComboBoxDlg::Init()
{
	m_Edit.ShowWindow(SW_HIDE);

	m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

	m_ListCtrl.InsertColumn(0, _T("姓名"), LVCFMT_CENTER, 60);
	m_ListCtrl.InsertColumn(1, _T("年龄"), LVCFMT_CENTER, 60);
	m_ListCtrl.InsertColumn(2, _T("性别"), LVCFMT_CENTER, 60);
	m_ListCtrl.InsertColumn(3, _T("科目"), LVCFMT_CENTER, 60);
	m_ListCtrl.InsertColumn(4, _T("分数"), LVCFMT_CENTER, 60);

	SetListText();

	CenterWindow();
	AnimateWindow(50, AW_BLEND);
}
void CListEditComboBoxDlg::SetListText()
{
	InitTestText();
}
void CListEditComboBoxDlg::InitTestText()
{

#ifdef _DEBUG
	const char* pTT[] = { "张一", "16", "男", "数学一", "80" };

	int nRowIdx = m_ListCtrl.GetItemCount();
	
	m_ListCtrl.InsertItem(nRowIdx, "");
	for (int i = 0; i < 5;i++)
	{
		m_ListCtrl.SetItemText(nRowIdx, i,pTT[i]);
	}
#endif // _DEBUG

}

3、添加编辑框响应事件ON_EN_KILLFOCUS

void CListEditComboBoxDlg::OnEnKillfocusEdit1()
{
	SetListTest();
}
void CListEditComboBoxDlg::SetListTest()
{
	m_Edit.ShowWindow(SW_HIDE);
	if (m_col < 0 || m_row < 0) return;
	//修改

	CString key;
	m_Edit.GetWindowText(key);
	m_ListCtrl.SetItemText(m_row, m_col, key);
}

4、添加列表控件响应事件NM_CLICK,需要重点处理。

void CListEditComboBoxDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	NM_LISTVIEW  *pEditCtrl = (NM_LISTVIEW *)pNMHDR;
	if (pEditCtrl->iItem == -1)
	{
		return;
	}
	else if (pEditCtrl->iSubItem == 4 || pEditCtrl->iSubItem == 0 || pEditCtrl->iSubItem == 1)//编辑框
	{
		CRect rc;
		m_row = pNMItemActivate->iItem;//m_row选中行行号
		m_col = pNMItemActivate->iSubItem;//m_col选中行列号
		m_ListCtrl.GetSubItemRect(pNMItemActivate->iItem, pNMItemActivate->iSubItem, LVIR_LABEL, rc);//取得子项的矩形

		m_ListCtrl.ClientToScreen(&rc);
		ScreenToClient(&rc);
		char * ch = new char[128];
		m_ListCtrl.GetItemText(pNMItemActivate->iItem, pNMItemActivate->iSubItem, ch, 128);//取得子项的内容
		m_Edit.SetWindowText(ch);//将子项的内容显示到编辑框中
		m_Edit.MoveWindow(&rc);//将编辑框移动到子项上面,覆盖在子项上
		m_Edit.ShowWindow(SW_SHOW);//显示编辑框
		m_Edit.SetFocus();//使编辑框取得焦点
		m_Edit.CreateSolidCaret(1, rc.Height() - 5);//创建一个光标
		m_Edit.ShowCaret();//显示光标
		m_Edit.SetSel(0, -1);//使光标移到最后面
		delete[] ch;
	}
	else//在单元格处生成下拉列表项
	{
		if (m_bExistComboBox == true)
		{
			if (!(m_row == pEditCtrl->iItem && m_col == pEditCtrl->iSubItem))//如果点中的单元格不是之前创建好的
			{
				DestroyCombox(&m_ListCtrl, &m_ComBox, m_row, m_col);
				m_bExistComboBox = false;
				CreateCombox(pEditCtrl, &m_ComBox, m_row, m_col, m_bExistComboBox);//创建编辑框
				LoadComboBox(m_col);
				m_ComBox.ShowDropDown();//自动下拉
			}
			else//点中的单元格是之前创建好的
			{
				m_ComBox.SetFocus();//设置为焦点 
			}
		}
		else
		{
			m_row = pEditCtrl->iItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
			m_col = pEditCtrl->iSubItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
			CreateCombox(pEditCtrl, &m_ComBox, m_row, m_col, m_bExistComboBox);//创建编辑框
			LoadComboBox(m_col);
			m_ComBox.ShowDropDown();//自动下拉
		}
	}
	*pResult = 0;
}

5、重要成员。

protected:
	void Init();
	void SetListText();
	void InitTestText();
	void LoadComboBox(int col);//按列
	void SetListTest();

protected:
	CComboBox m_ComBox;
	bool m_bExistComboBox;
	void CreateCombox(NM_LISTVIEW  *pEditCtrl, CComboBox *pCreateObj, int &item, int &subItem, bool &bHaveCreate);//创建单元格下拉列表框函数
	void DestroyCombox(CListCtrl *pList, CComboBox *pCreateObj, int &item, int &subItem);//销毁单元格下拉列表框

6、效果。
在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MFC是Microsoft Foundation Classes的缩写,是微软为了简化Windows编程而开发的一套C++类库。ListCtrlMFC中的一个控件,用于显示和编辑数据的列表。 要在MFC中实现可编辑的ListCtrl控件,可以按照以下步骤进行操作: 1. 在对话框资源中添加一个ListCtrl控件,并设置其属性,如样式、列数等。可以使用控件向导来简化这一过程。 2. 在对话框类的头文件中声明一个ListCtrl对象,用于对控件进行操作。例如,在CDialog派生类中添加如下成员变量: ```cpp CListCtrl m_listCtrl; ``` 3. 在OnInitDialog函数中获取ListCtrl控件的指针,并进行初始化操作。例如: ```cpp m_listCtrl.SubclassDlgItem(IDC_LISTCTRL, this); //将控件与IDC_LISTCTRL关联起来 m_listCtrl.InsertColumn(0, _T("列1"), LVCFMT_LEFT, 100); //插入列 ``` 4. 通过ListCtrl对象的成员函数,可以实现对控件中的数据进行操作。例如,添加一行数据的代码如下: ```cpp m_listCtrl.InsertItem(0, _T("数据1")); //在第0行插入一行数据 m_listCtrl.SetItemText(0, 1, _T("数据2")); //设置第0行、第1列的数据 ``` 5. 若要实现可编辑功能,可以通过响应鼠标双击、单击或其他事件,在合适的位置进行编辑操作。例如,在双击某一项时弹出对话框进行编辑: ```cpp int index = m_listCtrl.GetSelectionMark(); //获取当前选中的项 CString data = m_listCtrl.GetItemText(index, 1); //获取选中项的数据 CEditDialog editDlg; //自定义的对话框类 editDlg.m_editCtrl.SetWindowText(data); //将数据显示在对话框的编辑框中 if (editDlg.DoModal() == IDOK) { CString newData; editDlg.m_editCtrl.GetWindowText(newData); //获取对话框中编辑框的数据 m_listCtrl.SetItemText(index, 1, newData); //更新ListCtrl控件中的数据 } ``` 通过以上步骤,就可以实现在MFC中可编辑的ListCtrl控件。需要注意的是,在实际应用过程中可能还需要处理其他事件、进行数据校验等操作,具体实现可根据需求进行扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值