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

对于需要使用到子控件的单元格,就把子控件移动到需要使用的位置就好。
1、创建工程,添加控件CEdit和CListCtrl到对话框。
MFC CListctrl里面使用编辑框和下拉框_第1张图片
分别添加控件变量:

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(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、效果。
MFC CListctrl里面使用编辑框和下拉框_第2张图片

你可能感兴趣的:(MFC随笔)