MFC List Control 控件添加单元格编辑,实现可编辑重写
在实现随机生成四则运算的个人项目中,目前已经完成基本功能,想要把程序变成一个Windows界面的程序。原本以为学习过MFC,应该很快就能完成。但是由于以前用的都是VC6.0,这次用了VS2010,稍微有点不适应,而且也有一段时间没用,悲催地发现自己已经很不熟练了(╮(╯▽╰)╭基本上自己以前写的MFC应用程序都是看网上傻瓜教程,扯远了~~~)。经过分析发现,用MFC实现显示四则运算表达式然后接受用户输入答案,单纯地用List Control好像不能实现,所以又在网上搜索了实现可编辑List-Control的教程,自己跟着实现了一遍。
首先,创建的是基于对话框的MFC应用程序,对话框为FourArithOperDlg,在FourArithOperDlg.h中添加如下变量和函数:
int e_Item;//刚编辑的行
int e_SubItem;//刚编辑的列
CEdit m_Edit;//生成单元编辑框
bool haveeditcreate;//标志编辑框已经被创建
void createEdit(NM_LISTVIEW *pEditCtrl, CEdit *createdit, int &Item, int &SubItem, bool &havecreat);//创建单元格编辑框函数
void distroyEdit(CListCtrl *list, CEdit* distroyedit, int &Item, int &SubItem);//销毁单元格编辑框对象
在对话框的初始函数中添加初始化代码如下:这里的列表框第一行显示表达式,第二行显示答案。
CRect rect;
m_expression.GetClientRect(&rect);
m_expression.SetExtendedStyle(m_expression.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_expression.InsertColumn(,_T("运算表达式"), LVCFMT_CENTER, rect.Width()/,);
m_expression.InsertColumn(,_T("结果"), LVCFMT_CENTER, rect.Width()/,);
m_expression.InsertItem(,_T("1+1"));
m_expression.SetItemText(,,_T(""));
haveeditcreate = false;
为列表框添加单击响应函数,NM_CLICK,这里只是让第二列,也就是显示答案的那一列单击产生编辑框。
NM_LISTVIEW * pEditCtrl = (NM_LISTVIEW *)pNMHDR;
printf("行:%d,列:%d\n",pEditCtrl->iItem,pEditCtrl->iSubItem);
if (pEditCtrl->iItem == -)//点击到非工作区
{
if (haveeditcreate == true)//如果之前创建了编辑框就销毁掉
{
distroyEdit(&m_expression,&m_Edit,e_Item,e_SubItem);//销毁单元格编辑对象
haveeditcreate = false;
}
}
else if(pEditCtrl->iSubItem == )//如果选择第二列
{
if (haveeditcreate == true)
{
if (!(e_Item == pEditCtrl->iItem && e_SubItem == pEditCtrl->iSubItem))//如果点中的单元格不是之前创建的
{
distroyEdit(&m_expression,&m_Edit,e_Item,e_SubItem);
haveeditcreate = false;
createEdit(pEditCtrl,&m_Edit,e_Item,e_SubItem,haveeditcreate);
}
else //点中的单元格是之前创建的
{
m_Edit.SetFocus();//设置为焦点
}
}
else
{
e_Item = pEditCtrl->iItem;
e_SubItem = pEditCtrl->iSubItem;
createEdit(pEditCtrl,&m_Edit,e_Item,e_SubItem,haveeditcreate);//创建编辑框
}
}
接下来就是创建与销毁单元格编辑框的实现了。
void CFourArithOperDlg::distroyEdit(CListCtrl *list,CEdit* distroyedit, int &Item, int &SubItem)
{
CString meditdata;
distroyedit->GetWindowTextW(meditdata);
list->SetItemText(Item, SubItem, meditdata);//获得相应单元格字符
distroyedit->DestroyWindow();//销毁对象,有创建就要有销毁,不然会报错
}
void CFourArithOperDlg::createEdit(NM_LISTVIEW *pEditCtrl, CEdit *createdit, int &Item, int &SubItem, bool &havecreat)
{
Item = pEditCtrl->iItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
SubItem = pEditCtrl->iSubItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
createdit->Create(ES_AUTOHSCROLL | WS_CHILD | ES_LEFT | ES_WANTRETURN,
CRect(, , , ), this, IDC_EDIT_CREATEID);//创建编辑框对象,IDC_EDIT_CREATEID为控件ID号3000,在Resource.h中定义
havecreat = true;
createdit->SetFont(this->GetFont(), FALSE);//设置字体,不设置这里的话上面的字会很突兀的感觉
createdit->SetParent(&m_expression);//将list control设置为父窗口,生成的Edit才能正确定位,这个也很重要
CRect EditRect;
m_expression.GetSubItemRect(e_Item, e_SubItem, LVIR_LABEL, EditRect);//获取单元格的空间位置信息
EditRect.SetRect(EditRect.left+, EditRect.top+, EditRect.left + m_expression.GetColumnWidth(e_SubItem)-, EditRect.bottom-);//+1和-1可以让编辑框不至于挡住列表框中的网格线
CString strItem = m_expression.GetItemText(e_Item, e_SubItem);//获得相应单元格字符
createdit->SetWindowText(strItem);//将单元格字符显示在编辑框上
createdit->MoveWindow(&EditRect);//将编辑框位置放在相应单元格上
createdit->ShowWindow(SW_SHOW);//显示编辑框在单元格上面
createdit->SetFocus();//设置为焦点
createdit->SetSel(-);//设置光标在文本框文字的最后
}
然后,解决单元格编辑框中回车键的处理,在教程中说可以重载对话框类的OnOK函数来避免。所以在对话框类中添加声明
afx_msg void OnOk();
在对话框cpp文件中函数内为空。
void CFourArithOperDlg::OnOk()
{}
但是此时,在编辑框中修改数据,然后点击其他的单元格,编辑框还停留在上一个单元格中,所以在对话框类声明中添加动态生成编辑框失去焦点响应函数
afx_msg void OnKillFocusEdit();
然后在对话框类实现地消息映射描述中添加
ON_EN_KILLFOCUS(IDC_EDIT_CREATEID,&CFourArithOperDlg::OnKillFocusEdit)
处理函数:
void CFourArithOperDlg::OnKillFocusEdit()
{
if (haveeditcreate == true)
{
distroyEdit(&m_expression,&m_Edit,e_Item,e_SubItem);
haveeditcreate = false;
}
}
现在,基本完成了对话框的第二列可以编辑的功能了,效果图:

通过这个可编辑列表框的实现教程,熟悉了在VS中创建简单的MFC应用程序的过程。
MFC List Control 控件添加单元格编辑,实现可编辑重写的更多相关文章
- Dev控件GridView单元格绑定控件
Dev控件GridView单元格绑定控件 //文本按钮 RepositoryItemButtonEdit btnFields = new RepositoryItemButtonEdit();//创建 ...
- C++ MFC Tab Control控件的详细使用
1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置I ...
- C++ 关于MFC List Control 控件的使用事项 原创
1\在开发项目时,使用到了 listcontrol 控件,就一些问题,做一下备注,以备以后使用 (1) 给list项目 删除所有的项目 DeleteAllItems(); (2) 给list项目 ...
- mfc Picture Control 控件属性
知识点: Picture Control 控件属性 CStatic类 图片控件 图片控件使用 一.图片控件属性 Picture Control 属性: Type:Frame //框架 Type:Etc ...
- MFC中给控件添加变量,DoDataExchange中
DoDataExchange函数其实是一项数据动态绑定技术.比如你在写动态按钮过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的.你要添加新的变量就要用到DoDataExchan ...
- 【转】C#控件——DataGridView单元格文本自动换行
源地址:https://www.cnblogs.com/wangshenhe/archive/2012/07/25/2608324.html DataGridView是.NET开发中常用的控件,在开发 ...
- MFC 使用MFC EditBrowse Control控件选择文件或者文件夹
从工具箱中拖拽一个MFC EditBrowse Control到窗体中, 通过设置“Browse Mode”属性指定“文件浏览”还是“文件夹浏览” 可以通过添加对象的方式将其与一个CString se ...
- mfc 动态为控件添加事件2
重载窗口过程 为动态控件绑定事件 一.重载窗口过程处理函数 CWnd::WindowProc virtual LRESULT WindowProc( UINT message, WPARAM wPar ...
- mfc 动态为控件添加事件1
知识点: 认识窗口过程 GetWindowLong SetWindowLong 为动态控件绑定事件 一.获取窗口过程 二.设置新窗口过程 .书写一个新窗口过程函数 窗口过程格式 LRESULT CAL ...
随机推荐
- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program
开启tomcat时出现以上错误 // 进入root帐户 在普通用户也可以 sudo -s //用编辑器打开.bashrc文件 gedit .bashrc 在普通用户下注意加上sudo //在最后一行添 ...
- Unity基于响应式编程(Reactive programming)入门
系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...
- 决策树Decision Tree 及实现
Decision Tree 及实现 标签: 决策树熵信息增益分类有监督 2014-03-17 12:12 15010人阅读 评论(41) 收藏 举报 分类: Data Mining(25) Pyt ...
- Android shell命令查询ip,网关,DNS
查看所有网络信息 C:\>adb shell root@android:/ # netcfg netcfg ip6tnl0 DOWN 0.0.0.0/0 0x00000080 00:00:00: ...
- Cutterman 切图神器,虽然还没用过,先 mark 一下好了
在官网上找了半天也没发现下载链接,注册账号用无法激活,还是等等再试吧.
- 最近在学习bootstrap的时候用bootstrap的视频教程2.0的引用bootstrap3.0突然发现很多不同,总结了一下
bootstrap 2.3版与3.0版重要类的改变对比 Bootstrap 2.x Bootstrap 3.0 .container-fluid .container .row-fluid .row ...
- Android生成一维码
BitmapUtil.java里面添加个方法 /** * 用于将给定的内容生成成一维码 注:目前生成内容为中文的话将直接报错,要修改底层jar包的内容 * * @param content 将要生成一 ...
- Python基础第二篇
一.三元运算 if True: name='a' else: name='b' #上面的代码用三元运算表示: name="a" if True else "b" ...
- 搭建自己本地yum源
1.挂载系统光盘(注:medi下的cdrom是我自己创建的,可以挂载在任意目录) [root@liutao ~]# mount /dev/cdrom /media/cdrom/ 2.修改yum配置文件 ...
- Uva 10537 过路费
题目链接:http://vjudge.net/contest/143062#problem/C 题意: 给定一个无向图,大写字母是城市,小写字母是村庄,经过城市交过路费为当前货物的%5,路过村庄固定交 ...