第一步:添加一个ListCtrl、一个Edit、一个ComboBox,并关联变量,m_list,m_edit,m_combo。
第二步:将list控件设置风格m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);如果不设置该风格,后面获取选中列始终返回-1,并添加数据。
在ComboBox上添加数据。
第三步:为listCtrl添加双击响应事件。代码如下。其中需判断combobox判断是否可见,否则会出错。
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
if (m_combo.IsWindowVisible())
return;
//获取listctrl选中的行、列
m_row = pNMItemActivate->iItem;
m_col = pNMItemActivate->iSubItem;
CRect rect;
if (m_col == 2)
{
m_list.GetSubItemRect(m_row, m_col, LVIR_LABEL, rect);//获取双击处的位置
m_combo.SetParent(&m_list);//设置父窗口为list控件
m_combo.MoveWindow(rect);//将combobox移动到选中位置
m_combo.ShowWindow(SW_SHOW);//显示combobox
m_combo.SetCurSel(0);
}
else
{
m_list.GetSubItemRect(m_row, m_col, LVIR_LABEL, rect);
m_edit.SetParent(&m_list);
m_edit.MoveWindow(rect);
m_edit.SetWindowText(m_list.GetItemText(m_row, m_col));
m_edit.ShowWindow(SW_SHOW);
m_edit.SetFocus();
m_edit.ShowCaret();
m_edit.SetSel(-1);
}
*pResult = 0;
第四步:ComboBox添加选择响应事件,双击控件即可。Edit添加失去焦点响应事件,就是EN_KILLFOCUS消息。
void CListEditDlg::OnCbnSelchangeCombo1()
{
CString tmp;
int index = m_combo.GetCurSel();
m_combo.GetLBText(index, tmp);
m_list.SetItemText(m_row, m_col, tmp);
m_combo.ShowWindow(SW_HIDE);
}
void CListEditDlg::OnEnKillfocusEdit1()
{
CString tmp;
m_edit.GetWindowTextW(tmp);
m_list.SetItemText(m_row, m_col, tmp);
m_edit.ShowWindow(SW_HIDE);
}