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 ...
随机推荐
- 通过SSIS监控远程服务器Windows服务并发送邮件报警!
利用SSIS不仅可以做BI项目的ETL,而且还可以做一些系统监控和维护工作,由于之前供应商写的Windows服务是读取ESB的消息进行处理,且通过OA流程与访客系统进行了集成,无论是ESB出现状况,还 ...
- grunt///////////////////z
1. 前言 替代grunt的其他工具,例如gulp.Gulp未来有可能替代grunt,现在市场占有率不如grunt. 本文讲解grunt入门,以及讲解grunt最常用的几个插件的使用.我录制的视 ...
- ajax异步处理时,如何在JS中获取从Servlet或者Action中session,request
ssh项目中,我需要登陆某个页面(如a.jsp),通过onblur()鼠标失去焦点后来触发js函数(函数是ajax请求)请求到相应的action,处理完成后将数据存放到session对象里面,然后在a ...
- winform下的智能提示框
winform下的智能提示框 最近在搞winform的程序,接触到有些可能以后还会用到的功能,所以写到博客园里去,第一可以加深自己的印象,第二可以在以后再遇到同样问题的时候忘记了可以马上回来看看,第三 ...
- Web应用程序项目以配置使用IIS。未找到Web服务器
解决办法 右键编辑该Web项目的csproj文件 把UserIIS改为False.或者在IIS服务器里面配置一个IISUrl里面的地址 如图
- JAVA设计模式——单例模式
单例模式的定义: Ensure a class has only one instance, and provide a global point of access to it.( 确保某一个类只有 ...
- 【转】VS2010中 C++创建DLL图解
转载地址:http://blog.csdn.net/g710710/article/details/7255744 一.DLL的创建 创建项目: Win32->Win32项目,名称:MyDLL ...
- noi 666 放苹果
题目链接:http://noi.openjudge.cn/ch0206/666/ 和ural 1114题意类似,但是有顺序,5,1,1和1,5,1是同一种序列.不能直接枚举 d(i,j) 前 i 个盘 ...
- linux dynamic debug 官方教程
下载内核后,文档在:Documentation/dynamic-debug-howto.txt 中文版本:http://www.oschina.net/translate/dynamic-debug- ...
- Dialog , ProgressDialog , PopWindow 区别
本质区别: Dialog:非阻塞对话框,弹出对话框时时,后台还可以做事情,点击背景时,对话框消失 ProgressDialog:带有圆形进度或者条形进度的对话框,一般结合handler使用.任务完成后 ...