天天看點

MFC可編輯CListCtrl

這裡涉及到MFC控件開發許多知識點:

消息響應,視窗繪制,根據滑鼠點選位置取得行列資訊。

<a></a>

/********************************************/

/* 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);

    DECLARE_MESSAGE_MAP()

    afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);

    afx_msg LRESULT OnEditEnd(WPARAM wParam,LPARAM lParam = FALSE);

    // 大氣象 2012-11-16 ↑

    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(&amp;lvhti);

    if (nItem == -1) return;

    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(&amp;tpFont);

        tpFont.DeleteObject();

    }

    if (bShow == TRUE)

        CString strItem = CListCtrl::GetItemText(nItem,nSubItem);

        rcCtrl.top -= 2;    // 大氣象:防止上邊框被遮擋

        m_Edit.MoveWindow(&amp;rcCtrl);

        m_Edit.ShowWindow(SW_SHOW);

        m_Edit.SetWindowText(strItem);

        m_Edit.SetFocus();

        m_Edit.SetSel(-1); 

    else

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                           */

/* 編輯框子視窗                              */

#include "afxwin.h"

// 大氣象:自定義編輯結束消息

#define WM_USER_EDIT_END WM_USER + 1001

class CListCtrlEdit : public CEdit

    DECLARE_DYNAMIC(CListCtrlEdit)

    // 大氣象:控件中消息定義,需要以CWnd為參數

    afx_msg void OnKillFocus(CWnd* pNewWnd);

    CListCtrlEdit(void);

    ~CListCtrlEdit(void);

/**********************************************/

/* ListCtrlEdit.cpp                           */

IMPLEMENT_DYNAMIC(CListCtrlEdit,CEdit)

BEGIN_MESSAGE_MAP(CListCtrlEdit, CEdit)

    ON_WM_KILLFOCUS()// 大氣象:與對話框中控件消息映射定義不同。

void CListCtrlEdit::OnKillFocus(CWnd* pNewWnd)

    CEdit::OnKillFocus(pNewWnd);

    // 大氣象:向父視窗發消息

    CWnd* pParent = this-&gt;GetParent();

    ::PostMessage(pParent-&gt;GetSafeHwnd(),WM_USER_EDIT_END,0,0);

CListCtrlEdit::CListCtrlEdit(void)

CListCtrlEdit::~CListCtrlEdit(void)

使用:

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,"小氣象");

新手需要源碼留下郵箱。

還留下兩個問題:

1.設定行高。

2.設定最後一列寬度自适應。codeproject上好像有個源碼。

錯誤資訊:

IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds

修改如下設定:工程(Project)-&gt;屬性(Properties)-&gt;

配置屬性(Configuration Properties)-&gt;c/c++-&gt;

代碼生成(Code Generation)-&gt;運作時庫(Use run-time library)-&gt;

多線程調試DLL(/MDd)(Multithreaded DLL/Debug Multithreaded DLL)

這裡我修改為/MD就好了。

    本文轉自wenglabs部落格園部落格,原文連結:http://www.cnblogs.com/greatverve/archive/2012/11/18/CEditListCtrl.html,如需轉載請自行聯系原作者