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
posted @ 2012-11-18 20:33  大气象  阅读(10157)  评论(9编辑  收藏  举报
http://www.tianqiweiqi.com