MFC可编辑CListCtrl

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

复制代码




#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);
    afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
    // 大气象 2012-11-16 
public:
    CEditListCtrl(void);
    ~CEditListCtrl(void);
};



#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)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CEditListCtrl::OnNMCustomdraw)
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;
}
void CEditListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast( pNMHDR );
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    *pResult = 0;

    if( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
    {
        *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
    {
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
    {
        if ( pLVCD->nmcd.dwItemSpec==2 && pLVCD->iSubItem==1)
        {

            CString strText=GetItemText(pLVCD->nmcd.dwItemSpec,pLVCD->iSubItem);
            if (strText==_T(""))
            {
                *pResult = CDRF_DODEFAULT;
                return;
            }
            pLVCD->clrText = pColor;
             pLVCD->clrTextBk = pColor;
        }

        *pResult = CDRF_DODEFAULT;
    }
}

// 大气象 2012-11-16 
CEditListCtrl::CEditListCtrl(void)
{
}
CEditListCtrl::~CEditListCtrl(void)
{
}
复制代码
复制代码




#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);
};




#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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值