近期由于项目的要求,需要一个可以编辑的列表控件,由于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. [MarsZ]Unity3d游戏开发之Unity3d全策划配置新手指引

    Unity3d全策划配置新手指引 前言... 2 版本... 2 作者... 2 功能... 2 类型... 2 触发类型... 2 步骤类型... 3 实现... 4 简要... 4 策划方面... ...

  2. 进程与线程(7) 进程间通信之信号量 (java os)

    花3分钟浏览一下: http://blog.csdn.net/liu765023051/article/details/8067601 1.生产者,消费者的列子. 2.互斥和同步到底什么东西? 互斥是 ...

  3. hdoj 3336 Count the string【kmp算法求前缀在原字符串中出现总次数】

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. iOS开发笔记之TableView优化

    TableView相信只要是做iOS开发的就不会陌生,目前大多数iOS的app都是采用TabBar+NavigationBar+TableViewController这一主流框架, 既然用的这么频繁, ...

  5. 深入理解Objective-C:优化你的代码

    开篇 只要用到Objective-C,我们每天都会跟方法调用打交道.我们都知道Objective-C的方法决议是动态的,但是在底层一个方法究竟是怎么找到的,方法缓存又是怎么运作的却鲜为人知. 本文主要 ...

  6. Android解析qq聊天记录表情

    偶然在一个需求中需要解析qq聊天记录表情,表情的格式是以/开始,比如:你好啊?/微笑,在网上找了半天,也没能找到一个比较合适的,所以准备自己实现一下,首先要将表情图片和表情字符对上号,我想了几种解决方 ...

  7. rails + mongoid 使用

    1. 测试环境 2. 创建工程 rails new mongoid_app --skip-active-record --skip-test-unit --skip-bundle 3. 修改gemfi ...

  8. 标准库function类型的使用

    14.44编写一个简单的桌面计算器使其能处理二元运算. #include<iostream> #include<map> #include<functional> ...

  9. PureMVC(JS版)源码解析(二):Notification类

    上篇博客,我们已经就PureMVC的设计模式进行的分析,这篇博文主要分析Notification(消息)类的实现. 通过Notification的构造函数可以看出,PureMVC中的Notificat ...

  10. FAQs: 我们可以在那里来为我的没有提升管理权限的应用程序存储用户数据?

    如果你正在写一个不需要管理员权限的应用程序,如写一个业务线应用(Line of Business,LOB),用户应用程序如游戏,你总是要把应用程序的数据写到一个标准用可以访问的目录.下面列出一些所推荐 ...