近期由于项目的要求,需要一个可以编辑的列表控件,由于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的更多相关文章

  1. MFC控件:listctrl使用方法总结

    以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 “ListView_”开头的一些宏.如 ListView_InsertCol ...

  2. MFC可编辑ListBox控件CEditableListBox

    左击选中单元格,右击进入编辑状态. MFC自定义控件的添加方法C#自定义控件编译后就自动出现在工具箱里.MFC的自定义控件需要先拖个基类到对话框上,然后添加一个控件变量.再修改源代码中的控件名为扩展控 ...

  3. MFC:编辑区 Edit 的属性及使用

    Edit Control 编辑控件是 MFC 中使用较多的控件之一 1. Edit 的属性 Acccept Files -> True 控件接受拖放文件 Multiline -> True ...

  4. MFC图形编辑界面工具

    一.背景 喔,五天的实训终于结束了,学校安排的这次实训课名称叫高级程序设计实训,但在我看来,主要是学习了Visual C++ .NET所提供的MFC(Microsoft Foundation Clas ...

  5. MFC 可编辑文本框,MFC控件关联变量总结

    Edit Control控件,默认状态下,按回车会调用OnOK()关闭窗体.解决此bug可以,类视图中单击CMFCApplication3Dlg,下方重写OnOK(),注释掉其中的代码即可. Edit ...

  6. MFC中将编辑框文本转换成整数,从而实现两个整数相加。

    在头文件中,定义三个控件变量,如m_data1,m_data2,m_sum; void Cuse_demo_dllDlg::OnBnClickedButton1(){ CString data1; C ...

  7. MFC中 编辑框输入换行功能

    首先修改编辑框的属性: Multiline 设为true , Auto HScroll 设为true , Auto VScroll 设为 true . 然后响应PreTranslateMessage( ...

  8. MFC 中编辑框数字限制范围

    http://www.cnblogs.com/ziwuge/archive/2011/11/15/2249541.html void CSAAlt::OnEnChangeSlocp()//样本盘号输入 ...

  9. mfc 可编辑 list control

    维护到一个古老的gm工具的时候 需要这个功能 在网上找到一份很好用的代码 贴到这里 再次感谢那位同僚 #pragma once //#include "OrangeMessage.h&quo ...

随机推荐

  1. HDOJ/HDU 1015 Safecracker(深搜)

    Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...

  2. jQuery技术内幕预览版.pdf1

    第一章 总体构架 jQuery模块可以分为3部分:入口模块.底层支持模块和功能模块 浏览器功能测试模块提供了针对不同浏览器功能和bug的测试结果,其它模块基于测试结果解决浏览器之间的兼容性问题 回调函 ...

  3. centos 系统程序包安装记录

    -添加sudoer su - vi /etc/sudoers 在root ALL=(ALL) ALL 下添加: pete ALL=(ALL) ALL -安装拼音: sudo yum install & ...

  4. angular js 表单验证

    <!doctype html> <html ng-app="myapp"> <head> <meta charset="UTF- ...

  5. git 命令归纳

    git 新手一枚,随用随更新 git clone git@example.com:project-name.git 克隆 git branch [-a -r] 查看分支[所有 远端] git pull ...

  6. xcode6下使用autolayout+sizeclass实践

    历史车轮滚滚向前,将autolayout配合sizeclass做布局的方式推上了主流,虽然有点晚,但最终还是进行了一次完整的实践,特此记录一下: 因为网上已经有很多博客介绍了autolayout配合s ...

  7. BTrace: DTrace for Java2

    BTrace: DTrace for Java… ish 时间 2012-04-24 16:17:55  dtrace.org 原文  http://dtrace.org/blogs/ahl/2012 ...

  8. BTrace: DTrace for Java

    BTrace: DTrace for Java… ish DTrace first peered into Java in early 2005 thanks to an early prototyp ...

  9. careercup-数组和字符串1.1

    1.1 实现一个算法,确定一个字符串的所有字符是否全部不同.假设不允许使用额外的数据结构,又该如何处理? C++实现: #include<iostream> #include<str ...

  10. Sending e-mail with Spring MVC---reference

    reference from:http://www.codejava.net/frameworks/spring/sending-e-mail-with-spring-mvc Table of con ...