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 ...
随机推荐
- vss搭建于操作
1.下载的vvs2005,下载后先安装在服务器上,反正就是下一步下一步就对了 安装完成后,打开miscrosoft visual sourcesafe,---create connection da ...
- java NIO 资料总结
1.http://developer.51cto.com/art/201204/328340.htm 2.http://ifeve.com/file-channel/并发编程网系列 3 http:// ...
- Yii框架常见问题汇总
然用过Yii做了一个小项目了,但是过程中间解决的问题没有随手记下来,导致新项目开始后,以前碰到的问题还得在查一遍,干脆就记下来,以便不时之需. 有新的会随时更新. 1.如何显示ActiveRecord ...
- mongodb在window下和linux下的部署 和 安装可视化工具
Windows安装 安装Mongo数据库: 在发布本文的时间官方提供的最新版本是:2.4.0 ,如果不做特殊声明,本教程所用的版本将会是这个版本. 第一步:下载安装包:http://www.mo ...
- Oracle ROWNUM用法和分页查询总结(转)
[转载] Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. Oracle分页查询格式(一):http://yangtingkun.itpub.net/post/468/100278 ...
- window系统上用PHP获取本地物理IP代码
<?php $res=system("ipconfig -all"); $contents=trim(ob_get_clean()); $contents=str_repla ...
- innerHTML和innerText
document 对象中有innerHTML和innerText 两个属性, 这两个属性都是获取document对象的文本内容的,这两个属性间有哪些区别呢?通过几个例子来看一下. 示例1 <ht ...
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]
Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...
- ABAP ALV DEMO示例源码
关于ALV表格颜色,感觉这种需求在项目中用到的时候不是很多,但是前一段时间面试的时候,面试官问了我关于ALV单元格颜色的问题. 以前了解过一点,回答的不是很好,后来百度了一下,大概了解了一些,今天工作 ...
- [D3] 3. Scaling Basics
d3.scale.linear() <!DOCTYPE html> <html> <head lang="en"> <meta chars ...