目录
2.给List Control控件添加CListCtrl变量 m_ListCtrl;
3.设置表格属性 SetListControlStyle(CListCtrl *m_ListCtrl)
5.4销毁对话框,下次点击表格另一单元格或点击到表格以外调用该函数进行虚拟编辑框的销毁
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.2为控件IDC_Listcontrol添加事件处理函数:OnLvnBegindragTraylist
7.3为弹出框添加事件处理函数:OnLButtonUp//鼠标左键抬起即触发
1.添加List Control控件。![](https://img-blog.csdnimg.cn/d5c792bac6a04700b93d072209fab882.png)
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加入点击表格触发函数