对于需要使用到子控件的单元格,就把子控件移动到需要使用的位置就好。
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(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);//销毁单元格下拉列表框