MFC可编辑CListCtrl

简介:
这里涉及到MFC控件开发许多知识点:
消息响应,窗口绘制,根据鼠标点击位置取得行列信息。

复制代码
/* ****************************************** */
/*  EditListCtrl.h                             */
/*  可编辑ListCtrl                             */
/* ****************************************** */
#pragma once
#include  " afxcmn.h "
#include  " ListCtrlEdit.h "
//  大气象:定义一个ID
#define IDC_EDIT 1001
class CEditListCtrl : public CListCtrl
{
     //  大气象:声明动态运行时CRuntimeClass
    DECLARE_DYNAMIC(CEditListCtrl)
     //  大气象 2012-11-16 ↓
public:
     int nItem;                 //  行
     int nSubItem;             //  列
    CListCtrlEdit m_Edit;
     void ShowEdit( bool bShow,  int nItem,  int nSubItem, CRect rcCtrl);
public:
    DECLARE_MESSAGE_MAP()
    afx_msg  void OnLButtonDblClk(UINT nFlags, CPoint point);
    afx_msg LRESULT OnEditEnd(WPARAM wParam,LPARAM lParam = FALSE);
     //  大气象 2012-11-16 ↑
public:
    CEditListCtrl( void);
    ~CEditListCtrl( void);
};
/* ********************************************* */
/*  EditListCtrl.cpp                             */
/* ********************************************* */
#include  " StdAfx.h "
#include  " EditListCtrl.h "

//  大气象:确定运行时对象
IMPLEMENT_DYNAMIC(CEditListCtrl,CListCtrl)

//  大气象 2012-11-16 ↓
BEGIN_MESSAGE_MAP(CEditListCtrl, CListCtrl)
    ON_WM_LBUTTONDBLCLK()  //  可以切换到类视图,右击属性生成。
    ON_MESSAGE(WM_USER_EDIT_END,CEditListCtrl::OnEditEnd)
END_MESSAGE_MAP()

void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
     //  大气象:取得行列信息的固定方法
    LVHITTESTINFO lvhti;     //  大气象:保存ListCtrl行列信息的结构
    lvhti.pt = point;
    nItem = CListCtrl::SubItemHitTest(&lvhti);
     if (nItem == - 1return;
    nSubItem = lvhti.iSubItem;

    CRect rect;
    CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rect);

    ShowEdit(TRUE,nItem,nSubItem,rect);

    CListCtrl::OnLButtonDblClk(nFlags, point);
}
void CEditListCtrl::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,IDC_EDIT);
        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);
        rcCtrl.top -=  2;     //  大气象:防止上边框被遮挡
        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);
}
LRESULT CEditListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)
{
    CString strText;
    m_Edit.GetWindowText(strText);
    CListCtrl::SetItemText(nItem,nSubItem,strText);
    m_Edit.ShowWindow(SW_HIDE);

     return  0;
}
//  大气象 2012-11-16 ↑
CEditListCtrl::CEditListCtrl( void)
{
}
CEditListCtrl::~CEditListCtrl( void)
{
}
复制代码
复制代码
/* ****************************************** */
/*  ListCtrlEdit.h                            */
/*  编辑框子窗口                               */
/* ****************************************** */
#pragma once
#include  " afxwin.h "
//  大气象:自定义编辑结束消息
#define WM_USER_EDIT_END WM_USER + 1001
class CListCtrlEdit :  public CEdit
{
     //  大气象:声明动态运行时CRuntimeClass
    DECLARE_DYNAMIC(CListCtrlEdit)
     //  大气象 2012-11-16 ↓
public:
    DECLARE_MESSAGE_MAP()
     //  大气象:控件中消息定义,需要以CWnd为参数
    afx_msg  void OnKillFocus(CWnd* pNewWnd);
     //  大气象 2012-11-16 ↑
public:
    CListCtrlEdit( void);
    ~CListCtrlEdit( void);
};

/* ******************************************** */
/*  ListCtrlEdit.cpp                            */
/* ******************************************** */
#include  " StdAfx.h "
#include  " ListCtrlEdit.h "

//  大气象:确定运行时对象
IMPLEMENT_DYNAMIC(CListCtrlEdit,CEdit)

//  大气象 2012-11-16 ↓
BEGIN_MESSAGE_MAP(CListCtrlEdit, CEdit)
    ON_WM_KILLFOCUS() //  大气象:与对话框中控件消息映射定义不同。
END_MESSAGE_MAP()
void CListCtrlEdit::OnKillFocus(CWnd* pNewWnd)
{
    CEdit::OnKillFocus(pNewWnd);
     //  大气象:向父窗口发消息
    CWnd* pParent =  this->GetParent();
    ::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END, 0, 0);
}
//  大气象 2012-11-16 ↑
CListCtrlEdit::CListCtrlEdit( void)
{
}
CListCtrlEdit::~CListCtrlEdit( void)
{
}
复制代码
使用:
复制代码
//  大气象 2012-11-16 ↓
m_editList.InsertColumn( 0, " ID ",LVCFMT_LEFT, 50);
m_editList.InsertColumn( 1, " NAME ",LVCFMT_LEFT, 100);

m_editList.InsertItem( 0, " 001 ");
m_editList.SetItemText( 0, 1, " 大气象 ");
m_editList.InsertItem( 1, " 002 ");
m_editList.SetItemText( 1, 1, " 小气象 ");
//  大气象 2012-11-16 ↑
复制代码
新手需要源码留下邮箱。
还留下两个问题:
1.设置行高。
2.设置最后一列宽度自适应。codeproject上好像有个源
码。
错误信息:
IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds
修改如下设置:工程(Project)->属性(Properties)->
配置属性(Configuration Properties)->c/c++->
代码生成(Code Generation)->运行时库(Use run-time library)->
多线程调试DLL(/MDd)(Multithreaded DLL/Debug Multithreaded DLL)
这里我修改为/MD就好了。
url: http://greatverve.cnblogs.com/archive/2012/11/18/CEditListCtrl.html




    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/greatverve/archive/2012/11/18/CEditListCtrl.html ,如需转载请自行联系原作者
相关文章
|
机器学习/深度学习 vr&ar
【深度强化学习】值函数逼近的详解(图文解释)
【深度强化学习】值函数逼近的详解(图文解释)
334 0
|
数据采集 存储 API
在信息时代,Python爬虫用于自动化网络数据采集,提高效率。
【7月更文挑战第5天】在信息时代,Python爬虫用于自动化网络数据采集,提高效率。基本概念包括发送HTTP请求、解析HTML、存储数据及异常处理。常用库有requests(发送请求)和BeautifulSoup(解析HTML)。基本流程:导入库,发送GET请求,解析网页提取数据,存储结果,并处理异常。应用案例涉及抓取新闻、商品信息等。
317 2
|
数据采集 前端开发 JavaScript
动态与静态网站抓取的区别:从抓取策略到性能优化
本文详细介绍了动态与静态网站抓取的区别、抓取策略及性能优化技巧,并提供了相关代码示例。静态网站抓取通过简单的HTTP请求和解析库实现,而动态网站则需使用Selenium等工具模拟浏览器执行JavaScript。文章还展示了如何使用代理IP、多线程和合理的请求头设置来提高抓取效率。
530 2
动态与静态网站抓取的区别:从抓取策略到性能优化
|
监控 前端开发 搜索推荐
react 表单受控的现代实现方案
`react-form-simple`是一个轻量级的React表单库,专注于简化受控表单的开发,提供数据绑定、验证、错误处理和UI更新等功能。它通过简洁的API减少复杂性,支持第三方UI库集成,并具备高度可扩展性。核心特点包括基于Proxy的数据绑定、实时错误处理、高效的UI更新和灵活的使用方式。通过`useForm`和`render`等钩子,开发者可以快速构建表单应用,同时支持动态表单和自定义验证规则。该库旨在提高开发效率,适用于复杂表单场景,降低学习和维护成本。
466 2
react 表单受控的现代实现方案
|
存储 安全 算法
一文简单了解RPMB
一文简单了解RPMB
1458 0
|
SQL 存储 Oracle
Oracle中的Dual表:数据世界的“神奇小盒子”
【4月更文挑战第19天】Oracle的Dual表是一个虚拟表,仅含一行一列,常用于执行SQL函数、数据类型转换、测试语句和动态SQL。它是测试和便捷操作的工具,如获取当前日期(`SELECT SYSDATE FROM DUAL`)、数字转字符串(`SELECT TO_CHAR(12345) FROM DUAL`)。在存储过程、函数和触发器中也发挥重要作用,是数据库管理员的得力助手。
|
机器学习/深度学习 人工智能 搜索推荐
未来智能家居中的人工智能应用探索
在未来智能家居领域,人工智能技术将扮演越来越重要的角色。本文探讨了人工智能在智能家居中的应用现状和未来发展趋势,分析了人工智能技术对提升家居生活便利性、安全性和舒适度的潜力。通过结合物联网、大数据和机器学习等技术,未来智能家居将实现更智能化、个性化的用户体验,成为人们生活中不可或缺的一部分。
|
C++
C++常用字符串分割方法
来源:http://www.jb51.net/article/55954.htm 一、用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串。 参数说明:str为要分解的字符串,delim为分隔符字符串。 返回值:从str开头开始的一个个被分
6966 0