這里涉及到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 == - 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(&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)
{
}
/* 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 == - 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(&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)
{
}
/* 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 ↑
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上好像有個源 碼。
錯誤信息:
還留下兩個問題:
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