MFC可编辑的ListCtrl
近期由于项目的要求,需要一个可以编辑的列表控件,由于MFC提供的列表控件只支持第一行可编辑,无法满足项目需求,故只能自己动手重写一个列表控件。重写列表控件的思想为:当点击列表的某行某列时,在此处创建一个文本框。废话不多说,切入正题。
首先,你需要从CListCtrl继承一个类,名字自己取,这里我取名为CMyListCtrl。其次,从CEdit继承一个类,取名为CMyEdit。
CMyEdit类的代码如下:
CMyEdit.h文件
#pragma once
#include "afxwin.h"
#define WM_USER_EDIT_END (WM_USER+1000)//编辑文本框时给列表发送的消息
class CMyEdit :
public CEdit
{
public:
CMyEdit(void);
~CMyEdit(void);
virtual BOOL PreTranslateMessage(MSG* pMsg);//消息重载函数
afx_msg void OnChange();//文本框的值改变消息
protected:
DECLARE_MESSAGE_MAP()
};
CMyEdit.CPP文件
#include "StdAfx.h"
#include "MyEdit.h"
CMyEdit::CMyEdit(void)
{
}
CMyEdit::~CMyEdit(void)
{
}
BEGIN_MESSAGE_MAP(CMyEdit,CEdit)
ON_CONTROL_REFLECT(EN_CHANGE, OnChange)//这里为消息反射
END_MESSAGE_MAP()
BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
{
return CEdit::PreTranslateMessage(pMsg);
}
}
void CMyEdit::OnChange()
{
GetParent()->SendMessage(WM_USER_EDIT_END, WPARAM(m_hWnd), (LPARAM)(m_hWnd));//向列表控件发送消息
}
CMyListCtrl类的代码如下:
CMyListCtrl.h文件
#pragma once
#include "afxcmn.h"
#include "MyEdit.h"
class CMyListCtrl :public CListCtrl
{
DECLARE_DYNAMIC(CMyListCtrl)
public:
CMyListCtrl(void);
~CMyListCtrl(void);
protected:
DECLARE_MESSAGE_MAP()
public:
//afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg LRESULT OnEditEnd(WPARAM wParam,LPARAM lParam = FALSE);//从CMyEdit类接收来的消息
virtual BOOL PreTranslateMessage(MSG* pMsg);//消息重载
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);//垂直滚动条消息
afx_msg void OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);//水平滚动条消息
afx_msg void OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult);//单击列表控件
public:
void ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl);//显示文本框
CMyEdit m_Edit;
int nItem,nSubItem;//表示行号和列号
};
CMyListCtrl.CPP文件
#include "StdAfx.h"
#include "MyListCtrl.h"
//#define WM_USER_EDIT_END WM_USER+1000
IMPLEMENT_DYNAMIC(CMyListCtrl, CListCtrl)
CMyListCtrl::CMyListCtrl(void)
{
}
CMyListCtrl::~CMyListCtrl(void)
{
}
BEGIN_MESSAGE_MAP(CMyListCtrl,CListCtrl)
//ON_WM_LBUTTONDOWN()
ON_WM_VSCROLL()//水平滚动条消息
ON_WM_HSCROLL()//垂直滚动条消息
ON_MESSAGE(WM_USER_EDIT_END,OnEditEnd)//从CMyEdit类接收来的消息
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW,OnNMCustomdrawList)//重绘列表
ON_NOTIFY_REFLECT(NM_CLICK, OnNMClickList)//单击列表控件
END_MESSAGE_MAP()
BOOL CMyListCtrl::PreTranslateMessage(MSG* pMsg)
{
return CListCtrl::PreTranslateMessage(pMsg);
}
void CMyListCtrl::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
if (m_Edit.m_hWnd != NULL)
{
m_Edit.DestroyWindow();
}
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
Invalidate(FALSE);
}
void CMyListCtrl::OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
if (m_Edit.m_hWnd != NULL)
{
m_Edit.DestroyWindow();
}
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
Invalidate(FALSE);
}
void CMyListCtrl::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
CRect rcCtrl;
nItem = CListCtrl::SubItemHitTest(&lvinfo);//得到单击的点行号
if (nItem == -1)
{
return;
}
nSubItem = lvinfo.iSubItem;//得到列号
CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl);//得到所在区域
ShowEdit(TRUE,nItem,nSubItem,rcCtrl);
}
void CMyListCtrl::ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl)
{
if (m_Edit.m_hWnd == NULL)
{
m_Edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,0);
m_Edit.ShowWindow(SW_HIDE);
CFont tpFont;
tpFont.CreateStockObject(DEFAULT_GUI_FONT);
m_Edit.SetFont(&tpFont);
tpFont.DeleteObject();
}
if (bShow == TRUE)
{
CString strItem = CListCtrl::GetItemText(nItem,nSubItem);
m_Edit.MoveWindow(&rcCtrl);
m_Edit.ShowWindow(SW_SHOW);
m_Edit.SetWindowText(strItem);
m_Edit.SetFocus();
m_Edit.SetSel(-1);
}
else
{
m_Edit.ShowWindow(SW_HIDE);
}
}
PS:单击列表控件本应该用afx_msg void OnLButtonDown(UINT nFlags, CPoint point);这里由于项目需要我用的是afx_msg void OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult);有需要的可自行修改。后续会有通过快捷键来编辑列表以及列表内部项的拖动等。第一次写博客,不足之处望见谅,也希望各位博友一起改进!
MFC可编辑的ListCtrl的更多相关文章
- MFC控件:listctrl使用方法总结
以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 “ListView_”开头的一些宏.如 ListView_InsertCol ...
- MFC可编辑ListBox控件CEditableListBox
左击选中单元格,右击进入编辑状态. MFC自定义控件的添加方法C#自定义控件编译后就自动出现在工具箱里.MFC的自定义控件需要先拖个基类到对话框上,然后添加一个控件变量.再修改源代码中的控件名为扩展控 ...
- MFC:编辑区 Edit 的属性及使用
Edit Control 编辑控件是 MFC 中使用较多的控件之一 1. Edit 的属性 Acccept Files -> True 控件接受拖放文件 Multiline -> True ...
- MFC图形编辑界面工具
一.背景 喔,五天的实训终于结束了,学校安排的这次实训课名称叫高级程序设计实训,但在我看来,主要是学习了Visual C++ .NET所提供的MFC(Microsoft Foundation Clas ...
- MFC 可编辑文本框,MFC控件关联变量总结
Edit Control控件,默认状态下,按回车会调用OnOK()关闭窗体.解决此bug可以,类视图中单击CMFCApplication3Dlg,下方重写OnOK(),注释掉其中的代码即可. Edit ...
- MFC中将编辑框文本转换成整数,从而实现两个整数相加。
在头文件中,定义三个控件变量,如m_data1,m_data2,m_sum; void Cuse_demo_dllDlg::OnBnClickedButton1(){ CString data1; C ...
- MFC中 编辑框输入换行功能
首先修改编辑框的属性: Multiline 设为true , Auto HScroll 设为true , Auto VScroll 设为 true . 然后响应PreTranslateMessage( ...
- MFC 中编辑框数字限制范围
http://www.cnblogs.com/ziwuge/archive/2011/11/15/2249541.html void CSAAlt::OnEnChangeSlocp()//样本盘号输入 ...
- mfc 可编辑 list control
维护到一个古老的gm工具的时候 需要这个功能 在网上找到一份很好用的代码 贴到这里 再次感谢那位同僚 #pragma once //#include "OrangeMessage.h&quo ...
随机推荐
- attribute section的用法
1. gcc的__attribute__编译属性 要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性,__attribute__主要用于改变所声明或 ...
- cout internal
cout internal */--> pre { background-color: #2f4f4f;line-height: 1.6; FONT: 10.5pt Consola," ...
- Jsp_demo:自定义标签
Jsp自定义标签: 1.继承SimpleTagSupport,重写doTag(). 2.在WEB-INF/ 下配置**.tld文件 3.Jsp页面引入自定义标签:<%@ taglib uri=& ...
- 初识chromium thread的实现
接触chromium已有一段时间,写点东西学习一下吧. 首先说一下用法,如何利用chromium封装好的thread类来开一个线程.在base里有一个封装该类的头文件thread.h,include它 ...
- XSLT教程 比较全的 -摘自网络
XSLT教程 XML文档树 1) XML可以转化文档树 2) XSLT对XML的转化过程 内建模板规则 根 调用<xsl:apply-templates>处理根节点的儿子.处理时,使用调用 ...
- 5 个在 Linux 中管理文件类型和系统时间的有用命令
对于想学习 Linux 的初学者来说要适应使用命令行或者终端可能非常困难.由于终端比图形用户界面程序更能帮助用户控制 Linux 系统,我们必须习惯在终端中运行命令.因此为了有效记忆 Linux 不同 ...
- Mysql Binlog 三种格式介绍及分析
一.Mysql Binlog格式介绍 Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...
- WEB DYNPRO SAP HELP
http://help.sap.com/saphelp_nw70ehp1/helpdata/EN/43/70d83e8cb23d67e10000000a114084/content.htm
- NPOI组件集锦
关于NPOI不错的介绍:http://www.cnblogs.com/restran/p/3889479.html http://www.cnblogs.com/Irving/archive/2012 ...
- 【转】G40-70、G50-70联想小新笔记本SR1000随机Linux改Windows 7系统操作指导
http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20140505150749705.html 适用范围:G40-70,G50-70联想小新笔 ...