• 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
  • 相关阅读:
    编译原理-词法分析01-扫描程序
    编译原理-概论-02
    编译原理-概论-01
    web api :Action Results in Web API 2
    git 学习笔记7--branch
    git 学习笔记6--remote & log
    杭电acm 1230 火星a+b(进制)
    杭电acm 1214 圆桌会议(冒泡排序)
    杭电acm 1210 Eddy's 洗牌问题
    杭电acm 1207 汉诺塔II
  • 原文地址:https://www.cnblogs.com/greatverve/p/CEditListCtrl.html
Copyright © 2020-2023  润新知